blob: 285a8221f0b5ef768cbde7961e9a4abf16927dd1 [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
419 if (getToolChain().getDriver().IsCLMode()) {
420 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
421 // include is compiled into foo.h, and everything after goes into
422 // the .obj file. /Yufoo.h means that all includes prior to and including
423 // foo.h are completely skipped and replaced with a use of the pch file
424 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
425 // just mean that the last one wins.) If /Yc and /Yu are both present
426 // and refer to the same file, /Yc wins.
427 // Note that OPT__SLASH_FI gets mapped to OPT_include.
428 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
429 // cl.exe seems to support both flags with different values, but that
430 // seems strange (which flag does /Fp now refer to?), so don't implement
431 // that until someone needs that.
432 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
433 if (PchIndex != -1) {
434 if (isa<PrecompileJobAction>(JA)) {
435 // When building the pch, skip all includes after the pch.
436 assert(YcIndex != -1 && PchIndex == YcIndex);
437 if (AI >= YcIndex)
438 continue;
439 } else {
440 // When using the pch, skip all includes prior to the pch.
441 if (AI < PchIndex)
442 continue;
443 if (AI == PchIndex) {
444 A->claim();
445 CmdArgs.push_back("-include-pch");
446 CmdArgs.push_back(
447 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
448 continue;
449 }
450 }
451 }
452 } else if (A->getOption().matches(options::OPT_include)) {
453 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000454 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
455 RenderedImplicitInclude = true;
456
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000457 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000458 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000459
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000460 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000461 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000462 SmallString<128> P(A->getValue());
463 // We want the files to have a name like foo.h.pch. Add a dummy extension
464 // so that replace_extension does the right thing.
465 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000466 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000467 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000468 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000469 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000470 }
471
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000473 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000474 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000476 }
477
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000479 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000480 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000481 FoundPCH = UsePCH;
482 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000483 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000484 }
485
486 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000487 if (IsFirstImplicitInclude) {
488 A->claim();
489 if (UsePCH)
490 CmdArgs.push_back("-include-pch");
491 else
492 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000493 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000494 continue;
495 } else {
496 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000497 D.Diag(diag::warn_drv_pch_not_first_include) << P
498 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000499 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000500 }
501 }
502
503 // Not translated, render as usual.
504 A->claim();
505 A->render(Args, CmdArgs);
506 }
507
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000508 Args.AddAllArgs(CmdArgs,
509 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
510 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000511
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000512 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000513
514 // FIXME: There is a very unfortunate problem here, some troubled
515 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
516 // really support that we would have to parse and then translate
517 // those options. :(
518 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
519 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000520
521 // -I- is a deprecated GCC feature, reject it.
522 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000523 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000524
525 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
526 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000527 StringRef sysroot = C.getSysRoot();
528 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000529 if (!Args.hasArg(options::OPT_isysroot)) {
530 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000531 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 }
533 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000534
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000535 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000536 // FIXME: We should probably sink the logic for handling these from the
537 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // CPATH - included following the user specified includes (but prior to
539 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000540 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000542 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000543 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000544 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000545 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000546 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000547 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000548 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000549
Artem Belevichfa11ab52015-11-17 22:28:46 +0000550 // Optional AuxToolChain indicates that we need to include headers
551 // for more than one target. If that's the case, add include paths
552 // from AuxToolChain right after include paths of the same kind for
553 // the current target.
554
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000555 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000556 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000557 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000558 if (AuxToolChain)
559 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
560 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000561
562 // Add system include arguments.
563 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000564 if (AuxToolChain)
565 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
566
567 // Add CUDA include arguments, if needed.
568 if (types::isCuda(Inputs[0].getType()))
569 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000570}
571
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000572// FIXME: Move to target hook.
573static bool isSignedCharDefault(const llvm::Triple &Triple) {
574 switch (Triple.getArch()) {
575 default:
576 return true;
577
Tim Northover9bb857a2013-01-31 12:13:10 +0000578 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000579 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000580 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000581 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000582 case llvm::Triple::thumb:
583 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000584 if (Triple.isOSDarwin() || Triple.isOSWindows())
585 return true;
586 return false;
587
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000588 case llvm::Triple::ppc:
589 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000590 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 return true;
592 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000593
David Majnemerdcecd932015-05-23 19:23:55 +0000594 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000595 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000596 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000597 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000598 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000599 }
600}
601
Robert Lytton0e076492013-08-13 09:43:10 +0000602static bool isNoCommonDefault(const llvm::Triple &Triple) {
603 switch (Triple.getArch()) {
604 default:
605 return false;
606
607 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000608 case llvm::Triple::wasm32:
609 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000610 return true;
611 }
612}
613
Renato Goline17c5802015-07-27 23:44:42 +0000614// ARM tools start.
615
616// Get SubArch (vN).
617static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
618 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000619 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000620}
621
622// True if M-profile.
623static bool isARMMProfile(const llvm::Triple &Triple) {
624 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000625 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000626 return Profile == llvm::ARM::PK_M;
627}
628
629// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000630static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
631 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000632 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
633 CPU = A->getValue();
634 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
635 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000636 if (!FromAs)
637 return;
638
639 for (const Arg *A :
640 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
641 StringRef Value = A->getValue();
642 if (Value.startswith("-mcpu="))
643 CPU = Value.substr(6);
644 if (Value.startswith("-march="))
645 Arch = Value.substr(7);
646 }
Renato Goline17c5802015-07-27 23:44:42 +0000647}
648
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000649// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000650// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000651static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000652 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000653 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000654 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
655 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000656 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
657}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000658
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000659// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000660static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000661 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000663 unsigned FPUID = llvm::ARM::parseFPU(FPU);
664 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000665 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
666}
667
Bradley Smithbbf5a002015-11-18 16:33:48 +0000668// Decode ARM features from string like +[no]featureA+[no]featureB+...
669static bool DecodeARMFeatures(const Driver &D, StringRef text,
670 std::vector<const char *> &Features) {
671 SmallVector<StringRef, 8> Split;
672 text.split(Split, StringRef("+"), -1, false);
673
674 for (StringRef Feature : Split) {
675 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
676 if (FeatureName)
677 Features.push_back(FeatureName);
678 else
679 return false;
680 }
681 return true;
682}
683
Renato Golin7c542b42015-07-27 23:44:45 +0000684// Check if -march is valid by checking if it can be canonicalised and parsed.
685// getARMArch is used here instead of just checking the -march value in order
686// to handle -march=native correctly.
687static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000688 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000689 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000690 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000691 std::pair<StringRef, StringRef> Split = ArchName.split("+");
692
Renato Goline17c5802015-07-27 23:44:42 +0000693 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
695 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000696 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000697}
698
Renato Golin7c542b42015-07-27 23:44:45 +0000699// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
700static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
701 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000702 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000703 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000704 std::pair<StringRef, StringRef> Split = CPUName.split("+");
705
Renato Goline17c5802015-07-27 23:44:42 +0000706 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
708 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000709 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000710}
711
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000712static bool useAAPCSForMachO(const llvm::Triple &T) {
713 // The backend is hardwired to assume AAPCS for M-class processors, ensure
714 // the frontend matches that.
715 return T.getEnvironment() == llvm::Triple::EABI ||
716 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
717}
718
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000719// Select the float ABI as determined by -msoft-float, -mhard-float, and
720// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000721arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
722 const Driver &D = TC.getDriver();
723 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000724 auto SubArch = getARMSubArchVersionNumber(Triple);
725 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 if (Arg *A =
727 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
728 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000729 if (A->getOption().matches(options::OPT_msoft_float)) {
730 ABI = FloatABI::Soft;
731 } else if (A->getOption().matches(options::OPT_mhard_float)) {
732 ABI = FloatABI::Hard;
733 } else {
734 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
735 .Case("soft", FloatABI::Soft)
736 .Case("softfp", FloatABI::SoftFP)
737 .Case("hard", FloatABI::Hard)
738 .Default(FloatABI::Invalid);
739 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000740 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000742 }
743 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000744
745 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
746 // "apcs-gnu".
747 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000748 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000749 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
750 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 }
753
754 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000755 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000756 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000757 case llvm::Triple::Darwin:
758 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000759 case llvm::Triple::IOS:
760 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000763 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 break;
765 }
Tim Northover756447a2015-10-30 16:30:36 +0000766 case llvm::Triple::WatchOS:
767 ABI = FloatABI::Hard;
768 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000769
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000770 // FIXME: this is invalid for WindowsCE
771 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000772 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 break;
774
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000775 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000776 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000777 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000778 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000779 break;
780 default:
781 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000782 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000783 break;
784 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000785 break;
786
Daniel Dunbar78485922009-09-10 23:00:09 +0000787 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000788 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000789 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000790 case llvm::Triple::EABIHF:
791 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000793 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000794 case llvm::Triple::EABI:
795 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000796 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 case llvm::Triple::Android:
799 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000800 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000801 default:
802 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000803 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000804 if (Triple.getOS() != llvm::Triple::UnknownOS ||
805 !Triple.isOSBinFormatMachO())
806 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000807 break;
808 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000809 }
810 }
811
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000812 assert(ABI != FloatABI::Invalid && "must select an ABI");
813 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814}
815
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000816static void getARMTargetFeatures(const ToolChain &TC,
817 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000818 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000819 std::vector<const char *> &Features,
820 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000821 const Driver &D = TC.getDriver();
822
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000823 bool KernelOrKext =
824 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000825 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000826 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
827 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
828
Nico Weber6e0ebae2015-04-29 21:16:40 +0000829 if (!ForAS) {
830 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
831 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
832 // stripped out by the ARM target. We should probably pass this a new
833 // -target-option, which is handled by the -cc1/-cc1as invocation.
834 //
835 // FIXME2: For consistency, it would be ideal if we set up the target
836 // machine state the same when using the frontend or the assembler. We don't
837 // currently do that for the assembler, we pass the options directly to the
838 // backend and never even instantiate the frontend TargetInfo. If we did,
839 // and used its handleTargetFeatures hook, then we could ensure the
840 // assembler and the frontend behave the same.
841
842 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000843 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000844 Features.push_back("+soft-float");
845
846 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000847 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000848 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000849 } else {
850 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
851 // to the assembler correctly.
852 for (const Arg *A :
853 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
854 StringRef Value = A->getValue();
855 if (Value.startswith("-mfpu=")) {
856 WaFPU = A;
857 } else if (Value.startswith("-mcpu=")) {
858 WaCPU = A;
859 } else if (Value.startswith("-mhwdiv=")) {
860 WaHDiv = A;
861 } else if (Value.startswith("-march=")) {
862 WaArch = A;
863 }
864 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000865 }
866
Renato Golin7c542b42015-07-27 23:44:45 +0000867 // Check -march. ClangAs gives preference to -Wa,-march=.
868 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000869 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000870 if (WaArch) {
871 if (ArchArg)
872 D.Diag(clang::diag::warn_drv_unused_argument)
873 << ArchArg->getAsString(Args);
874 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000875 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000876 // FIXME: Set Arch.
877 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
878 } else if (ArchArg) {
879 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000880 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000881 }
882
Renato Golin7c542b42015-07-27 23:44:45 +0000883 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
884 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000885 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000886 if (WaCPU) {
887 if (CPUArg)
888 D.Diag(clang::diag::warn_drv_unused_argument)
889 << CPUArg->getAsString(Args);
890 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000891 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000892 } else if (CPUArg) {
893 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000895 }
John Brawna95c1a82015-05-08 12:52:18 +0000896
Renato Golin23459c62015-07-30 16:40:17 +0000897 // Add CPU features for generic CPUs
898 if (CPUName == "native") {
899 llvm::StringMap<bool> HostFeatures;
900 if (llvm::sys::getHostCPUFeatures(HostFeatures))
901 for (auto &F : HostFeatures)
902 Features.push_back(
903 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
904 }
905
906 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
907 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
908 if (WaFPU) {
909 if (FPUArg)
910 D.Diag(clang::diag::warn_drv_unused_argument)
911 << FPUArg->getAsString(Args);
912 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
913 Features);
914 } else if (FPUArg) {
915 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
916 }
917
918 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
919 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
920 if (WaHDiv) {
921 if (HDivArg)
922 D.Diag(clang::diag::warn_drv_unused_argument)
923 << HDivArg->getAsString(Args);
924 getARMHWDivFeatures(D, WaHDiv, Args,
925 StringRef(WaHDiv->getValue()).substr(8), Features);
926 } else if (HDivArg)
927 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
928
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000929 // Setting -msoft-float effectively disables NEON because of the GCC
930 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000931 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000933 // Also need to explicitly disable features which imply NEON.
934 Features.push_back("-crypto");
935 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000936
Eric Christopher269c2a22015-04-04 03:34:43 +0000937 // En/disable crc code generation.
938 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000939 if (A->getOption().matches(options::OPT_mcrc))
940 Features.push_back("+crc");
941 else
942 Features.push_back("-crc");
943 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000944
Akira Hatanakac2694822015-07-07 08:28:42 +0000945 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
946 // neither options are specified, see if we are compiling for kernel/kext and
947 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000948 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
949 options::OPT_mno_long_calls)) {
950 if (A->getOption().matches(options::OPT_mlong_calls))
951 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000952 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
953 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000954 Features.push_back("+long-calls");
955 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000956
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000957 // Kernel code has more strict alignment requirements.
958 if (KernelOrKext)
959 Features.push_back("+strict-align");
960 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
961 options::OPT_munaligned_access)) {
962 if (A->getOption().matches(options::OPT_munaligned_access)) {
963 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
964 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
965 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000966 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
967 // access either.
968 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
969 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000970 } else
971 Features.push_back("+strict-align");
972 } else {
973 // Assume pre-ARMv6 doesn't support unaligned accesses.
974 //
975 // ARMv6 may or may not support unaligned accesses depending on the
976 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
977 // Darwin and NetBSD targets support unaligned accesses, and others don't.
978 //
979 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
980 // which raises an alignment fault on unaligned accesses. Linux
981 // defaults this bit to 0 and handles it as a system-wide (not
982 // per-process) setting. It is therefore safe to assume that ARMv7+
983 // Linux targets support unaligned accesses. The same goes for NaCl.
984 //
985 // The above behavior is consistent with GCC.
986 int VersionNum = getARMSubArchVersionNumber(Triple);
987 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000988 if (VersionNum < 6 ||
989 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000990 Features.push_back("+strict-align");
991 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
992 if (VersionNum < 7)
993 Features.push_back("+strict-align");
994 } else
995 Features.push_back("+strict-align");
996 }
997
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000998 // llvm does not support reserving registers in general. There is support
999 // for reserving r9 on ARM though (defined as a platform-specific register
1000 // in ARM EABI).
1001 if (Args.hasArg(options::OPT_ffixed_r9))
1002 Features.push_back("+reserve-r9");
1003
Dimitry Andric08107392016-01-06 07:42:18 +00001004 // The kext linker doesn't know how to deal with movw/movt.
1005 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001006 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001007}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001008
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001009void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1010 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001012 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001013 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001014 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001015 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001016 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001017 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001018 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001019 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001020 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001021 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001022 } else {
1023 ABIName = "apcs-gnu";
1024 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001025 } else if (Triple.isOSWindows()) {
1026 // FIXME: this is invalid for WindowsCE
1027 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001028 } else {
1029 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001030 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001031 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001032 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001033 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001034 ABIName = "aapcs-linux";
1035 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001036 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001037 case llvm::Triple::EABI:
1038 ABIName = "aapcs";
1039 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001040 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001041 if (Triple.getOS() == llvm::Triple::NetBSD)
1042 ABIName = "apcs-gnu";
1043 else
1044 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001045 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001046 }
1047 }
1048 CmdArgs.push_back("-target-abi");
1049 CmdArgs.push_back(ABIName);
1050
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001051 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001052 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001053 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001054 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001055 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001056 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001057 CmdArgs.push_back("-mfloat-abi");
1058 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001059 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001060 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001061 CmdArgs.push_back("-mfloat-abi");
1062 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 } else {
1064 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001065 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001066 CmdArgs.push_back("-mfloat-abi");
1067 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001069
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001070 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-arm-global-merge=false");
1076 else
1077 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001078 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001079
Bob Wilson9c8af452013-04-11 18:53:25 +00001080 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001081 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001082 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001083}
Renato Goline17c5802015-07-27 23:44:42 +00001084// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001085
Tim Northover573cbee2014-05-24 12:52:07 +00001086/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1087/// targeting.
1088static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001089 Arg *A;
1090 std::string CPU;
1091 // If we have -mtune or -mcpu, use that.
1092 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001093 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001094 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001095 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001096 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001097 }
1098
Kevin Qin110db6f2014-07-18 07:03:22 +00001099 // Handle CPU name is 'native'.
1100 if (CPU == "native")
1101 return llvm::sys::getHostCPUName();
1102 else if (CPU.size())
1103 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001104
James Molloy9b1586b2014-04-17 12:51:17 +00001105 // Make sure we pick "cyclone" if -arch is used.
1106 // FIXME: Should this be picked by checking the target triple instead?
1107 if (Args.getLastArg(options::OPT_arch))
1108 return "cyclone";
1109
1110 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001111}
1112
Tim Northover573cbee2014-05-24 12:52:07 +00001113void Clang::AddAArch64TargetArgs(const ArgList &Args,
1114 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001115 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1116 llvm::Triple Triple(TripleStr);
1117
1118 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1119 Args.hasArg(options::OPT_mkernel) ||
1120 Args.hasArg(options::OPT_fapple_kext))
1121 CmdArgs.push_back("-disable-red-zone");
1122
1123 if (!Args.hasFlag(options::OPT_mimplicit_float,
1124 options::OPT_mno_implicit_float, true))
1125 CmdArgs.push_back("-no-implicit-float");
1126
Craig Topper92fc2df2014-05-17 16:56:41 +00001127 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001128 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1129 ABIName = A->getValue();
1130 else if (Triple.isOSDarwin())
1131 ABIName = "darwinpcs";
1132 else
1133 ABIName = "aapcs";
1134
1135 CmdArgs.push_back("-target-abi");
1136 CmdArgs.push_back(ABIName);
1137
Bradley Smith9ff64332014-10-13 10:16:06 +00001138 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1139 options::OPT_mno_fix_cortex_a53_835769)) {
1140 CmdArgs.push_back("-backend-option");
1141 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1142 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1143 else
1144 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001145 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001146 // Enabled A53 errata (835769) workaround by default on android
1147 CmdArgs.push_back("-backend-option");
1148 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001149 }
1150
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001151 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1153 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001154 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001156 CmdArgs.push_back("-aarch64-global-merge=false");
1157 else
1158 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001159 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001160}
1161
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001162// Get CPU and ABI names. They are not independent
1163// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001164void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1165 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001166 const char *DefMips32CPU = "mips32r2";
1167 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001168
Daniel Sanders2bf13662014-07-10 14:40:57 +00001169 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1170 // default for mips64(el)?-img-linux-gnu.
1171 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1172 Triple.getEnvironment() == llvm::Triple::GNU) {
1173 DefMips32CPU = "mips32r6";
1174 DefMips64CPU = "mips64r6";
1175 }
Renato Golin7c542b42015-07-27 23:44:45 +00001176
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001177 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001178 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001179 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001180
Brad Smithba26f582015-01-06 02:53:17 +00001181 // MIPS3 is the default for mips64*-unknown-openbsd.
1182 if (Triple.getOS() == llvm::Triple::OpenBSD)
1183 DefMips64CPU = "mips3";
1184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001185 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001186 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001187
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001188 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001189 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001190 // Convert a GNU style Mips ABI name to the name
1191 // accepted by LLVM Mips backend.
1192 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 .Case("32", "o32")
1194 .Case("64", "n64")
1195 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001197
1198 // Setup default CPU and ABI names.
1199 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001200 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001201 default:
1202 llvm_unreachable("Unexpected triple arch name");
1203 case llvm::Triple::mips:
1204 case llvm::Triple::mipsel:
1205 CPUName = DefMips32CPU;
1206 break;
1207 case llvm::Triple::mips64:
1208 case llvm::Triple::mips64el:
1209 CPUName = DefMips64CPU;
1210 break;
1211 }
1212 }
1213
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001214 if (ABIName.empty()) {
1215 // Deduce ABI name from the target triple.
1216 if (Triple.getArch() == llvm::Triple::mips ||
1217 Triple.getArch() == llvm::Triple::mipsel)
1218 ABIName = "o32";
1219 else
1220 ABIName = "n64";
1221 }
1222
1223 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001224 // Deduce CPU name from ABI name.
1225 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 .Cases("o32", "eabi", DefMips32CPU)
1227 .Cases("n32", "n64", DefMips64CPU)
1228 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001229 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001230
1231 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001232}
1233
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001234std::string mips::getMipsABILibSuffix(const ArgList &Args,
1235 const llvm::Triple &Triple) {
1236 StringRef CPUName, ABIName;
1237 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1238 return llvm::StringSwitch<std::string>(ABIName)
1239 .Case("o32", "")
1240 .Case("n32", "32")
1241 .Case("n64", "64");
1242}
1243
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001244// Convert ABI name to the GNU tools acceptable variant.
1245static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1246 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001247 .Case("o32", "32")
1248 .Case("n64", "64")
1249 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001250}
1251
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001252// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1253// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001254static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1255 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001256 if (Arg *A =
1257 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1258 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001259 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001260 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001261 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001263 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001264 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1265 .Case("soft", mips::FloatABI::Soft)
1266 .Case("hard", mips::FloatABI::Hard)
1267 .Default(mips::FloatABI::Invalid);
1268 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001269 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 }
1272 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001273 }
1274
1275 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001276 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001277 // Assume "hard", because it's a default value used by gcc.
1278 // When we start to recognize specific target MIPS processors,
1279 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001280 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001283 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1284 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001285}
1286
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001287static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001288 std::vector<const char *> &Features,
1289 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290 StringRef FeatureName) {
1291 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001292 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001293 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001294 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001295 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001296 }
1297}
1298
Daniel Sanders379d44b2014-07-16 11:52:23 +00001299static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1300 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001302 StringRef CPUName;
1303 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001304 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305 ABIName = getGnuCompatibleMipsABIName(ABIName);
1306
Daniel Sandersfeb61302014-08-08 15:47:17 +00001307 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1308 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001309
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1311 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001312 // FIXME: Note, this is a hack. We need to pass the selected float
1313 // mode to the MipsTargetInfoBase to define appropriate macros there.
1314 // Now it is the only method.
1315 Features.push_back("+soft-float");
1316 }
1317
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001318 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001319 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001320 if (Val == "2008") {
1321 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1322 Features.push_back("+nan2008");
1323 else {
1324 Features.push_back("-nan2008");
1325 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1326 }
1327 } else if (Val == "legacy") {
1328 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1329 Features.push_back("-nan2008");
1330 else {
1331 Features.push_back("+nan2008");
1332 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1333 }
1334 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001335 D.Diag(diag::err_drv_unsupported_option_argument)
1336 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001337 }
1338
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001339 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1340 options::OPT_mdouble_float, "single-float");
1341 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1342 "mips16");
1343 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1344 options::OPT_mno_micromips, "micromips");
1345 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1346 "dsp");
1347 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1348 "dspr2");
1349 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1350 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001351
1352 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1353 // pass -mfpxx
1354 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1355 options::OPT_mfp64)) {
1356 if (A->getOption().matches(options::OPT_mfp32))
1357 Features.push_back(Args.MakeArgString("-fp64"));
1358 else if (A->getOption().matches(options::OPT_mfpxx)) {
1359 Features.push_back(Args.MakeArgString("+fpxx"));
1360 Features.push_back(Args.MakeArgString("+nooddspreg"));
1361 } else
1362 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001363 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001364 Features.push_back(Args.MakeArgString("+fpxx"));
1365 Features.push_back(Args.MakeArgString("+nooddspreg"));
1366 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001367
Daniel Sanders28e5d392014-07-10 10:39:51 +00001368 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1369 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001370}
1371
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001372void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001373 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001374 const Driver &D = getToolChain().getDriver();
1375 StringRef CPUName;
1376 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001377 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001378 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001379
1380 CmdArgs.push_back("-target-abi");
1381 CmdArgs.push_back(ABIName.data());
1382
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001383 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1384 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001385 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001386 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001387 CmdArgs.push_back("-mfloat-abi");
1388 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001389 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001390 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001392 CmdArgs.push_back("-mfloat-abi");
1393 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001395
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001396 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1397 if (A->getOption().matches(options::OPT_mxgot)) {
1398 CmdArgs.push_back("-mllvm");
1399 CmdArgs.push_back("-mxgot");
1400 }
1401 }
1402
Simon Atanasyanc580b322013-05-11 06:33:44 +00001403 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1404 options::OPT_mno_ldc1_sdc1)) {
1405 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mno-ldc1-sdc1");
1408 }
1409 }
1410
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1412 options::OPT_mno_check_zero_division)) {
1413 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-check-zero-division");
1416 }
1417 }
1418
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001419 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001420 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001421 CmdArgs.push_back("-mllvm");
1422 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1423 A->claim();
1424 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001425}
1426
Hal Finkel8eb59282012-06-11 22:35:19 +00001427/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1428static std::string getPPCTargetCPU(const ArgList &Args) {
1429 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001430 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001431
1432 if (CPUName == "native") {
1433 std::string CPU = llvm::sys::getHostCPUName();
1434 if (!CPU.empty() && CPU != "generic")
1435 return CPU;
1436 else
1437 return "";
1438 }
1439
1440 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001441 .Case("common", "generic")
1442 .Case("440", "440")
1443 .Case("440fp", "440")
1444 .Case("450", "450")
1445 .Case("601", "601")
1446 .Case("602", "602")
1447 .Case("603", "603")
1448 .Case("603e", "603e")
1449 .Case("603ev", "603ev")
1450 .Case("604", "604")
1451 .Case("604e", "604e")
1452 .Case("620", "620")
1453 .Case("630", "pwr3")
1454 .Case("G3", "g3")
1455 .Case("7400", "7400")
1456 .Case("G4", "g4")
1457 .Case("7450", "7450")
1458 .Case("G4+", "g4+")
1459 .Case("750", "750")
1460 .Case("970", "970")
1461 .Case("G5", "g5")
1462 .Case("a2", "a2")
1463 .Case("a2q", "a2q")
1464 .Case("e500mc", "e500mc")
1465 .Case("e5500", "e5500")
1466 .Case("power3", "pwr3")
1467 .Case("power4", "pwr4")
1468 .Case("power5", "pwr5")
1469 .Case("power5x", "pwr5x")
1470 .Case("power6", "pwr6")
1471 .Case("power6x", "pwr6x")
1472 .Case("power7", "pwr7")
1473 .Case("power8", "pwr8")
1474 .Case("pwr3", "pwr3")
1475 .Case("pwr4", "pwr4")
1476 .Case("pwr5", "pwr5")
1477 .Case("pwr5x", "pwr5x")
1478 .Case("pwr6", "pwr6")
1479 .Case("pwr6x", "pwr6x")
1480 .Case("pwr7", "pwr7")
1481 .Case("pwr8", "pwr8")
1482 .Case("powerpc", "ppc")
1483 .Case("powerpc64", "ppc64")
1484 .Case("powerpc64le", "ppc64le")
1485 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001486 }
1487
1488 return "";
1489}
1490
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001491static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1492 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001493 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001494 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001495
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001496 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1497 if (FloatABI == ppc::FloatABI::Soft &&
1498 !(Triple.getArch() == llvm::Triple::ppc64 ||
1499 Triple.getArch() == llvm::Triple::ppc64le))
1500 Features.push_back("+soft-float");
1501 else if (FloatABI == ppc::FloatABI::Soft &&
1502 (Triple.getArch() == llvm::Triple::ppc64 ||
1503 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001504 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001505 << "soft float is not supported for ppc64";
1506
Eric Christopher643bb6a2013-10-16 20:40:08 +00001507 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001508 AddTargetFeature(Args, Features, options::OPT_faltivec,
1509 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001510}
1511
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001512ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1513 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1514 if (Arg *A =
1515 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1516 options::OPT_mfloat_abi_EQ)) {
1517 if (A->getOption().matches(options::OPT_msoft_float))
1518 ABI = ppc::FloatABI::Soft;
1519 else if (A->getOption().matches(options::OPT_mhard_float))
1520 ABI = ppc::FloatABI::Hard;
1521 else {
1522 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1523 .Case("soft", ppc::FloatABI::Soft)
1524 .Case("hard", ppc::FloatABI::Hard)
1525 .Default(ppc::FloatABI::Invalid);
1526 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1527 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1528 ABI = ppc::FloatABI::Hard;
1529 }
1530 }
1531 }
1532
1533 // If unspecified, choose the default based on the platform.
1534 if (ABI == ppc::FloatABI::Invalid) {
1535 ABI = ppc::FloatABI::Hard;
1536 }
1537
1538 return ABI;
1539}
1540
Ulrich Weigand8afad612014-07-28 13:17:52 +00001541void Clang::AddPPCTargetArgs(const ArgList &Args,
1542 ArgStringList &CmdArgs) const {
1543 // Select the ABI to use.
1544 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001545 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001547 case llvm::Triple::ppc64: {
1548 // When targeting a processor that supports QPX, or if QPX is
1549 // specifically enabled, default to using the ABI that supports QPX (so
1550 // long as it is not specifically disabled).
1551 bool HasQPX = false;
1552 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1553 HasQPX = A->getValue() == StringRef("a2q");
1554 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1555 if (HasQPX) {
1556 ABIName = "elfv1-qpx";
1557 break;
1558 }
1559
Ulrich Weigand8afad612014-07-28 13:17:52 +00001560 ABIName = "elfv1";
1561 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001562 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 case llvm::Triple::ppc64le:
1564 ABIName = "elfv2";
1565 break;
1566 default:
1567 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001568 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001569
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001570 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1571 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1572 // the option if given as we don't have backend support for any targets
1573 // that don't use the altivec abi.
1574 if (StringRef(A->getValue()) != "altivec")
1575 ABIName = A->getValue();
1576
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001577 ppc::FloatABI FloatABI =
1578 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1579
1580 if (FloatABI == ppc::FloatABI::Soft) {
1581 // Floating point operations and argument passing are soft.
1582 CmdArgs.push_back("-msoft-float");
1583 CmdArgs.push_back("-mfloat-abi");
1584 CmdArgs.push_back("soft");
1585 } else {
1586 // Floating point operations and argument passing are hard.
1587 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1588 CmdArgs.push_back("-mfloat-abi");
1589 CmdArgs.push_back("hard");
1590 }
1591
Ulrich Weigand8afad612014-07-28 13:17:52 +00001592 if (ABIName) {
1593 CmdArgs.push_back("-target-abi");
1594 CmdArgs.push_back(ABIName);
1595 }
1596}
1597
1598bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1599 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1600 return A && (A->getValue() == StringRef(Value));
1601}
1602
Tom Stellard6674c702013-04-01 20:56:53 +00001603/// Get the (LLVM) name of the R600 gpu we are targeting.
1604static std::string getR600TargetGPU(const ArgList &Args) {
1605 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001606 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001607 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001608 .Cases("rv630", "rv635", "r600")
1609 .Cases("rv610", "rv620", "rs780", "rs880")
1610 .Case("rv740", "rv770")
1611 .Case("palm", "cedar")
1612 .Cases("sumo", "sumo2", "sumo")
1613 .Case("hemlock", "cypress")
1614 .Case("aruba", "cayman")
1615 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001616 }
1617 return "";
1618}
1619
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001620void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001622 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001623 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001624
James Y Knightb2406522015-06-15 20:51:24 +00001625 bool SoftFloatABI = false;
1626 if (Arg *A =
1627 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001628 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001629 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630 }
1631
James Y Knightb2406522015-06-15 20:51:24 +00001632 // Only the hard-float ABI on Sparc is standardized, and it is the
1633 // default. GCC also supports a nonstandard soft-float ABI mode, and
1634 // perhaps LLVM should implement that, too. However, since llvm
1635 // currently does not support Sparc soft-float, at all, display an
1636 // error if it's requested.
1637 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001638 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1639 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001640 }
1641}
1642
Richard Sandiford4652d892013-07-19 16:51:51 +00001643static const char *getSystemZTargetCPU(const ArgList &Args) {
1644 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1645 return A->getValue();
1646 return "z10";
1647}
1648
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001649static void getSystemZTargetFeatures(const ArgList &Args,
1650 std::vector<const char *> &Features) {
1651 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001652 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001653 if (A->getOption().matches(options::OPT_mhtm))
1654 Features.push_back("+transactional-execution");
1655 else
1656 Features.push_back("-transactional-execution");
1657 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001658 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001660 if (A->getOption().matches(options::OPT_mvx))
1661 Features.push_back("+vector");
1662 else
1663 Features.push_back("-vector");
1664 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001665}
1666
Chandler Carruth953fb082013-01-13 11:46:33 +00001667static const char *getX86TargetCPU(const ArgList &Args,
1668 const llvm::Triple &Triple) {
1669 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001670 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001671 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001672 return "core-avx2";
1673
Chandler Carruth953fb082013-01-13 11:46:33 +00001674 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001675 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001676
1677 // FIXME: Reject attempts to use -march=native unless the target matches
1678 // the host.
1679 //
1680 // FIXME: We should also incorporate the detected target features for use
1681 // with -native.
1682 std::string CPU = llvm::sys::getHostCPUName();
1683 if (!CPU.empty() && CPU != "generic")
1684 return Args.MakeArgString(CPU);
1685 }
1686
Reid Kleckner3123eff2015-06-30 16:32:04 +00001687 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1688 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1689 StringRef Arch = A->getValue();
1690 const char *CPU;
1691 if (Triple.getArch() == llvm::Triple::x86) {
1692 CPU = llvm::StringSwitch<const char *>(Arch)
1693 .Case("IA32", "i386")
1694 .Case("SSE", "pentium3")
1695 .Case("SSE2", "pentium4")
1696 .Case("AVX", "sandybridge")
1697 .Case("AVX2", "haswell")
1698 .Default(nullptr);
1699 } else {
1700 CPU = llvm::StringSwitch<const char *>(Arch)
1701 .Case("AVX", "sandybridge")
1702 .Case("AVX2", "haswell")
1703 .Default(nullptr);
1704 }
1705 if (CPU)
1706 return CPU;
1707 }
1708
Chandler Carruth953fb082013-01-13 11:46:33 +00001709 // Select the default CPU if none was given (or detection failed).
1710
1711 if (Triple.getArch() != llvm::Triple::x86_64 &&
1712 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001713 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001714
1715 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1716
1717 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001718 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001719 if (Triple.getArchName() == "x86_64h")
1720 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001721 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001722 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001723
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001724 // Set up default CPU name for PS4 compilers.
1725 if (Triple.isPS4CPU())
1726 return "btver2";
1727
Alexey Bataev286d1b92014-01-31 04:07:13 +00001728 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001729 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001730 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001731
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001732 // Everything else goes to x86-64 in 64-bit mode.
1733 if (Is64Bit)
1734 return "x86-64";
1735
1736 switch (Triple.getOS()) {
1737 case llvm::Triple::FreeBSD:
1738 case llvm::Triple::NetBSD:
1739 case llvm::Triple::OpenBSD:
1740 return "i486";
1741 case llvm::Triple::Haiku:
1742 return "i586";
1743 case llvm::Triple::Bitrig:
1744 return "i686";
1745 default:
1746 // Fallback to p4.
1747 return "pentium4";
1748 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001749}
1750
Dan Gohmanc2853072015-09-03 22:51:53 +00001751/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1752static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1753 // If we have -mcpu=, use that.
1754 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1755 StringRef CPU = A->getValue();
1756
1757#ifdef __wasm__
1758 // Handle "native" by examining the host. "native" isn't meaningful when
1759 // cross compiling, so only support this when the host is also WebAssembly.
1760 if (CPU == "native")
1761 return llvm::sys::getHostCPUName();
1762#endif
1763
1764 return CPU;
1765 }
1766
1767 return "generic";
1768}
1769
Renato Golin7c542b42015-07-27 23:44:45 +00001770static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1771 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001772 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773 default:
1774 return "";
1775
Amara Emerson703da2e2013-10-31 09:32:33 +00001776 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001777 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001778 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001779
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001780 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001781 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001782 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001783 case llvm::Triple::thumbeb: {
1784 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001785 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001786 return arm::getARMTargetCPU(MCPU, MArch, T);
1787 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 case llvm::Triple::mips:
1789 case llvm::Triple::mipsel:
1790 case llvm::Triple::mips64:
1791 case llvm::Triple::mips64el: {
1792 StringRef CPUName;
1793 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001794 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 return CPUName;
1796 }
1797
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001798 case llvm::Triple::nvptx:
1799 case llvm::Triple::nvptx64:
1800 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1801 return A->getValue();
1802 return "";
1803
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001804 case llvm::Triple::ppc:
1805 case llvm::Triple::ppc64:
1806 case llvm::Triple::ppc64le: {
1807 std::string TargetCPUName = getPPCTargetCPU(Args);
1808 // LLVM may default to generating code for the native CPU,
1809 // but, like gcc, we default to a more generic option for
1810 // each architecture. (except on Darwin)
1811 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1812 if (T.getArch() == llvm::Triple::ppc64)
1813 TargetCPUName = "ppc64";
1814 else if (T.getArch() == llvm::Triple::ppc64le)
1815 TargetCPUName = "ppc64le";
1816 else
1817 TargetCPUName = "ppc";
1818 }
1819 return TargetCPUName;
1820 }
1821
1822 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001823 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001824 case llvm::Triple::sparcv9:
1825 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001826 return A->getValue();
1827 return "";
1828
1829 case llvm::Triple::x86:
1830 case llvm::Triple::x86_64:
1831 return getX86TargetCPU(Args, T);
1832
1833 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001834 return "hexagon" +
1835 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001836
1837 case llvm::Triple::systemz:
1838 return getSystemZTargetCPU(Args);
1839
1840 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001841 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001842 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001843
1844 case llvm::Triple::wasm32:
1845 case llvm::Triple::wasm64:
1846 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001847 }
1848}
1849
Alp Tokerce365ca2013-12-02 12:43:03 +00001850static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001851 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001852 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1853 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1854 // forward.
1855 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001856 std::string Plugin =
1857 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001858 CmdArgs.push_back(Args.MakeArgString(Plugin));
1859
1860 // Try to pass driver level flags relevant to LTO code generation down to
1861 // the plugin.
1862
1863 // Handle flags for selecting CPU variants.
1864 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1865 if (!CPU.empty())
1866 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001867
James Molloyf97fdae2015-12-21 10:44:36 +00001868 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1869 StringRef OOpt;
1870 if (A->getOption().matches(options::OPT_O4) ||
1871 A->getOption().matches(options::OPT_Ofast))
1872 OOpt = "3";
1873 else if (A->getOption().matches(options::OPT_O))
1874 OOpt = A->getValue();
1875 else if (A->getOption().matches(options::OPT_O0))
1876 OOpt = "0";
1877 if (!OOpt.empty())
1878 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1879 }
1880
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001881 if (IsThinLTO)
1882 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001883
1884 // If an explicit debugger tuning argument appeared, pass it along.
1885 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1886 options::OPT_ggdbN_Group)) {
1887 if (A->getOption().matches(options::OPT_glldb))
1888 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1889 else if (A->getOption().matches(options::OPT_gsce))
1890 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1891 else
1892 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1893 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001894}
1895
Sanjay Patel2987c292015-06-11 14:53:41 +00001896/// This is a helper function for validating the optional refinement step
1897/// parameter in reciprocal argument strings. Return false if there is an error
1898/// parsing the refinement step. Otherwise, return true and set the Position
1899/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001900static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001902 const char RefinementStepToken = ':';
1903 Position = In.find(RefinementStepToken);
1904 if (Position != StringRef::npos) {
1905 StringRef Option = A.getOption().getName();
1906 StringRef RefStep = In.substr(Position + 1);
1907 // Allow exactly one numeric character for the additional refinement
1908 // step parameter. This is reasonable for all currently-supported
1909 // operations and architectures because we would expect that a larger value
1910 // of refinement steps would cause the estimate "optimization" to
1911 // under-perform the native operation. Also, if the estimate does not
1912 // converge quickly, it probably will not ever converge, so further
1913 // refinement steps will not produce a better answer.
1914 if (RefStep.size() != 1) {
1915 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1916 return false;
1917 }
1918 char RefStepChar = RefStep[0];
1919 if (RefStepChar < '0' || RefStepChar > '9') {
1920 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1921 return false;
1922 }
1923 }
1924 return true;
1925}
1926
1927/// The -mrecip flag requires processing of many optional parameters.
1928static void ParseMRecip(const Driver &D, const ArgList &Args,
1929 ArgStringList &OutStrings) {
1930 StringRef DisabledPrefixIn = "!";
1931 StringRef DisabledPrefixOut = "!";
1932 StringRef EnabledPrefixOut = "";
1933 StringRef Out = "-mrecip=";
1934
1935 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1936 if (!A)
1937 return;
1938
1939 unsigned NumOptions = A->getNumValues();
1940 if (NumOptions == 0) {
1941 // No option is the same as "all".
1942 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1943 return;
1944 }
1945
1946 // Pass through "all", "none", or "default" with an optional refinement step.
1947 if (NumOptions == 1) {
1948 StringRef Val = A->getValue(0);
1949 size_t RefStepLoc;
1950 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1951 return;
1952 StringRef ValBase = Val.slice(0, RefStepLoc);
1953 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1954 OutStrings.push_back(Args.MakeArgString(Out + Val));
1955 return;
1956 }
1957 }
1958
1959 // Each reciprocal type may be enabled or disabled individually.
1960 // Check each input value for validity, concatenate them all back together,
1961 // and pass through.
1962
1963 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001964 OptionStrings.insert(std::make_pair("divd", false));
1965 OptionStrings.insert(std::make_pair("divf", false));
1966 OptionStrings.insert(std::make_pair("vec-divd", false));
1967 OptionStrings.insert(std::make_pair("vec-divf", false));
1968 OptionStrings.insert(std::make_pair("sqrtd", false));
1969 OptionStrings.insert(std::make_pair("sqrtf", false));
1970 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1971 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001972
1973 for (unsigned i = 0; i != NumOptions; ++i) {
1974 StringRef Val = A->getValue(i);
1975
1976 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1977 // Ignore the disablement token for string matching.
1978 if (IsDisabled)
1979 Val = Val.substr(1);
1980
1981 size_t RefStep;
1982 if (!getRefinementStep(Val, D, *A, RefStep))
1983 return;
1984
1985 StringRef ValBase = Val.slice(0, RefStep);
1986 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1987 if (OptionIter == OptionStrings.end()) {
1988 // Try again specifying float suffix.
1989 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1990 if (OptionIter == OptionStrings.end()) {
1991 // The input name did not match any known option string.
1992 D.Diag(diag::err_drv_unknown_argument) << Val;
1993 return;
1994 }
1995 // The option was specified without a float or double suffix.
1996 // Make sure that the double entry was not already specified.
1997 // The float entry will be checked below.
1998 if (OptionStrings[ValBase.str() + 'd']) {
1999 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2000 return;
2001 }
2002 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002003
Sanjay Patel2987c292015-06-11 14:53:41 +00002004 if (OptionIter->second == true) {
2005 // Duplicate option specified.
2006 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2007 return;
2008 }
2009
2010 // Mark the matched option as found. Do not allow duplicate specifiers.
2011 OptionIter->second = true;
2012
2013 // If the precision was not specified, also mark the double entry as found.
2014 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2015 OptionStrings[ValBase.str() + 'd'] = true;
2016
2017 // Build the output string.
2018 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2019 Out = Args.MakeArgString(Out + Prefix + Val);
2020 if (i != NumOptions - 1)
2021 Out = Args.MakeArgString(Out + ",");
2022 }
2023
2024 OutStrings.push_back(Args.MakeArgString(Out));
2025}
2026
Eric Christopherc54920a2015-03-23 19:26:05 +00002027static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002028 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002029 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002030 // If -march=native, autodetect the feature list.
2031 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2032 if (StringRef(A->getValue()) == "native") {
2033 llvm::StringMap<bool> HostFeatures;
2034 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2035 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 Features.push_back(
2037 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002038 }
2039 }
2040
Jim Grosbach82eee262013-11-16 00:53:35 +00002041 if (Triple.getArchName() == "x86_64h") {
2042 // x86_64h implies quite a few of the more modern subtarget features
2043 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2044 Features.push_back("-rdrnd");
2045 Features.push_back("-aes");
2046 Features.push_back("-pclmul");
2047 Features.push_back("-rtm");
2048 Features.push_back("-hle");
2049 Features.push_back("-fsgsbase");
2050 }
2051
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002052 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002053 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002054 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002055 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002056 Features.push_back("+sse4.2");
2057 Features.push_back("+popcnt");
2058 } else
2059 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002060 }
2061
Eric Christopherc54920a2015-03-23 19:26:05 +00002062 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002063 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2064 StringRef Arch = A->getValue();
2065 bool ArchUsed = false;
2066 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002067 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002068 if (Arch == "AVX" || Arch == "AVX2") {
2069 ArchUsed = true;
2070 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2071 }
2072 }
2073 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002074 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002075 if (Arch == "IA32") {
2076 ArchUsed = true;
2077 } else if (Arch == "SSE" || Arch == "SSE2") {
2078 ArchUsed = true;
2079 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2080 }
2081 }
2082 if (!ArchUsed)
2083 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2084 }
2085
Jim Grosbach82eee262013-11-16 00:53:35 +00002086 // Now add any that the user explicitly requested on the command line,
2087 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002088 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002089}
2090
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002091void Clang::AddX86TargetArgs(const ArgList &Args,
2092 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002093 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002094 Args.hasArg(options::OPT_mkernel) ||
2095 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002096 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002097
Bob Wilson2616e2e2013-02-10 16:01:41 +00002098 // Default to avoid implicit floating-point for kernel/kext code, but allow
2099 // that to be overridden with -mno-soft-float.
2100 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2101 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002102 if (Arg *A = Args.getLastArg(
2103 options::OPT_msoft_float, options::OPT_mno_soft_float,
2104 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002105 const Option &O = A->getOption();
2106 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2107 O.matches(options::OPT_msoft_float));
2108 }
2109 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002110 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002111
2112 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2113 StringRef Value = A->getValue();
2114 if (Value == "intel" || Value == "att") {
2115 CmdArgs.push_back("-mllvm");
2116 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2117 } else {
2118 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2119 << A->getOption().getName() << Value;
2120 }
2121 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002122}
2123
Tony Linthicum76329bf2011-12-12 21:14:55 +00002124void Clang::AddHexagonTargetArgs(const ArgList &Args,
2125 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002126 CmdArgs.push_back("-mqdsp6-compat");
2127 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002128
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002129 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2130 std::string N = llvm::utostr(G.getValue());
2131 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002132 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002133 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002134 }
2135
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002136 if (!Args.hasArg(options::OPT_fno_short_enums))
2137 CmdArgs.push_back("-fshort-enums");
2138 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139 CmdArgs.push_back("-mllvm");
2140 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002141 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002142 CmdArgs.push_back("-mllvm");
2143 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002144}
2145
Dan Gohmane3d71e12016-01-07 01:00:21 +00002146void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2147 ArgStringList &CmdArgs) const {
2148 // Default to "hidden" visibility.
2149 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2150 options::OPT_fvisibility_ms_compat)) {
2151 CmdArgs.push_back("-fvisibility");
2152 CmdArgs.push_back("hidden");
2153 }
2154}
2155
Kevin Qin110db6f2014-07-18 07:03:22 +00002156// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002157static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002158 std::vector<const char *> &Features) {
2159 SmallVector<StringRef, 8> Split;
2160 text.split(Split, StringRef("+"), -1, false);
2161
Benjamin Kramer72e64312015-09-24 14:48:49 +00002162 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002163 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002164 .Case("fp", "+fp-armv8")
2165 .Case("simd", "+neon")
2166 .Case("crc", "+crc")
2167 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002168 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002169 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002170 .Case("nofp", "-fp-armv8")
2171 .Case("nosimd", "-neon")
2172 .Case("nocrc", "-crc")
2173 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002174 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002175 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 .Default(nullptr);
2177 if (result)
2178 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002179 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002180 D.Diag(diag::err_drv_no_neon_modifier);
2181 else
2182 return false;
2183 }
2184 return true;
2185}
2186
2187// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2188// decode CPU and feature.
2189static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2190 std::vector<const char *> &Features) {
2191 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2192 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002193 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002194 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2195 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002196 Features.push_back("+neon");
2197 Features.push_back("+crc");
2198 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002199 } else if (CPU == "cyclone") {
2200 Features.push_back("+neon");
2201 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002202 } else if (CPU == "generic") {
2203 Features.push_back("+neon");
2204 } else {
2205 return false;
2206 }
2207
2208 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2209 return false;
2210
2211 return true;
2212}
2213
2214static bool
2215getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2216 const ArgList &Args,
2217 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002218 std::string MarchLowerCase = March.lower();
2219 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002221 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002222 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002224 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002225 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2226 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002227 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002228 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002229 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002230
2231 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2232 return false;
2233
2234 return true;
2235}
2236
2237static bool
2238getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2239 const ArgList &Args,
2240 std::vector<const char *> &Features) {
2241 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002242 std::string McpuLowerCase = Mcpu.lower();
2243 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002244 return false;
2245
2246 return true;
2247}
2248
2249static bool
2250getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2251 const ArgList &Args,
2252 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002253 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002254 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002255 if (MtuneLowerCase == "native")
2256 MtuneLowerCase = llvm::sys::getHostCPUName();
2257 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002258 Features.push_back("+zcm");
2259 Features.push_back("+zcz");
2260 }
2261 return true;
2262}
2263
2264static bool
2265getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2266 const ArgList &Args,
2267 std::vector<const char *> &Features) {
2268 StringRef CPU;
2269 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002270 std::string McpuLowerCase = Mcpu.lower();
2271 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002272 return false;
2273
2274 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2275}
2276
Justin Bognerf9052562015-11-13 23:07:31 +00002277static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002278 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002279 Arg *A;
2280 bool success = true;
2281 // Enable NEON by default.
2282 Features.push_back("+neon");
2283 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2284 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2285 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2286 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002287 else if (Args.hasArg(options::OPT_arch))
2288 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2289 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002290
2291 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2292 success =
2293 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2294 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2295 success =
2296 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002297 else if (Args.hasArg(options::OPT_arch))
2298 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2299 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002300
2301 if (!success)
2302 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002303
2304 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2305 Features.push_back("-fp-armv8");
2306 Features.push_back("-crypto");
2307 Features.push_back("-neon");
2308 }
Bradley Smith418c5932014-05-02 15:17:51 +00002309
2310 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002311 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002312 if (A->getOption().matches(options::OPT_mcrc))
2313 Features.push_back("+crc");
2314 else
2315 Features.push_back("-crc");
2316 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002317
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002318 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2319 options::OPT_munaligned_access))
2320 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2321 Features.push_back("+strict-align");
2322
Justin Bognerf9052562015-11-13 23:07:31 +00002323 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002324 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325}
2326
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002327static void getHexagonTargetFeatures(const ArgList &Args,
2328 std::vector<const char *> &Features) {
2329 bool HasHVX = false, HasHVXD = false;
2330
Eric Christopher49062a52015-12-22 03:12:34 +00002331 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2332 // doing dependent option handling here rather than in initFeatureMap or a
2333 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002334 for (auto &A : Args) {
2335 auto &Opt = A->getOption();
2336 if (Opt.matches(options::OPT_mhexagon_hvx))
2337 HasHVX = true;
2338 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2339 HasHVXD = HasHVX = false;
2340 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2341 HasHVXD = HasHVX = true;
2342 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2343 HasHVXD = false;
2344 else
2345 continue;
2346 A->claim();
2347 }
2348
2349 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2350 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2351}
2352
Dan Gohmanc2853072015-09-03 22:51:53 +00002353static void getWebAssemblyTargetFeatures(const ArgList &Args,
2354 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002355 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002356}
2357
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002358static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002359 const ArgList &Args, ArgStringList &CmdArgs,
2360 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002361 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002362 std::vector<const char *> Features;
2363 switch (Triple.getArch()) {
2364 default:
2365 break;
2366 case llvm::Triple::mips:
2367 case llvm::Triple::mipsel:
2368 case llvm::Triple::mips64:
2369 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002370 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002371 break;
2372
2373 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002374 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002375 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002376 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002377 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002378 break;
2379
2380 case llvm::Triple::ppc:
2381 case llvm::Triple::ppc64:
2382 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002383 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002384 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002385 case llvm::Triple::systemz:
2386 getSystemZTargetFeatures(Args, Features);
2387 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002388 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002389 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002390 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002391 break;
2392 case llvm::Triple::x86:
2393 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002394 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002395 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002396 case llvm::Triple::hexagon:
2397 getHexagonTargetFeatures(Args, Features);
2398 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002399 case llvm::Triple::wasm32:
2400 case llvm::Triple::wasm64:
2401 getWebAssemblyTargetFeatures(Args, Features);
2402 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002403 }
Rafael Espindola43964802013-08-21 17:34:32 +00002404
2405 // Find the last of each feature.
2406 llvm::StringMap<unsigned> LastOpt;
2407 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2408 const char *Name = Features[I];
2409 assert(Name[0] == '-' || Name[0] == '+');
2410 LastOpt[Name + 1] = I;
2411 }
2412
2413 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2414 // If this feature was overridden, ignore it.
2415 const char *Name = Features[I];
2416 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2417 assert(LastI != LastOpt.end());
2418 unsigned Last = LastI->second;
2419 if (Last != I)
2420 continue;
2421
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002422 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002423 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002424 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002425}
2426
David Majnemerae394812014-12-09 00:12:30 +00002427static bool
2428shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2429 const llvm::Triple &Triple) {
2430 // We use the zero-cost exception tables for Objective-C if the non-fragile
2431 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2432 // later.
2433 if (runtime.isNonFragile())
2434 return true;
2435
2436 if (!Triple.isMacOSX())
2437 return false;
2438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002439 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002440 (Triple.getArch() == llvm::Triple::x86_64 ||
2441 Triple.getArch() == llvm::Triple::arm));
2442}
2443
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002444/// Adds exception related arguments to the driver command arguments. There's a
2445/// master flag, -fexceptions and also language specific flags to enable/disable
2446/// C++ and Objective-C exceptions. This makes it possible to for example
2447/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002448static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002449 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002450 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002451 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002452 const Driver &D = TC.getDriver();
2453 const llvm::Triple &Triple = TC.getTriple();
2454
Chad Rosier4fab82c2012-03-26 22:04:46 +00002455 if (KernelOrKext) {
2456 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2457 // arguments now to avoid warnings about unused arguments.
2458 Args.ClaimAllArgs(options::OPT_fexceptions);
2459 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2460 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2461 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2462 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2463 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002464 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002465 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002466
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002467 // See if the user explicitly enabled exceptions.
2468 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2469 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002470
David Majnemerae394812014-12-09 00:12:30 +00002471 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2472 // is not necessarily sensible, but follows GCC.
2473 if (types::isObjC(InputType) &&
2474 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002476 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002477
David Majnemerae394812014-12-09 00:12:30 +00002478 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002479 }
2480
2481 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002482 // Disable C++ EH by default on XCore and PS4.
2483 bool CXXExceptionsEnabled =
2484 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002485 Arg *ExceptionArg = Args.getLastArg(
2486 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2487 options::OPT_fexceptions, options::OPT_fno_exceptions);
2488 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002489 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002490 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2491 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002492
2493 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002494 if (Triple.isPS4CPU()) {
2495 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2496 assert(ExceptionArg &&
2497 "On the PS4 exceptions should only be enabled if passing "
2498 "an argument");
2499 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2500 const Arg *RTTIArg = TC.getRTTIArg();
2501 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2502 D.Diag(diag::err_drv_argument_not_allowed_with)
2503 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2504 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2505 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2506 } else
2507 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2508
Anders Carlssone96ab552011-02-28 02:27:16 +00002509 CmdArgs.push_back("-fcxx-exceptions");
2510
David Majnemer8de68642014-12-05 08:11:58 +00002511 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002512 }
2513 }
2514
David Majnemer8de68642014-12-05 08:11:58 +00002515 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002516 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002517}
2518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002519static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002520 bool Default = true;
2521 if (TC.getTriple().isOSDarwin()) {
2522 // The native darwin assembler doesn't support the linker_option directives,
2523 // so we disable them if we think the .s file will be passed to it.
2524 Default = TC.useIntegratedAs();
2525 }
2526 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2527 Default);
2528}
2529
Ted Kremenek62093662013-03-12 17:02:12 +00002530static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2531 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002532 bool UseDwarfDirectory =
2533 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2534 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002535 return !UseDwarfDirectory;
2536}
2537
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002538/// \brief Check whether the given input tree contains any compilation actions.
2539static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002540 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002541 return true;
2542
Nico Weber5a459f82016-02-23 19:30:43 +00002543 for (const auto &AI : A->inputs())
2544 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002545 return true;
2546
2547 return false;
2548}
2549
2550/// \brief Check if -relax-all should be passed to the internal assembler.
2551/// This is done by default when compiling non-assembler source with -O0.
2552static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2553 bool RelaxDefault = true;
2554
2555 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2556 RelaxDefault = A->getOption().matches(options::OPT_O0);
2557
2558 if (RelaxDefault) {
2559 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002560 for (const auto &Act : C.getActions()) {
2561 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002562 RelaxDefault = true;
2563 break;
2564 }
2565 }
2566 }
2567
2568 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002569 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002570}
2571
Paul Robinson0334a042015-12-19 19:41:48 +00002572// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2573// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002574static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002575 assert(A.getOption().matches(options::OPT_gN_Group) &&
2576 "Not a -g option that specifies a debug-info level");
2577 if (A.getOption().matches(options::OPT_g0) ||
2578 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002579 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002580 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2581 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002582 return codegenoptions::DebugLineTablesOnly;
2583 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002584}
2585
Douglas Katzman3459ce22015-10-08 04:24:12 +00002586// Extract the integer N from a string spelled "-dwarf-N", returning 0
2587// on mismatch. The StringRef input (rather than an Arg) allows
2588// for use by the "-Xassembler" option parser.
2589static unsigned DwarfVersionNum(StringRef ArgValue) {
2590 return llvm::StringSwitch<unsigned>(ArgValue)
2591 .Case("-gdwarf-2", 2)
2592 .Case("-gdwarf-3", 3)
2593 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002594 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002595 .Default(0);
2596}
2597
2598static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002599 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002600 unsigned DwarfVersion,
2601 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002602 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002603 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002604 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2605 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002606 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002607 CmdArgs.push_back("-debug-info-kind=limited");
2608 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002609 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002610 CmdArgs.push_back("-debug-info-kind=standalone");
2611 break;
2612 default:
2613 break;
2614 }
2615 if (DwarfVersion > 0)
2616 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002617 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002618 switch (DebuggerTuning) {
2619 case llvm::DebuggerKind::GDB:
2620 CmdArgs.push_back("-debugger-tuning=gdb");
2621 break;
2622 case llvm::DebuggerKind::LLDB:
2623 CmdArgs.push_back("-debugger-tuning=lldb");
2624 break;
2625 case llvm::DebuggerKind::SCE:
2626 CmdArgs.push_back("-debugger-tuning=sce");
2627 break;
2628 default:
2629 break;
2630 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002631}
2632
David Blaikie9260ed62013-07-25 21:19:01 +00002633static void CollectArgsForIntegratedAssembler(Compilation &C,
2634 const ArgList &Args,
2635 ArgStringList &CmdArgs,
2636 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637 if (UseRelaxAll(C, Args))
2638 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002639
David Majnemer2b9349d2015-12-21 22:09:34 +00002640 // Only default to -mincremental-linker-compatible if we think we are
2641 // targeting the MSVC linker.
2642 bool DefaultIncrementalLinkerCompatible =
2643 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2644 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2645 options::OPT_mno_incremental_linker_compatible,
2646 DefaultIncrementalLinkerCompatible))
2647 CmdArgs.push_back("-mincremental-linker-compatible");
2648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002649 // When passing -I arguments to the assembler we sometimes need to
2650 // unconditionally take the next argument. For example, when parsing
2651 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2652 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2653 // arg after parsing the '-I' arg.
2654 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 // When using an integrated assembler, translate -Wa, and -Xassembler
2657 // options.
2658 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002659 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002660 for (const Arg *A :
2661 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2662 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002663
Benjamin Kramer72e64312015-09-24 14:48:49 +00002664 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002665 if (TakeNextArg) {
2666 CmdArgs.push_back(Value.data());
2667 TakeNextArg = false;
2668 continue;
2669 }
David Blaikie9260ed62013-07-25 21:19:01 +00002670
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002671 switch (C.getDefaultToolChain().getArch()) {
2672 default:
2673 break;
2674 case llvm::Triple::mips:
2675 case llvm::Triple::mipsel:
2676 case llvm::Triple::mips64:
2677 case llvm::Triple::mips64el:
2678 if (Value == "--trap") {
2679 CmdArgs.push_back("-target-feature");
2680 CmdArgs.push_back("+use-tcc-in-div");
2681 continue;
2682 }
2683 if (Value == "--break") {
2684 CmdArgs.push_back("-target-feature");
2685 CmdArgs.push_back("-use-tcc-in-div");
2686 continue;
2687 }
2688 if (Value.startswith("-msoft-float")) {
2689 CmdArgs.push_back("-target-feature");
2690 CmdArgs.push_back("+soft-float");
2691 continue;
2692 }
2693 if (Value.startswith("-mhard-float")) {
2694 CmdArgs.push_back("-target-feature");
2695 CmdArgs.push_back("-soft-float");
2696 continue;
2697 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002698
2699 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2700 .Case("-mips1", "+mips1")
2701 .Case("-mips2", "+mips2")
2702 .Case("-mips3", "+mips3")
2703 .Case("-mips4", "+mips4")
2704 .Case("-mips5", "+mips5")
2705 .Case("-mips32", "+mips32")
2706 .Case("-mips32r2", "+mips32r2")
2707 .Case("-mips32r3", "+mips32r3")
2708 .Case("-mips32r5", "+mips32r5")
2709 .Case("-mips32r6", "+mips32r6")
2710 .Case("-mips64", "+mips64")
2711 .Case("-mips64r2", "+mips64r2")
2712 .Case("-mips64r3", "+mips64r3")
2713 .Case("-mips64r5", "+mips64r5")
2714 .Case("-mips64r6", "+mips64r6")
2715 .Default(nullptr);
2716 if (MipsTargetFeature)
2717 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002718 }
2719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002720 if (Value == "-force_cpusubtype_ALL") {
2721 // Do nothing, this is the default and we don't support anything else.
2722 } else if (Value == "-L") {
2723 CmdArgs.push_back("-msave-temp-labels");
2724 } else if (Value == "--fatal-warnings") {
2725 CmdArgs.push_back("-massembler-fatal-warnings");
2726 } else if (Value == "--noexecstack") {
2727 CmdArgs.push_back("-mnoexecstack");
2728 } else if (Value == "-compress-debug-sections" ||
2729 Value == "--compress-debug-sections") {
2730 CompressDebugSections = true;
2731 } else if (Value == "-nocompress-debug-sections" ||
2732 Value == "--nocompress-debug-sections") {
2733 CompressDebugSections = false;
2734 } else if (Value.startswith("-I")) {
2735 CmdArgs.push_back(Value.data());
2736 // We need to consume the next argument if the current arg is a plain
2737 // -I. The next arg will be the include directory.
2738 if (Value == "-I")
2739 TakeNextArg = true;
2740 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002741 // "-gdwarf-N" options are not cc1as options.
2742 unsigned DwarfVersion = DwarfVersionNum(Value);
2743 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2744 CmdArgs.push_back(Value.data());
2745 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002746 RenderDebugEnablingArgs(Args, CmdArgs,
2747 codegenoptions::LimitedDebugInfo,
2748 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002749 }
Renato Golin7c542b42015-07-27 23:44:45 +00002750 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2751 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2752 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 } else {
2754 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002755 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002756 }
2757 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002758 }
2759 if (CompressDebugSections) {
2760 if (llvm::zlib::isAvailable())
2761 CmdArgs.push_back("-compress-debug-sections");
2762 else
2763 D.Diag(diag::warn_debug_compression_unavailable);
2764 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002765 if (MipsTargetFeature != nullptr) {
2766 CmdArgs.push_back("-target-feature");
2767 CmdArgs.push_back(MipsTargetFeature);
2768 }
David Blaikie9260ed62013-07-25 21:19:01 +00002769}
2770
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002771// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002772// FIXME: Make sure we can also emit shared objects if they're requested
2773// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002774static void addClangRT(const ToolChain &TC, const ArgList &Args,
2775 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002776 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002777}
2778
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002779namespace {
2780enum OpenMPRuntimeKind {
2781 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2782 /// without knowing what runtime to target.
2783 OMPRT_Unknown,
2784
2785 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2786 /// the default for Clang.
2787 OMPRT_OMP,
2788
2789 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2790 /// this runtime but can swallow the pragmas, and find and link against the
2791 /// runtime library itself.
2792 OMPRT_GOMP,
2793
Chandler Carruthc6625c62015-05-28 21:10:31 +00002794 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002795 /// OpenMP runtime. We support this mode for users with existing dependencies
2796 /// on this runtime library name.
2797 OMPRT_IOMP5
2798};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002799}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002800
2801/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002802static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2803 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002804 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2805
2806 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2807 if (A)
2808 RuntimeName = A->getValue();
2809
2810 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002811 .Case("libomp", OMPRT_OMP)
2812 .Case("libgomp", OMPRT_GOMP)
2813 .Case("libiomp5", OMPRT_IOMP5)
2814 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002815
2816 if (RT == OMPRT_Unknown) {
2817 if (A)
2818 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002820 else
2821 // FIXME: We could use a nicer diagnostic here.
2822 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2823 }
2824
2825 return RT;
2826}
2827
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002828static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2829 const ArgList &Args) {
2830 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2831 options::OPT_fno_openmp, false))
2832 return;
2833
2834 switch (getOpenMPRuntime(TC, Args)) {
2835 case OMPRT_OMP:
2836 CmdArgs.push_back("-lomp");
2837 break;
2838 case OMPRT_GOMP:
2839 CmdArgs.push_back("-lgomp");
2840 break;
2841 case OMPRT_IOMP5:
2842 CmdArgs.push_back("-liomp5");
2843 break;
2844 case OMPRT_Unknown:
2845 // Already diagnosed.
2846 break;
2847 }
2848}
2849
Alexey Samsonov52550342014-09-15 19:58:40 +00002850static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2851 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002852 bool IsShared, bool IsWhole) {
2853 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002854 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002855 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002856 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002857 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002858}
2859
Alexey Samsonov52550342014-09-15 19:58:40 +00002860// Tries to use a file with the list of dynamic symbols that need to be exported
2861// from the runtime library. Returns true if the file was found.
2862static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2863 ArgStringList &CmdArgs,
2864 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002865 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002866 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2867 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002868 return true;
2869 }
2870 return false;
2871}
2872
2873static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2874 ArgStringList &CmdArgs) {
2875 // Force linking against the system libraries sanitizers depends on
2876 // (see PR15823 why this is necessary).
2877 CmdArgs.push_back("--no-as-needed");
2878 CmdArgs.push_back("-lpthread");
2879 CmdArgs.push_back("-lrt");
2880 CmdArgs.push_back("-lm");
2881 // There's no libdl on FreeBSD.
2882 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2883 CmdArgs.push_back("-ldl");
2884}
2885
2886static void
2887collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2888 SmallVectorImpl<StringRef> &SharedRuntimes,
2889 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002890 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2891 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2892 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002893 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2894 // Collect shared runtimes.
2895 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2896 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002897 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002898 // The stats_client library is also statically linked into DSOs.
2899 if (SanArgs.needsStatsRt())
2900 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002901
Alexey Samsonov52550342014-09-15 19:58:40 +00002902 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002903 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002904 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002905 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002906 }
2907 if (SanArgs.needsAsanRt()) {
2908 if (SanArgs.needsSharedAsanRt()) {
2909 HelperStaticRuntimes.push_back("asan-preinit");
2910 } else {
2911 StaticRuntimes.push_back("asan");
2912 if (SanArgs.linkCXXRuntimes())
2913 StaticRuntimes.push_back("asan_cxx");
2914 }
2915 }
2916 if (SanArgs.needsDfsanRt())
2917 StaticRuntimes.push_back("dfsan");
2918 if (SanArgs.needsLsanRt())
2919 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002920 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002921 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002922 if (SanArgs.linkCXXRuntimes())
2923 StaticRuntimes.push_back("msan_cxx");
2924 }
2925 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002926 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002927 if (SanArgs.linkCXXRuntimes())
2928 StaticRuntimes.push_back("tsan_cxx");
2929 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002930 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002931 StaticRuntimes.push_back("ubsan_standalone");
2932 if (SanArgs.linkCXXRuntimes())
2933 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002934 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002935 if (SanArgs.needsSafeStackRt())
2936 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002937 if (SanArgs.needsCfiRt())
2938 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002939 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002940 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002941 if (SanArgs.linkCXXRuntimes())
2942 StaticRuntimes.push_back("ubsan_standalone_cxx");
2943 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002944 if (SanArgs.needsStatsRt()) {
2945 NonWholeStaticRuntimes.push_back("stats");
2946 RequiredSymbols.push_back("__sanitizer_stats_register");
2947 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002948}
2949
Alexey Samsonov52550342014-09-15 19:58:40 +00002950// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2951// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2952static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002953 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002954 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002955 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002956 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002957 NonWholeStaticRuntimes, HelperStaticRuntimes,
2958 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002959 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002960 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002962 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002963 bool AddExportDynamic = false;
2964 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002965 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002966 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2967 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002968 for (auto RT : NonWholeStaticRuntimes) {
2969 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2970 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2971 }
2972 for (auto S : RequiredSymbols) {
2973 CmdArgs.push_back("-u");
2974 CmdArgs.push_back(Args.MakeArgString(S));
2975 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002976 // If there is a static runtime with no dynamic list, force all the symbols
2977 // to be dynamic to be sure we export sanitizer interface functions.
2978 if (AddExportDynamic)
2979 CmdArgs.push_back("-export-dynamic");
2980 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002981}
2982
Reid Kleckner86ea7702015-02-04 23:45:07 +00002983static bool areOptimizationsEnabled(const ArgList &Args) {
2984 // Find the last -O arg and see if it is non-zero.
2985 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2986 return !A->getOption().matches(options::OPT_O0);
2987 // Defaults to -O0.
2988 return false;
2989}
2990
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002991static bool shouldUseFramePointerForTarget(const ArgList &Args,
2992 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002993 switch (Triple.getArch()) {
2994 case llvm::Triple::xcore:
2995 case llvm::Triple::wasm32:
2996 case llvm::Triple::wasm64:
2997 // XCore never wants frame pointers, regardless of OS.
2998 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002999 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003000 default:
3001 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003002 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003003
3004 if (Triple.isOSLinux()) {
3005 switch (Triple.getArch()) {
3006 // Don't use a frame pointer on linux if optimizing for certain targets.
3007 case llvm::Triple::mips64:
3008 case llvm::Triple::mips64el:
3009 case llvm::Triple::mips:
3010 case llvm::Triple::mipsel:
3011 case llvm::Triple::systemz:
3012 case llvm::Triple::x86:
3013 case llvm::Triple::x86_64:
3014 return !areOptimizationsEnabled(Args);
3015 default:
3016 return true;
3017 }
3018 }
3019
3020 if (Triple.isOSWindows()) {
3021 switch (Triple.getArch()) {
3022 case llvm::Triple::x86:
3023 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003024 case llvm::Triple::x86_64:
3025 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003026 case llvm::Triple::arm:
3027 case llvm::Triple::thumb:
3028 // Windows on ARM builds with FPO disabled to aid fast stack walking
3029 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003030 default:
3031 // All other supported Windows ISAs use xdata unwind information, so frame
3032 // pointers are not generally useful.
3033 return false;
3034 }
3035 }
3036
3037 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003038}
3039
Rafael Espindola224dd632011-12-14 21:02:23 +00003040static bool shouldUseFramePointer(const ArgList &Args,
3041 const llvm::Triple &Triple) {
3042 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3043 options::OPT_fomit_frame_pointer))
3044 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003045 if (Args.hasArg(options::OPT_pg))
3046 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003047
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003048 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003049}
3050
Eric Christopherb7d97e92013-04-03 01:58:53 +00003051static bool shouldUseLeafFramePointer(const ArgList &Args,
3052 const llvm::Triple &Triple) {
3053 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3054 options::OPT_momit_leaf_frame_pointer))
3055 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003056 if (Args.hasArg(options::OPT_pg))
3057 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003058
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003059 if (Triple.isPS4CPU())
3060 return false;
3061
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003062 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003063}
3064
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003065/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003066static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003067 SmallString<128> cwd;
3068 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003069 CmdArgs.push_back("-fdebug-compilation-dir");
3070 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003071 }
3072}
3073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003074static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003075 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3076 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3077 SmallString<128> T(FinalOutput->getValue());
3078 llvm::sys::path::replace_extension(T, "dwo");
3079 return Args.MakeArgString(T);
3080 } else {
3081 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003082 SmallString<128> T(
3083 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003084 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003085 llvm::sys::path::replace_extension(F, "dwo");
3086 T += F;
3087 return Args.MakeArgString(F);
3088 }
3089}
3090
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003091static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3092 const JobAction &JA, const ArgList &Args,
3093 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003094 ArgStringList ExtractArgs;
3095 ExtractArgs.push_back("--extract-dwo");
3096
3097 ArgStringList StripArgs;
3098 StripArgs.push_back("--strip-dwo");
3099
3100 // Grabbing the output of the earlier compile step.
3101 StripArgs.push_back(Output.getFilename());
3102 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003103 ExtractArgs.push_back(OutFile);
3104
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003106 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003107
3108 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003109 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003110
3111 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003112 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003113}
3114
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003115/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003116/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3117static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003118 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003119 if (A->getOption().matches(options::OPT_O4) ||
3120 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003121 return true;
3122
3123 if (A->getOption().matches(options::OPT_O0))
3124 return false;
3125
3126 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3127
Rafael Espindola91780de2013-08-26 14:05:41 +00003128 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003129 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003130 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003131 return true;
3132
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003133 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003134 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003135 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003136
3137 unsigned OptLevel = 0;
3138 if (S.getAsInteger(10, OptLevel))
3139 return false;
3140
3141 return OptLevel > 1;
3142 }
3143
3144 return false;
3145}
3146
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003147/// Add -x lang to \p CmdArgs for \p Input.
3148static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3149 ArgStringList &CmdArgs) {
3150 // When using -verify-pch, we don't want to provide the type
3151 // 'precompiled-header' if it was inferred from the file extension
3152 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3153 return;
3154
3155 CmdArgs.push_back("-x");
3156 if (Args.hasArg(options::OPT_rewrite_objc))
3157 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3158 else
3159 CmdArgs.push_back(types::getTypeName(Input.getType()));
3160}
3161
David Majnemerc371ff02015-03-22 08:39:22 +00003162static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003163 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003164 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003165
3166 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003167 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003168
3169 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003171 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003172 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003173}
3174
Rafael Espindola577637a2015-01-03 00:06:04 +00003175// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003176// options that build systems might add but are unused when assembling or only
3177// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003178static void claimNoWarnArgs(const ArgList &Args) {
3179 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003180 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003181 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003182 Args.ClaimAllArgs(options::OPT_flto);
3183 Args.ClaimAllArgs(options::OPT_fno_lto);
3184}
3185
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003186static void appendUserToPath(SmallVectorImpl<char> &Result) {
3187#ifdef LLVM_ON_UNIX
3188 const char *Username = getenv("LOGNAME");
3189#else
3190 const char *Username = getenv("USERNAME");
3191#endif
3192 if (Username) {
3193 // Validate that LoginName can be used in a path, and get its length.
3194 size_t Len = 0;
3195 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003196 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003197 Username = nullptr;
3198 break;
3199 }
3200 }
3201
3202 if (Username && Len > 0) {
3203 Result.append(Username, Username + Len);
3204 return;
3205 }
3206 }
3207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003208// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003209#ifdef LLVM_ON_UNIX
3210 std::string UID = llvm::utostr(getuid());
3211#else
3212 // FIXME: Windows seems to have an 'SID' that might work.
3213 std::string UID = "9999";
3214#endif
3215 Result.append(UID.begin(), UID.end());
3216}
3217
David Majnemere11d3732015-06-08 00:22:46 +00003218VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3219 const llvm::Triple &Triple,
3220 const llvm::opt::ArgList &Args,
3221 bool IsWindowsMSVC) {
3222 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3223 IsWindowsMSVC) ||
3224 Args.hasArg(options::OPT_fmsc_version) ||
3225 Args.hasArg(options::OPT_fms_compatibility_version)) {
3226 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3227 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003228 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003229
3230 if (MSCVersion && MSCompatibilityVersion) {
3231 if (D)
3232 D->Diag(diag::err_drv_argument_not_allowed_with)
3233 << MSCVersion->getAsString(Args)
3234 << MSCompatibilityVersion->getAsString(Args);
3235 return VersionTuple();
3236 }
3237
3238 if (MSCompatibilityVersion) {
3239 VersionTuple MSVT;
3240 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3241 D->Diag(diag::err_drv_invalid_value)
3242 << MSCompatibilityVersion->getAsString(Args)
3243 << MSCompatibilityVersion->getValue();
3244 return MSVT;
3245 }
3246
3247 if (MSCVersion) {
3248 unsigned Version = 0;
3249 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3250 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3251 << MSCVersion->getValue();
3252 return getMSCompatibilityVersion(Version);
3253 }
3254
3255 unsigned Major, Minor, Micro;
3256 Triple.getEnvironmentVersion(Major, Minor, Micro);
3257 if (Major || Minor || Micro)
3258 return VersionTuple(Major, Minor, Micro);
3259
3260 return VersionTuple(18);
3261 }
3262 return VersionTuple();
3263}
3264
Diego Novilloa0545962015-07-10 18:00:07 +00003265static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3266 const InputInfo &Output, const ArgList &Args,
3267 ArgStringList &CmdArgs) {
3268 auto *ProfileGenerateArg = Args.getLastArg(
3269 options::OPT_fprofile_instr_generate,
3270 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003271 options::OPT_fprofile_generate_EQ,
3272 options::OPT_fno_profile_instr_generate);
3273 if (ProfileGenerateArg &&
3274 ProfileGenerateArg->getOption().matches(
3275 options::OPT_fno_profile_instr_generate))
3276 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003277
3278 auto *ProfileUseArg = Args.getLastArg(
3279 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003280 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3281 options::OPT_fno_profile_instr_use);
3282 if (ProfileUseArg &&
3283 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3284 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003285
3286 if (ProfileGenerateArg && ProfileUseArg)
3287 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003288 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003289
Diego Novillo758f3f52015-08-05 21:49:51 +00003290 if (ProfileGenerateArg) {
3291 if (ProfileGenerateArg->getOption().matches(
3292 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003293 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3294 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003295 else if (ProfileGenerateArg->getOption().matches(
3296 options::OPT_fprofile_generate_EQ)) {
3297 SmallString<128> Path(ProfileGenerateArg->getValue());
3298 llvm::sys::path::append(Path, "default.profraw");
3299 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003300 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3301 }
3302 // The default is to use Clang Instrumentation.
3303 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003304 }
Diego Novilloa0545962015-07-10 18:00:07 +00003305
Diego Novillo758f3f52015-08-05 21:49:51 +00003306 if (ProfileUseArg) {
3307 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003308 CmdArgs.push_back(Args.MakeArgString(
3309 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003310 else if ((ProfileUseArg->getOption().matches(
3311 options::OPT_fprofile_use_EQ) ||
3312 ProfileUseArg->getOption().matches(
3313 options::OPT_fprofile_instr_use))) {
3314 SmallString<128> Path(
3315 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3316 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3317 llvm::sys::path::append(Path, "default.profdata");
3318 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003319 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003320 }
Diego Novilloa0545962015-07-10 18:00:07 +00003321 }
3322
3323 if (Args.hasArg(options::OPT_ftest_coverage) ||
3324 Args.hasArg(options::OPT_coverage))
3325 CmdArgs.push_back("-femit-coverage-notes");
3326 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3327 false) ||
3328 Args.hasArg(options::OPT_coverage))
3329 CmdArgs.push_back("-femit-coverage-data");
3330
Diego Novilloc4b94da2015-08-05 23:27:40 +00003331 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3332 options::OPT_fno_coverage_mapping, false) &&
3333 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003334 D.Diag(diag::err_drv_argument_only_allowed_with)
3335 << "-fcoverage-mapping"
3336 << "-fprofile-instr-generate";
3337
Diego Novilloc4b94da2015-08-05 23:27:40 +00003338 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3339 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003340 CmdArgs.push_back("-fcoverage-mapping");
3341
3342 if (C.getArgs().hasArg(options::OPT_c) ||
3343 C.getArgs().hasArg(options::OPT_S)) {
3344 if (Output.isFilename()) {
3345 CmdArgs.push_back("-coverage-file");
3346 SmallString<128> CoverageFilename;
3347 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3348 CoverageFilename = FinalOutput->getValue();
3349 } else {
3350 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3351 }
3352 if (llvm::sys::path::is_relative(CoverageFilename)) {
3353 SmallString<128> Pwd;
3354 if (!llvm::sys::fs::current_path(Pwd)) {
3355 llvm::sys::path::append(Pwd, CoverageFilename);
3356 CoverageFilename.swap(Pwd);
3357 }
3358 }
3359 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3360 }
3361 }
3362}
3363
Paul Robinsond083b9a2015-12-16 17:25:27 +00003364static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3365 ArgStringList &CmdArgs) {
3366 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3367 false) ||
3368 Args.hasFlag(options::OPT_fprofile_generate,
3369 options::OPT_fno_profile_instr_generate, false) ||
3370 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3371 options::OPT_fno_profile_instr_generate, false) ||
3372 Args.hasFlag(options::OPT_fprofile_instr_generate,
3373 options::OPT_fno_profile_instr_generate, false) ||
3374 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3375 options::OPT_fno_profile_instr_generate, false) ||
3376 Args.hasArg(options::OPT_fcreate_profile) ||
3377 Args.hasArg(options::OPT_coverage)))
3378 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3379}
3380
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003381/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3382/// smooshes them together with platform defaults, to decide whether
3383/// this compile should be using PIC mode or not. Returns a tuple of
3384/// (RelocationModel, PICLevel, IsPIE).
3385static std::tuple<llvm::Reloc::Model, unsigned, bool>
3386ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3387 const ArgList &Args) {
3388 // FIXME: why does this code...and so much everywhere else, use both
3389 // ToolChain.getTriple() and Triple?
3390 bool PIE = ToolChain.isPIEDefault();
3391 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003392 // The Darwin/MachO default to use PIC does not apply when using -static.
3393 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3394 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003395 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003396 bool IsPICLevelTwo = PIC;
3397
3398 bool KernelOrKext =
3399 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3400
3401 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003402 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003403 switch (ToolChain.getArch()) {
3404 case llvm::Triple::arm:
3405 case llvm::Triple::armeb:
3406 case llvm::Triple::thumb:
3407 case llvm::Triple::thumbeb:
3408 case llvm::Triple::aarch64:
3409 case llvm::Triple::mips:
3410 case llvm::Triple::mipsel:
3411 case llvm::Triple::mips64:
3412 case llvm::Triple::mips64el:
3413 PIC = true; // "-fpic"
3414 break;
3415
3416 case llvm::Triple::x86:
3417 case llvm::Triple::x86_64:
3418 PIC = true; // "-fPIC"
3419 IsPICLevelTwo = true;
3420 break;
3421
3422 default:
3423 break;
3424 }
3425 }
3426
3427 // OpenBSD-specific defaults for PIE
3428 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3429 switch (ToolChain.getArch()) {
3430 case llvm::Triple::mips64:
3431 case llvm::Triple::mips64el:
3432 case llvm::Triple::sparcel:
3433 case llvm::Triple::x86:
3434 case llvm::Triple::x86_64:
3435 IsPICLevelTwo = false; // "-fpie"
3436 break;
3437
3438 case llvm::Triple::ppc:
3439 case llvm::Triple::sparc:
3440 case llvm::Triple::sparcv9:
3441 IsPICLevelTwo = true; // "-fPIE"
3442 break;
3443
3444 default:
3445 break;
3446 }
3447 }
3448
3449 // The last argument relating to either PIC or PIE wins, and no
3450 // other argument is used. If the last argument is any flavor of the
3451 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3452 // option implicitly enables PIC at the same level.
3453 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3454 options::OPT_fpic, options::OPT_fno_pic,
3455 options::OPT_fPIE, options::OPT_fno_PIE,
3456 options::OPT_fpie, options::OPT_fno_pie);
3457 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3458 // is forced, then neither PIC nor PIE flags will have no effect.
3459 if (!ToolChain.isPICDefaultForced()) {
3460 if (LastPICArg) {
3461 Option O = LastPICArg->getOption();
3462 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3463 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3464 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3465 PIC =
3466 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3467 IsPICLevelTwo =
3468 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3469 } else {
3470 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003471 if (Triple.isPS4CPU()) {
3472 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3473 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3474 if (Model != "kernel") {
3475 PIC = true;
3476 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3477 << LastPICArg->getSpelling();
3478 }
3479 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003480 }
3481 }
3482 }
3483
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003484 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3485 // PIC level would've been set to level 1, force it back to level 2 PIC
3486 // instead.
3487 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003488 IsPICLevelTwo |= ToolChain.isPICDefault();
3489
James Y Knightc4015d32015-08-21 04:14:55 +00003490 // This kernel flags are a trump-card: they will disable PIC/PIE
3491 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003492 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3493 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003494 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003495
3496 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3497 // This is a very special mode. It trumps the other modes, almost no one
3498 // uses it, and it isn't even valid on any OS but Darwin.
3499 if (!ToolChain.getTriple().isOSDarwin())
3500 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3501 << A->getSpelling() << ToolChain.getTriple().str();
3502
3503 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3504
3505 // Only a forced PIC mode can cause the actual compile to have PIC defines
3506 // etc., no flags are sufficient. This behavior was selected to closely
3507 // match that of llvm-gcc and Apple GCC before that.
3508 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3509
3510 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3511 }
3512
3513 if (PIC)
3514 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3515
3516 return std::make_tuple(llvm::Reloc::Static, 0, false);
3517}
3518
3519static const char *RelocationModelName(llvm::Reloc::Model Model) {
3520 switch (Model) {
3521 case llvm::Reloc::Default:
3522 return nullptr;
3523 case llvm::Reloc::Static:
3524 return "static";
3525 case llvm::Reloc::PIC_:
3526 return "pic";
3527 case llvm::Reloc::DynamicNoPIC:
3528 return "dynamic-no-pic";
3529 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003530 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003531}
3532
3533static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3534 ArgStringList &CmdArgs) {
3535 llvm::Reloc::Model RelocationModel;
3536 unsigned PICLevel;
3537 bool IsPIE;
3538 std::tie(RelocationModel, PICLevel, IsPIE) =
3539 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3540
3541 if (RelocationModel != llvm::Reloc::Static)
3542 CmdArgs.push_back("-KPIC");
3543}
3544
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003545void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546 const InputInfo &Output, const InputInfoList &Inputs,
3547 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003548 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3549 const llvm::Triple Triple(TripleStr);
3550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003551 bool KernelOrKext =
3552 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003553 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003554 ArgStringList CmdArgs;
3555
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003556 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003557 bool IsWindowsCygnus =
3558 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003559 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003560 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003561
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003562 // Check number of inputs for sanity. We need at least one input.
3563 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003564 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003565 // CUDA compilation may have multiple inputs (source file + results of
3566 // device-side compilations). All other jobs are expected to have exactly one
3567 // input.
3568 bool IsCuda = types::isCuda(Input.getType());
3569 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003570
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003571 // Invoke ourselves in -cc1 mode.
3572 //
3573 // FIXME: Implement custom jobs for internal actions.
3574 CmdArgs.push_back("-cc1");
3575
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003576 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003577 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003578 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003579
Artem Belevichfa11ab52015-11-17 22:28:46 +00003580 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003581 if (IsCuda) {
3582 // FIXME: We need a (better) way to pass information about
3583 // particular compilation pass we're constructing here. For now we
3584 // can check which toolchain we're using and pick the other one to
3585 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003586 if (&getToolChain() == C.getCudaDeviceToolChain())
3587 AuxToolChain = C.getCudaHostToolChain();
3588 else if (&getToolChain() == C.getCudaHostToolChain())
3589 AuxToolChain = C.getCudaDeviceToolChain();
3590 else
3591 llvm_unreachable("Can't figure out CUDA compilation mode.");
3592 assert(AuxToolChain != nullptr && "No aux toolchain.");
3593 CmdArgs.push_back("-aux-triple");
3594 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003595 CmdArgs.push_back("-fcuda-target-overloads");
3596 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003597 }
3598
James Y Knight2db38f32015-08-15 03:45:25 +00003599 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3600 Triple.getArch() == llvm::Triple::thumb)) {
3601 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003602 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003603 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003604 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003605 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003606 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003607 }
3608
Tim Northover336f1892014-03-29 13:16:12 +00003609 // Push all default warning arguments that are specific to
3610 // the given target. These come before user provided warning options
3611 // are provided.
3612 getToolChain().addClangWarningOptions(CmdArgs);
3613
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003614 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003615 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003616
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003617 if (isa<AnalyzeJobAction>(JA)) {
3618 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3619 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003620 } else if (isa<MigrateJobAction>(JA)) {
3621 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003622 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003623 if (Output.getType() == types::TY_Dependencies)
3624 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003625 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003626 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003627 if (Args.hasArg(options::OPT_rewrite_objc) &&
3628 !Args.hasArg(options::OPT_g_Group))
3629 CmdArgs.push_back("-P");
3630 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003631 } else if (isa<AssembleJobAction>(JA)) {
3632 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003633
David Blaikie9260ed62013-07-25 21:19:01 +00003634 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003635
3636 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003637 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003638 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003639 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003640 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003641
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003642 if (JA.getType() == types::TY_Nothing)
3643 CmdArgs.push_back("-fsyntax-only");
3644 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003645 CmdArgs.push_back("-emit-pch");
3646 else
3647 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003648 } else if (isa<VerifyPCHJobAction>(JA)) {
3649 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003650 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003651 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3652 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003654 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003655 } else if (JA.getType() == types::TY_LLVM_IR ||
3656 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003657 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003658 } else if (JA.getType() == types::TY_LLVM_BC ||
3659 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003660 CmdArgs.push_back("-emit-llvm-bc");
3661 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003662 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003663 } else if (JA.getType() == types::TY_AST) {
3664 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003665 } else if (JA.getType() == types::TY_ModuleFile) {
3666 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003667 } else if (JA.getType() == types::TY_RewrittenObjC) {
3668 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003669 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003670 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3671 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003672 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003673 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003674 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003675 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003676
3677 // Preserve use-list order by default when emitting bitcode, so that
3678 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3679 // same result as running passes here. For LTO, we don't need to preserve
3680 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003681 if (JA.getType() == types::TY_LLVM_BC)
3682 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003683
3684 if (D.isUsingLTO())
3685 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003686 }
3687
Teresa Johnsonaff22322015-12-07 19:21:34 +00003688 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3689 if (!types::isLLVMIR(Input.getType()))
3690 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3691 << "-x ir";
3692 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3693 }
3694
Steven Wu574b0f22016-03-01 01:07:58 +00003695 // Embed-bitcode option.
3696 if (C.getDriver().embedBitcodeEnabled() &&
3697 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3698 // Add flags implied by -fembed-bitcode.
3699 CmdArgs.push_back("-fembed-bitcode");
3700 // Disable all llvm IR level optimizations.
3701 CmdArgs.push_back("-disable-llvm-optzns");
3702 }
3703 if (C.getDriver().embedBitcodeMarkerOnly())
3704 CmdArgs.push_back("-fembed-bitcode-marker");
3705
Justin Bognera88f0122014-06-20 22:59:50 +00003706 // We normally speed up the clang process a bit by skipping destructors at
3707 // exit, but when we're generating diagnostics we can rely on some of the
3708 // cleanup.
3709 if (!C.isForDiagnostics())
3710 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003712// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003713#ifdef NDEBUG
3714 CmdArgs.push_back("-disable-llvm-verifier");
3715#endif
3716
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003717 // Set the main file name, so that debug info works even with
3718 // -save-temps.
3719 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003720 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003721
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003722 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003723 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003724 if (Args.hasArg(options::OPT_static))
3725 CmdArgs.push_back("-static-define");
3726
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003727 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003728 // Enable region store model by default.
3729 CmdArgs.push_back("-analyzer-store=region");
3730
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003731 // Treat blocks as analysis entry points.
3732 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3733
Ted Kremenek49c79792011-03-24 00:28:47 +00003734 CmdArgs.push_back("-analyzer-eagerly-assume");
3735
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003736 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003737 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003738 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003739
Devin Coughlin65c77082016-01-21 20:09:49 +00003740 if (!IsWindowsMSVC) {
3741 CmdArgs.push_back("-analyzer-checker=unix");
3742 } else {
3743 // Enable "unix" checkers that also work on Windows.
3744 CmdArgs.push_back("-analyzer-checker=unix.API");
3745 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3746 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3747 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3748 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3749 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3750 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003751
Sean Evesonb38c32b2016-01-06 10:03:58 +00003752 // Disable some unix checkers for PS4.
3753 if (IsPS4CPU) {
3754 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3755 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3756 }
3757
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003758 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003759 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003760
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003761 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762
Artem Belevichba558952015-05-06 18:20:23 +00003763 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003764 CmdArgs.push_back("-analyzer-checker=cplusplus");
3765
Sean Evesonb38c32b2016-01-06 10:03:58 +00003766 if (!IsPS4CPU) {
3767 CmdArgs.push_back(
3768 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3769 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3770 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3771 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3772 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3773 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3774 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003775
3776 // Default nullability checks.
3777 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3778 CmdArgs.push_back(
3779 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003780 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003781
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003782 // Set the output format. The default is plist, for (lame) historical
3783 // reasons.
3784 CmdArgs.push_back("-analyzer-output");
3785 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003786 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003787 else
3788 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003789
Ted Kremenekfe449a22010-03-22 22:32:05 +00003790 // Disable the presentation of standard compiler warnings when
3791 // using --analyze. We only want to show static analyzer diagnostics
3792 // or frontend errors.
3793 CmdArgs.push_back("-w");
3794
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003795 // Add -Xanalyzer arguments when running as analyzer.
3796 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003797 }
3798
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003799 CheckCodeGenerationOptions(D, Args);
3800
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003801 llvm::Reloc::Model RelocationModel;
3802 unsigned PICLevel;
3803 bool IsPIE;
3804 std::tie(RelocationModel, PICLevel, IsPIE) =
3805 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003806
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003807 const char *RMName = RelocationModelName(RelocationModel);
3808 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003809 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003810 CmdArgs.push_back(RMName);
3811 }
3812 if (PICLevel > 0) {
3813 CmdArgs.push_back("-pic-level");
3814 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3815 if (IsPIE) {
3816 CmdArgs.push_back("-pie-level");
3817 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003818 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003819 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003820
Renato Golin4854d802015-11-09 12:40:41 +00003821 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3822 CmdArgs.push_back("-meabi");
3823 CmdArgs.push_back(A->getValue());
3824 }
3825
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003826 CmdArgs.push_back("-mthread-model");
3827 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3828 CmdArgs.push_back(A->getValue());
3829 else
3830 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3831
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003832 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3833
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003834 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3835 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003836 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003837
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003838 // LLVM Code Generator Options.
3839
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003840 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3841 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003842 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3843 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003844 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003845 CmdArgs.push_back(A->getValue());
3846 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003847 }
3848 }
3849
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003850 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3851 StringRef v = A->getValue();
3852 CmdArgs.push_back("-mllvm");
3853 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3854 A->claim();
3855 }
3856
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003857 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3858 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003859 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003860 }
3861
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003862 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3863 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003864 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003865 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003866 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003867 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3868 CmdArgs.push_back("-fpcc-struct-return");
3869 } else {
3870 assert(A->getOption().matches(options::OPT_freg_struct_return));
3871 CmdArgs.push_back("-freg-struct-return");
3872 }
3873 }
3874
Roman Divacky65b88cd2011-03-01 17:40:53 +00003875 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3876 CmdArgs.push_back("-mrtd");
3877
Rafael Espindola224dd632011-12-14 21:02:23 +00003878 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003879 CmdArgs.push_back("-mdisable-fp-elim");
3880 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3881 options::OPT_fno_zero_initialized_in_bss))
3882 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003883
3884 bool OFastEnabled = isOptimizationLevelFast(Args);
3885 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3886 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003887 OptSpecifier StrictAliasingAliasOption =
3888 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003889 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3890 // doesn't do any TBAA.
3891 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003892 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003893 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003894 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003895 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3896 options::OPT_fno_struct_path_tbaa))
3897 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003898 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3899 false))
3900 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003901 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3902 options::OPT_fno_strict_vtable_pointers,
3903 false))
3904 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003905 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3906 options::OPT_fno_optimize_sibling_calls))
3907 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003908
Eric Christopher006208c2013-04-04 06:29:47 +00003909 // Handle segmented stacks.
3910 if (Args.hasArg(options::OPT_fsplit_stack))
3911 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003912
3913 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3914 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003915 OptSpecifier FastMathAliasOption =
3916 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3917
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003918 // Handle various floating point optimization flags, mapping them to the
3919 // appropriate LLVM code generation flags. The pattern for all of these is to
3920 // default off the codegen optimizations, and if any flag enables them and no
3921 // flag disables them after the flag enabling them, enable the codegen
3922 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003923 if (Arg *A = Args.getLastArg(
3924 options::OPT_ffast_math, FastMathAliasOption,
3925 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3926 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3927 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003928 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3929 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003930 A->getOption().getID() != options::OPT_fhonor_infinities)
3931 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 if (Arg *A = Args.getLastArg(
3933 options::OPT_ffast_math, FastMathAliasOption,
3934 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3935 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3936 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003937 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3938 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003939 A->getOption().getID() != options::OPT_fhonor_nans)
3940 CmdArgs.push_back("-menable-no-nans");
3941
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003942 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3943 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 if (Arg *A =
3945 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3946 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3947 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003948 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3949 // However, turning *off* -ffast_math merely restores the toolchain default
3950 // (which may be false).
3951 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3952 A->getOption().getID() == options::OPT_ffast_math ||
3953 A->getOption().getID() == options::OPT_Ofast)
3954 MathErrno = false;
3955 else if (A->getOption().getID() == options::OPT_fmath_errno)
3956 MathErrno = true;
3957 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003958 if (MathErrno)
3959 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003960
3961 // There are several flags which require disabling very specific
3962 // optimizations. Any of these being disabled forces us to turn off the
3963 // entire set of LLVM optimizations, so collect them through all the flag
3964 // madness.
3965 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966 if (Arg *A = Args.getLastArg(
3967 options::OPT_ffast_math, FastMathAliasOption,
3968 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3969 options::OPT_fno_unsafe_math_optimizations,
3970 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003971 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3972 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003973 A->getOption().getID() != options::OPT_fno_associative_math)
3974 AssociativeMath = true;
3975 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003976 if (Arg *A = Args.getLastArg(
3977 options::OPT_ffast_math, FastMathAliasOption,
3978 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3979 options::OPT_fno_unsafe_math_optimizations,
3980 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003981 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3982 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003983 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3984 ReciprocalMath = true;
3985 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003986 if (Arg *A = Args.getLastArg(
3987 options::OPT_ffast_math, FastMathAliasOption,
3988 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3989 options::OPT_fno_unsafe_math_optimizations,
3990 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003991 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3992 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003993 A->getOption().getID() != options::OPT_fsigned_zeros)
3994 SignedZeros = false;
3995 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003996 if (Arg *A = Args.getLastArg(
3997 options::OPT_ffast_math, FastMathAliasOption,
3998 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3999 options::OPT_fno_unsafe_math_optimizations,
4000 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004001 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4002 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004003 A->getOption().getID() != options::OPT_ftrapping_math)
4004 TrappingMath = false;
4005 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4006 !TrappingMath)
4007 CmdArgs.push_back("-menable-unsafe-fp-math");
4008
Sanjay Patel76c9e092015-01-23 16:40:50 +00004009 if (!SignedZeros)
4010 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004011
Sanjay Patel359b1052015-04-09 15:03:23 +00004012 if (ReciprocalMath)
4013 CmdArgs.push_back("-freciprocal-math");
4014
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004015 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004016 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004017 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004018 options::OPT_ffp_contract)) {
4019 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004020 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004021 if (Val == "fast" || Val == "on" || Val == "off") {
4022 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4023 } else {
4024 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004025 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004026 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004027 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4028 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004029 // If fast-math is set then set the fp-contract mode to fast.
4030 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4031 }
4032 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004033
Sanjay Patel2987c292015-06-11 14:53:41 +00004034 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004035
Bob Wilson6a039162012-07-19 03:52:53 +00004036 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4037 // and if we find them, tell the frontend to provide the appropriate
4038 // preprocessor macros. This is distinct from enabling any optimizations as
4039 // these options induce language changes which must survive serialization
4040 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004041 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4042 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004043 if (!A->getOption().matches(options::OPT_fno_fast_math))
4044 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004045 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4046 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004047 if (A->getOption().matches(options::OPT_ffinite_math_only))
4048 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004049
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004050 // Decide whether to use verbose asm. Verbose assembly is the default on
4051 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004052 bool IsIntegratedAssemblerDefault =
4053 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004054 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004055 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004056 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004057 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004058
Rafael Espindolab8a12932015-05-22 20:44:03 +00004059 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4060 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004061 CmdArgs.push_back("-no-integrated-as");
4062
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004063 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4064 CmdArgs.push_back("-mdebug-pass");
4065 CmdArgs.push_back("Structure");
4066 }
4067 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4068 CmdArgs.push_back("-mdebug-pass");
4069 CmdArgs.push_back("Arguments");
4070 }
4071
Justin Lebar710a35f2016-01-25 22:36:35 +00004072 // Enable -mconstructor-aliases except on darwin, where we have to work around
4073 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4074 // aliases aren't supported.
4075 if (!getToolChain().getTriple().isOSDarwin() &&
4076 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004077 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004078
John McCall7ef5cb32011-03-18 02:56:14 +00004079 // Darwin's kernel doesn't support guard variables; just die if we
4080 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004081 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004082 CmdArgs.push_back("-fforbid-guard-variables");
4083
Akira Hatanaka02028482015-11-12 17:21:22 +00004084 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4085 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004086 CmdArgs.push_back("-mms-bitfields");
4087 }
John McCall8517abc2010-02-19 02:45:38 +00004088
Daniel Dunbar306945d2009-09-16 06:17:29 +00004089 // This is a coarse approximation of what llvm-gcc actually does, both
4090 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4091 // complicated ways.
4092 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004093 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4094 options::OPT_fno_asynchronous_unwind_tables,
4095 (getToolChain().IsUnwindTablesDefault() ||
4096 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4097 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004098 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4099 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004100 CmdArgs.push_back("-munwind-tables");
4101
Chandler Carruth05fb5852012-11-21 23:40:23 +00004102 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004103
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004104 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4105 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004106 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004107 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004108
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004109 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004110 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004111
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004112 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004113 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004114 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004115 }
4116
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004117 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004118 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004119 if (!CPU.empty()) {
4120 CmdArgs.push_back("-target-cpu");
4121 CmdArgs.push_back(Args.MakeArgString(CPU));
4122 }
4123
Rafael Espindolaeb265472013-08-21 21:59:03 +00004124 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4125 CmdArgs.push_back("-mfpmath");
4126 CmdArgs.push_back(A->getValue());
4127 }
4128
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004129 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004130 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004131
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004132 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004133 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004134 default:
4135 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004136
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004137 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004138 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004139 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004140 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004141 // Use the effective triple, which takes into account the deployment target.
4142 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004143 break;
4144
Tim Northover573cbee2014-05-24 12:52:07 +00004145 case llvm::Triple::aarch64:
4146 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004147 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004148 break;
4149
Eric Christopher0b26a612010-03-02 02:41:08 +00004150 case llvm::Triple::mips:
4151 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004152 case llvm::Triple::mips64:
4153 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004154 AddMIPSTargetArgs(Args, CmdArgs);
4155 break;
4156
Ulrich Weigand8afad612014-07-28 13:17:52 +00004157 case llvm::Triple::ppc:
4158 case llvm::Triple::ppc64:
4159 case llvm::Triple::ppc64le:
4160 AddPPCTargetArgs(Args, CmdArgs);
4161 break;
4162
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004163 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004164 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004165 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004166 AddSparcTargetArgs(Args, CmdArgs);
4167 break;
4168
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004169 case llvm::Triple::x86:
4170 case llvm::Triple::x86_64:
4171 AddX86TargetArgs(Args, CmdArgs);
4172 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004173
4174 case llvm::Triple::hexagon:
4175 AddHexagonTargetArgs(Args, CmdArgs);
4176 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004177
4178 case llvm::Triple::wasm32:
4179 case llvm::Triple::wasm64:
4180 AddWebAssemblyTargetArgs(Args, CmdArgs);
4181 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004182 }
4183
Douglas Katzman3459ce22015-10-08 04:24:12 +00004184 // The 'g' groups options involve a somewhat intricate sequence of decisions
4185 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004186 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004187 // * what level of debug info to generate
4188 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004189 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004190 // This avoids having to monkey around further in cc1 other than to disable
4191 // codeview if not running in a Windows environment. Perhaps even that
4192 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004193 unsigned DwarfVersion = 0;
4194 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4195 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004196 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004197 bool EmitCodeView = false;
4198
Hans Wennborg75958c42013-08-08 00:17:41 +00004199 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004200 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004201 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004202 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004203
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004204 // Pass the linker version in use.
4205 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4206 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004207 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004208 }
4209
Eric Christopherb7d97e92013-04-03 01:58:53 +00004210 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004211 CmdArgs.push_back("-momit-leaf-frame-pointer");
4212
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004213 // Explicitly error on some things we know we don't support and can't just
4214 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004215 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4216 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004217 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004218 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004219 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4220 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004221 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004222 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004223 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004224 }
4225
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004226 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004227 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004228 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004229 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004230 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4231 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004232 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004233 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004234 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004235
Chad Rosierbe10f982011-08-02 17:58:04 +00004236 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004237 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004238 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4239 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004240 }
4241
Rafael Espindola08a692a2010-03-07 04:46:18 +00004242 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004243 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004244 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004245 // If the last option explicitly specified a debug-info level, use it.
4246 if (A->getOption().matches(options::OPT_gN_Group)) {
4247 DebugInfoKind = DebugLevelToInfoKind(*A);
4248 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4249 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4250 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004251 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004252 A->getIndex() > SplitDwarfArg->getIndex())
4253 SplitDwarfArg = nullptr;
4254 } else
4255 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004256 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004257 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004258
Paul Robinson0334a042015-12-19 19:41:48 +00004259 // If a debugger tuning argument appeared, remember it.
4260 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4261 options::OPT_ggdbN_Group)) {
4262 if (A->getOption().matches(options::OPT_glldb))
4263 DebuggerTuning = llvm::DebuggerKind::LLDB;
4264 else if (A->getOption().matches(options::OPT_gsce))
4265 DebuggerTuning = llvm::DebuggerKind::SCE;
4266 else
4267 DebuggerTuning = llvm::DebuggerKind::GDB;
4268 }
4269
4270 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004271 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004272 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004273 DwarfVersion = DwarfVersionNum(A->getSpelling());
4274
Reid Kleckner124955a2015-08-05 18:51:13 +00004275 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004276 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4277 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4278 // DwarfVersion remains at 0 if no explicit choice was made.
4279 CmdArgs.push_back("-gcodeview");
4280 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004281 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004282 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4283 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004284
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004285 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4286 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004287
4288 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004289 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004290 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004291 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004292
Eric Christopher138c32b2013-09-13 22:37:55 +00004293 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004294 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004295 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004296 CmdArgs.push_back("-dwarf-ext-refs");
4297 CmdArgs.push_back("-fmodule-format=obj");
4298 }
4299
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004300 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4301 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004302 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004303 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004304 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004305 CmdArgs.push_back("-backend-option");
4306 CmdArgs.push_back("-split-dwarf=Enable");
4307 }
4308
Douglas Katzman3459ce22015-10-08 04:24:12 +00004309 // After we've dealt with all combinations of things that could
4310 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4311 // figure out if we need to "upgrade" it to standalone debug info.
4312 // We parse these two '-f' options whether or not they will be used,
4313 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4314 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4315 options::OPT_fno_standalone_debug,
4316 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004317 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4318 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004319 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4320 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004321
Eric Christopher138c32b2013-09-13 22:37:55 +00004322 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4323 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4324 CmdArgs.push_back("-backend-option");
4325 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4326 }
Eric Christophereec89c22013-06-18 00:03:50 +00004327
Eric Christopher0d403d22014-02-14 01:27:03 +00004328 // -gdwarf-aranges turns on the emission of the aranges section in the
4329 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004330 // Always enabled on the PS4.
4331 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004332 CmdArgs.push_back("-backend-option");
4333 CmdArgs.push_back("-generate-arange-section");
4334 }
4335
David Blaikief36d9ba2014-01-27 18:52:43 +00004336 if (Args.hasFlag(options::OPT_fdebug_types_section,
4337 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004338 CmdArgs.push_back("-backend-option");
4339 CmdArgs.push_back("-generate-type-units");
4340 }
Eric Christophereec89c22013-06-18 00:03:50 +00004341
Dan Gohmana5b804b2016-01-07 00:50:27 +00004342 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4343 // default.
4344 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4345 Triple.getArch() == llvm::Triple::wasm32 ||
4346 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004347
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004348 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004349 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004350 CmdArgs.push_back("-ffunction-sections");
4351 }
4352
Peter Collingbourneceef1452016-02-24 22:03:06 +00004353 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4354 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004355 if (!D.isUsingLTO())
4356 D.Diag(diag::err_drv_argument_only_allowed_with)
4357 << "-fwhole-program-vtables"
4358 << "-flto";
4359 CmdArgs.push_back("-fwhole-program-vtables");
4360
4361 clang::SmallString<64> Path(D.ResourceDir);
4362 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4363 if (llvm::sys::fs::exists(Path)) {
4364 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4365 BlacklistOpt += Path.str();
4366 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4367 }
4368
4369 for (const Arg *A :
4370 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4371 A->claim();
4372 if (!llvm::sys::fs::exists(A->getValue()))
4373 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4374 }
4375
4376 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4377 }
4378
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004379 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4380 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004381 CmdArgs.push_back("-fdata-sections");
4382 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004383
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004384 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004385 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004386 CmdArgs.push_back("-fno-unique-section-names");
4387
Chris Lattner3c77a352010-06-22 00:03:40 +00004388 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4389
Diego Novilloa0545962015-07-10 18:00:07 +00004390 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004391
Paul Robinsond083b9a2015-12-16 17:25:27 +00004392 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4393 if (getToolChain().getTriple().isPS4CPU())
4394 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4395
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004396 // Pass options for controlling the default header search paths.
4397 if (Args.hasArg(options::OPT_nostdinc)) {
4398 CmdArgs.push_back("-nostdsysteminc");
4399 CmdArgs.push_back("-nobuiltininc");
4400 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004401 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004402 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004403 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4404 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4405 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004406
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004407 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004408 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004409 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004410
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004411 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4412
Ted Kremenekf7639e12012-03-06 20:06:33 +00004413 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004414 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004415 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004416 options::OPT_ccc_arcmt_modify,
4417 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004418 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004419 switch (A->getOption().getID()) {
4420 default:
4421 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004422 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004423 CmdArgs.push_back("-arcmt-check");
4424 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004425 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004426 CmdArgs.push_back("-arcmt-modify");
4427 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004428 case options::OPT_ccc_arcmt_migrate:
4429 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004430 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004431 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004432
4433 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4434 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004435 break;
John McCalld70fb982011-06-15 23:25:17 +00004436 }
4437 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004438 } else {
4439 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4440 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4441 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004442 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004443
Ted Kremenekf7639e12012-03-06 20:06:33 +00004444 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4445 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004446 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4447 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004448 }
4449 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004450 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004451
4452 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004453 options::OPT_objcmt_migrate_subscripting,
4454 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004455 // None specified, means enable them all.
4456 CmdArgs.push_back("-objcmt-migrate-literals");
4457 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004458 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004459 } else {
4460 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4461 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004462 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004463 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004464 } else {
4465 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4466 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4467 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4468 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4469 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4470 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004471 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004472 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4473 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4474 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4475 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4476 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4477 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4478 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004479 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004480 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004481 }
4482
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004483 // Add preprocessing options like -I, -D, etc. if we are using the
4484 // preprocessor.
4485 //
4486 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004487 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004488 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4489 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004490
Rafael Espindolaa7431922011-07-21 23:40:37 +00004491 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4492 // that "The compiler can only warn and ignore the option if not recognized".
4493 // When building with ccache, it will pass -D options to clang even on
4494 // preprocessed inputs and configure concludes that -fPIC is not supported.
4495 Args.ClaimAllArgs(options::OPT_D);
4496
Alp Toker7874bdc2013-11-15 20:40:58 +00004497 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004498 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4499 if (A->getOption().matches(options::OPT_O4)) {
4500 CmdArgs.push_back("-O3");
4501 D.Diag(diag::warn_O4_is_O3);
4502 } else {
4503 A->render(Args, CmdArgs);
4504 }
4505 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004506
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004507 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004508 for (const Arg *A :
4509 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4510 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004511 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004512 }
4513
Rafael Espindola577637a2015-01-03 00:06:04 +00004514 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004515
Richard Smith3be1cb22014-08-07 00:24:21 +00004516 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004517 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004518 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4519 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004520 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004521 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004522
4523 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004524 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004525 //
4526 // If a std is supplied, only add -trigraphs if it follows the
4527 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004528 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004529 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4530 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004531 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004532 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004533 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004534 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004535 else
4536 Std->render(Args, CmdArgs);
4537
Nico Weber00721502014-12-23 22:32:37 +00004538 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004539 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004540 options::OPT_ftrigraphs,
4541 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004542 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004543 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004544 } else {
4545 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004546 //
4547 // FIXME: Clang doesn't correctly handle -std= when the input language
4548 // doesn't match. For the time being just ignore this for C++ inputs;
4549 // eventually we want to do all the standard defaulting here instead of
4550 // splitting it between the driver and clang -cc1.
4551 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004552 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4553 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004554 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004555 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004556
Nico Weber00721502014-12-23 22:32:37 +00004557 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4558 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004559 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004560
Richard Smith282b4492013-09-04 22:50:31 +00004561 // GCC's behavior for -Wwrite-strings is a bit strange:
4562 // * In C, this "warning flag" changes the types of string literals from
4563 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4564 // for the discarded qualifier.
4565 // * In C++, this is just a normal warning flag.
4566 //
4567 // Implementing this warning correctly in C is hard, so we follow GCC's
4568 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4569 // a non-const char* in C, rather than using this crude hack.
4570 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004571 // FIXME: This should behave just like a warning flag, and thus should also
4572 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4573 Arg *WriteStrings =
4574 Args.getLastArg(options::OPT_Wwrite_strings,
4575 options::OPT_Wno_write_strings, options::OPT_w);
4576 if (WriteStrings &&
4577 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004578 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004579 }
4580
Chandler Carruth61fbf622011-04-23 09:27:53 +00004581 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004582 // during C++ compilation, which it is by default. GCC keeps this define even
4583 // in the presence of '-w', match this behavior bug-for-bug.
4584 if (types::isCXX(InputType) &&
4585 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4586 true)) {
4587 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004588 }
4589
Chandler Carruthe0391482010-05-22 02:21:53 +00004590 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4591 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4592 if (Asm->getOption().matches(options::OPT_fasm))
4593 CmdArgs.push_back("-fgnu-keywords");
4594 else
4595 CmdArgs.push_back("-fno-gnu-keywords");
4596 }
4597
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004598 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4599 CmdArgs.push_back("-fno-dwarf-directory-asm");
4600
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004601 if (ShouldDisableAutolink(Args, getToolChain()))
4602 CmdArgs.push_back("-fno-autolink");
4603
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004604 // Add in -fdebug-compilation-dir if necessary.
4605 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004606
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004607 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4608 StringRef Map = A->getValue();
4609 if (Map.find('=') == StringRef::npos)
4610 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4611 else
4612 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4613 A->claim();
4614 }
4615
Richard Smith9a568822011-11-21 19:36:32 +00004616 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4617 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004618 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004619 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004620 }
4621
Richard Smith79c927b2013-11-06 19:31:51 +00004622 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4623 CmdArgs.push_back("-foperator-arrow-depth");
4624 CmdArgs.push_back(A->getValue());
4625 }
4626
Richard Smith9a568822011-11-21 19:36:32 +00004627 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4628 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004629 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004630 }
4631
Richard Smitha3d3bd22013-05-08 02:12:03 +00004632 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4633 CmdArgs.push_back("-fconstexpr-steps");
4634 CmdArgs.push_back(A->getValue());
4635 }
4636
Richard Smithb3a14522013-02-22 01:59:51 +00004637 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4638 CmdArgs.push_back("-fbracket-depth");
4639 CmdArgs.push_back(A->getValue());
4640 }
4641
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004642 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4643 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004644 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004645 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004646 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4647 } else
4648 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004649 }
4650
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004651 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004652 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004653
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004654 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4655 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004656 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004657 }
David Chisnall5778fce2009-08-31 16:41:57 +00004658
Chris Lattnere23003d2010-01-09 21:54:33 +00004659 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4660 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004661 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004662 }
4663
Chris Lattnerb35583d2010-04-07 20:49:23 +00004664 CmdArgs.push_back("-ferror-limit");
4665 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004666 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004667 else
4668 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004669
Chandler Carrutha77a7272010-05-06 04:55:18 +00004670 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4671 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004672 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004673 }
4674
4675 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4676 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004677 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004678 }
4679
Richard Smithf6f003a2011-12-16 19:06:07 +00004680 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4681 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004682 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004683 }
4684
Nick Lewycky24653262014-12-16 21:39:02 +00004685 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4686 CmdArgs.push_back("-fspell-checking-limit");
4687 CmdArgs.push_back(A->getValue());
4688 }
4689
Daniel Dunbar2c978472009-11-04 06:24:47 +00004690 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004691 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004692 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004693 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004694 } else {
4695 // If -fmessage-length=N was not specified, determine whether this is a
4696 // terminal and, if so, implicitly define -fmessage-length appropriately.
4697 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004698 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004699 }
4700
John McCallb4a99d32013-02-19 01:57:35 +00004701 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4702 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4703 options::OPT_fvisibility_ms_compat)) {
4704 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4705 CmdArgs.push_back("-fvisibility");
4706 CmdArgs.push_back(A->getValue());
4707 } else {
4708 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4709 CmdArgs.push_back("-fvisibility");
4710 CmdArgs.push_back("hidden");
4711 CmdArgs.push_back("-ftype-visibility");
4712 CmdArgs.push_back("default");
4713 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004714 }
4715
Douglas Gregor08329632010-06-15 17:05:35 +00004716 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004717
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004718 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4719
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004720 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004721 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4722 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004723 CmdArgs.push_back("-ffreestanding");
4724
Daniel Dunbare357d562009-12-03 18:42:11 +00004725 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004726 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004727 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004728 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004729 // Emulated TLS is enabled by default on Android, and can be enabled manually
4730 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004731 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004732 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4733 EmulatedTLSDefault))
4734 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004735 // AltiVec-like language extensions aren't relevant for assembling.
4736 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004737 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004738 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4739 }
Richard Trieu91844232012-06-26 18:18:47 +00004740 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4741 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004742
Alexey Bataevdb390212015-05-20 04:24:19 +00004743 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004744 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4745 options::OPT_fno_openmp, false))
4746 switch (getOpenMPRuntime(getToolChain(), Args)) {
4747 case OMPRT_OMP:
4748 case OMPRT_IOMP5:
4749 // Clang can generate useful OpenMP code for these two runtime libraries.
4750 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004751
4752 // If no option regarding the use of TLS in OpenMP codegeneration is
4753 // given, decide a default based on the target. Otherwise rely on the
4754 // options and pass the right information to the frontend.
4755 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004756 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004757 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004758 break;
4759 default:
4760 // By default, if Clang doesn't know how to generate useful OpenMP code
4761 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4762 // down to the actual compilation.
4763 // FIXME: It would be better to have a mode which *only* omits IR
4764 // generation based on the OpenMP support so that we get consistent
4765 // semantic analysis, etc.
4766 break;
4767 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004768
Peter Collingbourne32701642013-11-01 18:16:25 +00004769 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004770 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004771
Eric Christopher459d2712013-02-19 06:16:53 +00004772 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004773 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4774 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4775 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4776 Arch == llvm::Triple::ppc64le))
4777 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4778 << "ppc/ppc64/ppc64le";
4779 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004780
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004781 // -fzvector is incompatible with -faltivec.
4782 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4783 if (Args.hasArg(options::OPT_faltivec))
4784 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4785 << "-faltivec";
4786
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004787 if (getToolChain().SupportsProfiling())
4788 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004789
4790 // -flax-vector-conversions is default.
4791 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4792 options::OPT_fno_lax_vector_conversions))
4793 CmdArgs.push_back("-fno-lax-vector-conversions");
4794
John Brawna7b4ec02015-08-10 11:11:28 +00004795 if (Args.getLastArg(options::OPT_fapple_kext) ||
4796 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004797 CmdArgs.push_back("-fapple-kext");
4798
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004799 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004800 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004801 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004802 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4803 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004804
4805 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4806 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004807 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004808 }
4809
Bob Wilson14adb362012-02-03 06:27:22 +00004810 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004811
Chandler Carruth6e501032011-03-27 00:04:55 +00004812 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4813 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004814 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004815 if (A->getOption().matches(options::OPT_fwrapv))
4816 CmdArgs.push_back("-fwrapv");
4817 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4818 options::OPT_fno_strict_overflow)) {
4819 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4820 CmdArgs.push_back("-fwrapv");
4821 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004822
4823 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4824 options::OPT_fno_reroll_loops))
4825 if (A->getOption().matches(options::OPT_freroll_loops))
4826 CmdArgs.push_back("-freroll-loops");
4827
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004828 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004829 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4830 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004831
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004832 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4833
Daniel Dunbar4930e332009-11-17 08:07:36 +00004834 // -stack-protector=0 is default.
4835 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004836 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4837 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4838 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4839 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4840 Args.ClaimAllArgs(options::OPT_fstack_protector);
4841 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004842 options::OPT_fstack_protector_all,
4843 options::OPT_fstack_protector_strong,
4844 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004845 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004846 StackProtectorLevel = std::max<unsigned>(
4847 LangOptions::SSPOn,
4848 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004849 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004850 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004851 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004852 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004853 } else {
4854 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004855 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004856 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004857 if (StackProtectorLevel) {
4858 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004859 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004860 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004861
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004862 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004863 for (const Arg *A : Args.filtered(options::OPT__param)) {
4864 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004865 if (Str.startswith("ssp-buffer-size=")) {
4866 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004867 CmdArgs.push_back("-stack-protector-buffer-size");
4868 // FIXME: Verify the argument is a valid integer.
4869 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004870 }
Sean Silva14facf32015-06-09 01:57:17 +00004871 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004872 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004873 }
4874
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004875 // Translate -mstackrealign
4876 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004877 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004878 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004879
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004880 if (Args.hasArg(options::OPT_mstack_alignment)) {
4881 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4882 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004883 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004884
Hans Wennborg77dc2362015-01-20 19:45:50 +00004885 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4886 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4887
4888 if (!Size.empty())
4889 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4890 else
4891 CmdArgs.push_back("-mstack-probe-size=0");
4892 }
4893
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004894 switch (getToolChain().getArch()) {
4895 case llvm::Triple::aarch64:
4896 case llvm::Triple::aarch64_be:
4897 case llvm::Triple::arm:
4898 case llvm::Triple::armeb:
4899 case llvm::Triple::thumb:
4900 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004901 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004902 break;
4903
4904 default:
4905 break;
4906 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004907
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004908 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4909 options::OPT_mno_restrict_it)) {
4910 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4911 CmdArgs.push_back("-backend-option");
4912 CmdArgs.push_back("-arm-restrict-it");
4913 } else {
4914 CmdArgs.push_back("-backend-option");
4915 CmdArgs.push_back("-arm-no-restrict-it");
4916 }
James Y Knight2db38f32015-08-15 03:45:25 +00004917 } else if (Triple.isOSWindows() &&
4918 (Triple.getArch() == llvm::Triple::arm ||
4919 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004920 // Windows on ARM expects restricted IT blocks
4921 CmdArgs.push_back("-backend-option");
4922 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004923 }
4924
Daniel Dunbard18049a2009-04-07 21:16:11 +00004925 // Forward -f options with positive and negative forms; we translate
4926 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004927 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4928 StringRef fname = A->getValue();
4929 if (!llvm::sys::fs::exists(fname))
4930 D.Diag(diag::err_drv_no_such_file) << fname;
4931 else
4932 A->render(Args, CmdArgs);
4933 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004934
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004935 // -fbuiltin is default unless -mkernel is used.
4936 bool UseBuiltins =
4937 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4938 !Args.hasArg(options::OPT_mkernel));
4939 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004940 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004941
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004942 // -ffreestanding implies -fno-builtin.
4943 if (Args.hasArg(options::OPT_ffreestanding))
4944 UseBuiltins = false;
4945
4946 // Process the -fno-builtin-* options.
4947 for (const auto &Arg : Args) {
4948 const Option &O = Arg->getOption();
4949 if (!O.matches(options::OPT_fno_builtin_))
4950 continue;
4951
4952 Arg->claim();
4953 // If -fno-builtin is specified, then there's no need to pass the option to
4954 // the frontend.
4955 if (!UseBuiltins)
4956 continue;
4957
4958 StringRef FuncName = Arg->getValue();
4959 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4960 }
4961
Nuno Lopes13c88c72009-12-16 16:59:22 +00004962 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4963 options::OPT_fno_assume_sane_operator_new))
4964 CmdArgs.push_back("-fno-assume-sane-operator-new");
4965
Daniel Dunbar4930e332009-11-17 08:07:36 +00004966 // -fblocks=0 is default.
4967 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004968 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004969 (Args.hasArg(options::OPT_fgnu_runtime) &&
4970 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4971 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004972 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004973
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004974 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004975 !getToolChain().hasBlocksRuntime())
4976 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004977 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004978
Richard Smith47972af2015-06-16 00:08:24 +00004979 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004980 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004981 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004982 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004983 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004984 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4985 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004986 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004987 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004988 HaveModules = true;
4989 }
4990 }
4991
Richard Smith47972af2015-06-16 00:08:24 +00004992 // -fmodule-maps enables implicit reading of module map files. By default,
4993 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004994 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4995 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004996 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004997 }
4998
Daniel Jasperac42b752013-10-21 06:34:34 +00004999 // -fmodules-decluse checks that modules used are declared so (off by
5000 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005001 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005002 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005003 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005004 }
5005
Daniel Jasper962b38e2014-04-11 11:47:45 +00005006 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5007 // all #included headers are part of modules.
5008 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005009 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005010 CmdArgs.push_back("-fmodules-strict-decluse");
5011 }
5012
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005013 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5014 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5015 options::OPT_fno_implicit_modules)) {
5016 CmdArgs.push_back("-fno-implicit-modules");
5017 }
5018
Daniel Jasperac42b752013-10-21 06:34:34 +00005019 // -fmodule-name specifies the module that is currently being built (or
5020 // used for header checking by -fmodule-maps).
Richard Smith7e82e012016-02-19 22:25:36 +00005021 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
Daniel Jasperac42b752013-10-21 06:34:34 +00005022
Richard Smith9887d792014-10-17 01:42:53 +00005023 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00005024 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00005025 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00005026
Richard Smithe842a472014-10-22 02:05:46 +00005027 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00005028 if (HaveModules)
5029 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5030 else
5031 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00005032
5033 // -fmodule-cache-path specifies where our implicitly-built module files
5034 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00005035 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00005036 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00005037 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005038 if (HaveModules) {
5039 if (C.isForDiagnostics()) {
5040 // When generating crash reports, we want to emit the modules along with
5041 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005042 Path = Output.getFilename();
5043 llvm::sys::path::replace_extension(Path, ".cache");
5044 llvm::sys::path::append(Path, "modules");
5045 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005046 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005047 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005048 llvm::sys::path::append(Path, "org.llvm.clang.");
5049 appendUserToPath(Path);
5050 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005051 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005052 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005053 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5054 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005055 }
5056
5057 // When building modules and generating crashdumps, we need to dump a module
5058 // dependency VFS alongside the output.
5059 if (HaveModules && C.isForDiagnostics()) {
5060 SmallString<128> VFSDir(Output.getFilename());
5061 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005062 // Add the cache directory as a temp so the crash diagnostics pick it up.
5063 C.addTempFile(Args.MakeArgString(VFSDir));
5064
Justin Bognera88f0122014-06-20 22:59:50 +00005065 llvm::sys::path::append(VFSDir, "vfs");
5066 CmdArgs.push_back("-module-dependency-dir");
5067 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005068 }
5069
Richard Smith9887d792014-10-17 01:42:53 +00005070 if (HaveModules)
5071 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005072
Douglas Gregor35b04d62013-02-07 19:01:24 +00005073 // Pass through all -fmodules-ignore-macro arguments.
5074 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005075 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5076 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005077
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005078 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5079
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005080 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5081 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5082 D.Diag(diag::err_drv_argument_not_allowed_with)
5083 << A->getAsString(Args) << "-fbuild-session-timestamp";
5084
5085 llvm::sys::fs::file_status Status;
5086 if (llvm::sys::fs::status(A->getValue(), Status))
5087 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005088 CmdArgs.push_back(Args.MakeArgString(
5089 "-fbuild-session-timestamp=" +
5090 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005091 }
5092
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005093 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005094 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5095 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005096 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5097
5098 Args.AddLastArg(CmdArgs,
5099 options::OPT_fmodules_validate_once_per_build_session);
5100 }
5101
Ben Langmuirdcf73862014-03-12 00:06:17 +00005102 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5103
John McCalldfea9982010-04-09 19:12:06 +00005104 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005105 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005106 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005107 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005108
Anders Carlssond470fef2010-11-21 00:09:52 +00005109 // -felide-constructors is the default.
5110 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005111 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005112 CmdArgs.push_back("-fno-elide-constructors");
5113
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005114 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005115
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005116 if (KernelOrKext || (types::isCXX(InputType) &&
5117 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5118 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005119 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005120
Tony Linthicum76329bf2011-12-12 21:14:55 +00005121 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5123 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005124 CmdArgs.push_back("-fshort-enums");
5125
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005126 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005127 if (Arg *A = Args.getLastArg(
5128 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5129 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5130 if (A->getOption().matches(options::OPT_funsigned_char) ||
5131 A->getOption().matches(options::OPT_fno_signed_char)) {
5132 CmdArgs.push_back("-fno-signed-char");
5133 }
5134 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005135 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005136 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005137
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005138 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005139 if (!Args.hasFlag(
5140 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5141 !IsWindowsCygnus && !IsWindowsGNU &&
5142 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5143 getToolChain().getArch() != llvm::Triple::hexagon &&
5144 getToolChain().getArch() != llvm::Triple::xcore &&
5145 ((getToolChain().getTriple().getVendor() !=
5146 llvm::Triple::MipsTechnologies) ||
5147 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005148 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005149 CmdArgs.push_back("-fno-use-cxa-atexit");
5150
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005151 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005152 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005153 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005154 CmdArgs.push_back("-fms-extensions");
5155
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005156 // -fno-use-line-directives is default.
5157 if (Args.hasFlag(options::OPT_fuse_line_directives,
5158 options::OPT_fno_use_line_directives, false))
5159 CmdArgs.push_back("-fuse-line-directives");
5160
Francois Pichet1b4f1632011-09-17 04:32:15 +00005161 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005162 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005163 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 (IsWindowsMSVC &&
5165 Args.hasFlag(options::OPT_fms_extensions,
5166 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005167 CmdArgs.push_back("-fms-compatibility");
5168
David Majnemerc371ff02015-03-22 08:39:22 +00005169 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005170 VersionTuple MSVT = visualstudio::getMSVCVersion(
5171 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5172 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005173 CmdArgs.push_back(
5174 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005175
David Majnemer8db91762015-05-18 04:49:30 +00005176 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5177 if (ImplyVCPPCXXVer) {
5178 if (IsMSVC2015Compatible)
5179 CmdArgs.push_back("-std=c++14");
5180 else
5181 CmdArgs.push_back("-std=c++11");
5182 }
5183
Eric Christopher5ecce122013-02-18 00:38:31 +00005184 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005185 if (Args.hasFlag(options::OPT_fborland_extensions,
5186 options::OPT_fno_borland_extensions, false))
5187 CmdArgs.push_back("-fborland-extensions");
5188
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005189 // -fno-declspec is default, except for PS4.
5190 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5191 getToolChain().getTriple().isPS4()))
5192 CmdArgs.push_back("-fdeclspec");
5193 else if (Args.hasArg(options::OPT_fno_declspec))
5194 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5195
David Majnemerc371ff02015-03-22 08:39:22 +00005196 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5197 // than 19.
5198 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5199 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005200 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005201 CmdArgs.push_back("-fno-threadsafe-statics");
5202
Francois Pichet02744872011-09-01 16:38:08 +00005203 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5204 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005205 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005206 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005207 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005208
Chandler Carruthe03aa552010-04-17 20:17:31 +00005209 // -fgnu-keywords default varies depending on language; only pass if
5210 // specified.
5211 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005212 options::OPT_fno_gnu_keywords))
5213 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005214
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005215 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005216 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005217 CmdArgs.push_back("-fgnu89-inline");
5218
Chad Rosier9c76d242012-03-15 22:31:42 +00005219 if (Args.hasArg(options::OPT_fno_inline))
5220 CmdArgs.push_back("-fno-inline");
5221
Chad Rosier64d6be92012-03-06 21:17:19 +00005222 if (Args.hasArg(options::OPT_fno_inline_functions))
5223 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005224
John McCall5fb5df92012-06-20 06:18:46 +00005225 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005226
John McCall5fb5df92012-06-20 06:18:46 +00005227 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005228 // legacy is the default. Except for deployment taget of 10.5,
5229 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5230 // gets ignored silently.
5231 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005232 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5233 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005234 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005235 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005236 if (getToolChain().UseObjCMixedDispatch())
5237 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5238 else
5239 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5240 }
5241 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005242
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005243 // When ObjectiveC legacy runtime is in effect on MacOSX,
5244 // turn on the option to do Array/Dictionary subscripting
5245 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005246 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005247 getToolChain().getTriple().isMacOSX() &&
5248 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5249 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005250 objcRuntime.isNeXTFamily())
5251 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005252
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005253 // -fencode-extended-block-signature=1 is default.
5254 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5255 CmdArgs.push_back("-fencode-extended-block-signature");
5256 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005257
John McCall24fc0de2011-07-06 00:26:06 +00005258 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5259 // NOTE: This logic is duplicated in ToolChains.cpp.
5260 bool ARC = isObjCAutoRefCount(Args);
5261 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005262 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005263
John McCall24fc0de2011-07-06 00:26:06 +00005264 CmdArgs.push_back("-fobjc-arc");
5265
Chandler Carruth491db322011-11-04 07:34:47 +00005266 // FIXME: It seems like this entire block, and several around it should be
5267 // wrapped in isObjC, but for now we just use it here as this is where it
5268 // was being used previously.
5269 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5270 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5271 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5272 else
5273 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5274 }
5275
John McCall24fc0de2011-07-06 00:26:06 +00005276 // Allow the user to enable full exceptions code emission.
5277 // We define off for Objective-CC, on for Objective-C++.
5278 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5279 options::OPT_fno_objc_arc_exceptions,
5280 /*default*/ types::isCXX(InputType)))
5281 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005282
John McCall24fc0de2011-07-06 00:26:06 +00005283 }
5284
5285 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5286 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005287 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005288 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005289
John McCall24fc0de2011-07-06 00:26:06 +00005290 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5291 // takes precedence.
5292 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5293 if (!GCArg)
5294 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5295 if (GCArg) {
5296 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005298 } else if (getToolChain().SupportsObjCGC()) {
5299 GCArg->render(Args, CmdArgs);
5300 } else {
5301 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005303 }
5304 }
5305
John McCallfbe5ed72015-11-05 19:19:56 +00005306 // Pass down -fobjc-weak or -fno-objc-weak if present.
5307 if (types::isObjC(InputType)) {
5308 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5309 options::OPT_fno_objc_weak);
5310 if (!WeakArg) {
5311 // nothing to do
5312 } else if (GCArg) {
5313 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5314 D.Diag(diag::err_objc_weak_with_gc);
5315 } else if (!objcRuntime.allowsWeak()) {
5316 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5317 D.Diag(diag::err_objc_weak_unsupported);
5318 } else {
5319 WeakArg->render(Args, CmdArgs);
5320 }
5321 }
5322
Bob Wilsonb111ec92015-03-02 19:01:14 +00005323 if (Args.hasFlag(options::OPT_fapplication_extension,
5324 options::OPT_fno_application_extension, false))
5325 CmdArgs.push_back("-fapplication-extension");
5326
Reid Klecknerc542d372014-06-27 17:02:02 +00005327 // Handle GCC-style exception args.
5328 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005329 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5330 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005331
Tim Northovere931f9f2015-10-30 16:30:41 +00005332 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005333 CmdArgs.push_back("-fsjlj-exceptions");
5334
5335 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005336 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5337 options::OPT_fno_assume_sane_operator_new))
5338 CmdArgs.push_back("-fno-assume-sane-operator-new");
5339
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005340 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5341 // most platforms.
5342 if (Args.hasFlag(options::OPT_fsized_deallocation,
5343 options::OPT_fno_sized_deallocation, false))
5344 CmdArgs.push_back("-fsized-deallocation");
5345
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005346 // -fconstant-cfstrings is default, and may be subject to argument translation
5347 // on Darwin.
5348 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5349 options::OPT_fno_constant_cfstrings) ||
5350 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5351 options::OPT_mno_constant_cfstrings))
5352 CmdArgs.push_back("-fno-constant-cfstrings");
5353
John Thompsoned4e2952009-11-05 20:14:16 +00005354 // -fshort-wchar default varies depending on platform; only
5355 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005356 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5357 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005358 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005359
Hans Wennborg28c96312013-07-31 23:39:13 +00005360 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005361 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005362 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005363 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005364
Daniel Dunbar096ed292011-10-05 21:04:55 +00005365 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5366 // -fno-pack-struct doesn't apply to -fpack-struct=.
5367 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005368 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005369 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005370 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005371 } else if (Args.hasFlag(options::OPT_fpack_struct,
5372 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005373 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005374 }
5375
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005376 // Handle -fmax-type-align=N and -fno-type-align
5377 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5378 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5379 if (!SkipMaxTypeAlign) {
5380 std::string MaxTypeAlignStr = "-fmax-type-align=";
5381 MaxTypeAlignStr += A->getValue();
5382 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5383 }
5384 } else if (getToolChain().getTriple().isOSDarwin()) {
5385 if (!SkipMaxTypeAlign) {
5386 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5387 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5388 }
5389 }
5390
John Brawna7b4ec02015-08-10 11:11:28 +00005391 // -fcommon is the default unless compiling kernel code or the target says so
5392 bool NoCommonDefault =
5393 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5394 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5395 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005396 CmdArgs.push_back("-fno-common");
5397
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005398 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005399 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005400 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005401 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005402 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005403 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005404
Daniel Dunbar6358d682010-10-15 22:30:42 +00005405 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005406 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005407 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005408 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005409
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005410 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005411 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5412 StringRef value = inputCharset->getValue();
5413 if (value != "UTF-8")
5414 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5415 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005416 }
5417
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005418 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005419 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5420 StringRef value = execCharset->getValue();
5421 if (value != "UTF-8")
5422 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5423 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005424 }
5425
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005426 // -fcaret-diagnostics is default.
5427 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5428 options::OPT_fno_caret_diagnostics, true))
5429 CmdArgs.push_back("-fno-caret-diagnostics");
5430
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005431 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005432 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005433 options::OPT_fno_diagnostics_fixit_info))
5434 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005435
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005436 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005437 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005438 options::OPT_fno_diagnostics_show_option))
5439 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005440
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005441 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005442 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005443 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005444 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005445 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005446
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005447 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005448 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005449 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005450 }
5451
Chandler Carruthb6766f02011-03-27 01:50:55 +00005452 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005453 options::OPT_fdiagnostics_show_note_include_stack,
5454 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005455 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005456 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005457 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5458 else
5459 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5460 }
5461
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005462 // Color diagnostics are the default, unless the terminal doesn't support
5463 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005464 // Support both clang's -f[no-]color-diagnostics and gcc's
5465 // -f[no-]diagnostics-colors[=never|always|auto].
5466 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005467 for (const auto &Arg : Args) {
5468 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005469 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5470 !O.matches(options::OPT_fdiagnostics_color) &&
5471 !O.matches(options::OPT_fno_color_diagnostics) &&
5472 !O.matches(options::OPT_fno_diagnostics_color) &&
5473 !O.matches(options::OPT_fdiagnostics_color_EQ))
5474 continue;
5475
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005476 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005477 if (O.matches(options::OPT_fcolor_diagnostics) ||
5478 O.matches(options::OPT_fdiagnostics_color)) {
5479 ShowColors = Colors_On;
5480 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5481 O.matches(options::OPT_fno_diagnostics_color)) {
5482 ShowColors = Colors_Off;
5483 } else {
5484 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005485 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005486 if (value == "always")
5487 ShowColors = Colors_On;
5488 else if (value == "never")
5489 ShowColors = Colors_Off;
5490 else if (value == "auto")
5491 ShowColors = Colors_Auto;
5492 else
5493 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005494 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005495 }
5496 }
5497 if (ShowColors == Colors_On ||
5498 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005499 CmdArgs.push_back("-fcolor-diagnostics");
5500
Nico Rieck7857d462013-09-11 00:38:02 +00005501 if (Args.hasArg(options::OPT_fansi_escape_codes))
5502 CmdArgs.push_back("-fansi-escape-codes");
5503
Daniel Dunbardb097022009-06-08 21:13:54 +00005504 if (!Args.hasFlag(options::OPT_fshow_source_location,
5505 options::OPT_fno_show_source_location))
5506 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005507
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005508 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005509 true))
5510 CmdArgs.push_back("-fno-show-column");
5511
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005512 if (!Args.hasFlag(options::OPT_fspell_checking,
5513 options::OPT_fno_spell_checking))
5514 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005515
Chad Rosierc8e56e82012-12-05 21:08:21 +00005516 // -fno-asm-blocks is default.
5517 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5518 false))
5519 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005520
Steven Wucb0d13f2015-01-16 23:05:28 +00005521 // -fgnu-inline-asm is default.
5522 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5523 options::OPT_fno_gnu_inline_asm, true))
5524 CmdArgs.push_back("-fno-gnu-inline-asm");
5525
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005526 // Enable vectorization per default according to the optimization level
5527 // selected. For optimization levels that want vectorization we use the alias
5528 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005529 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005530 OptSpecifier VectorizeAliasOption =
5531 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005532 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005533 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005534 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005535
Chad Rosier136d67d2014-04-28 19:30:57 +00005536 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005537 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005538 OptSpecifier SLPVectAliasOption =
5539 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005540 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005541 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005542 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005543
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005544 // -fno-slp-vectorize-aggressive is default.
5545 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005546 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005547 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005548
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005549 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5550 A->render(Args, CmdArgs);
5551
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005552 // -fdollars-in-identifiers default varies depending on platform and
5553 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005554 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005555 options::OPT_fno_dollars_in_identifiers)) {
5556 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005557 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005558 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005559 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005560 }
5561
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005562 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5563 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005564 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005565 options::OPT_fno_unit_at_a_time)) {
5566 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005567 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005568 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005569
Eli Friedman055c9702011-11-02 01:53:16 +00005570 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5571 options::OPT_fno_apple_pragma_pack, false))
5572 CmdArgs.push_back("-fapple-pragma-pack");
5573
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005574 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005575 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5576 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005577 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005578 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005579 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005581// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5582//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005583// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005584#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005585 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005586 (getToolChain().getArch() == llvm::Triple::arm ||
5587 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005588 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5589 CmdArgs.push_back("-fno-builtin-strcat");
5590 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5591 CmdArgs.push_back("-fno-builtin-strcpy");
5592 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005593#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005594
Justin Bognera88f0122014-06-20 22:59:50 +00005595 // Enable rewrite includes if the user's asked for it or if we're generating
5596 // diagnostics.
5597 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5598 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005599 if (Args.hasFlag(options::OPT_frewrite_includes,
5600 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005601 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005602 CmdArgs.push_back("-frewrite-includes");
5603
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005604 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005605 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005606 options::OPT_traditional_cpp)) {
5607 if (isa<PreprocessJobAction>(JA))
5608 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005609 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005610 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005611 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005612
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005613 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005614 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005615
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005616 // Handle serialized diagnostics.
5617 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5618 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005619 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005620 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005621
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005622 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5623 CmdArgs.push_back("-fretain-comments-from-system-headers");
5624
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005625 // Forward -fcomment-block-commands to -cc1.
5626 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005627 // Forward -fparse-all-comments to -cc1.
5628 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005629
John Brawnad31ace2015-09-23 13:55:40 +00005630 // Turn -fplugin=name.so into -load name.so
5631 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5632 CmdArgs.push_back("-load");
5633 CmdArgs.push_back(A->getValue());
5634 A->claim();
5635 }
5636
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005637 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5638 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005639 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005640 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5641 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005642
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005643 // We translate this by hand to the -cc1 argument, since nightly test uses
5644 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005645 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005646 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005647 } else
Sean Silva14facf32015-06-09 01:57:17 +00005648 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005649 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005650
Bob Wilson23a55f12014-12-21 07:00:00 +00005651 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005652 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5653 // by the frontend.
5654 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5655 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005656
Daniel Dunbard67a3222009-03-30 06:36:42 +00005657 if (Output.getType() == types::TY_Dependencies) {
5658 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005659 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005660 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005661 CmdArgs.push_back(Output.getFilename());
5662 } else {
5663 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005664 }
5665
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005666 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005667
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005668 if (Input.isFilename())
5669 CmdArgs.push_back(Input.getFilename());
5670 else
5671 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005672
Chris Lattnere9d7d782009-11-03 19:50:27 +00005673 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5674
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005675 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005676
5677 // Optionally embed the -cc1 level arguments into the debug info, for build
5678 // analysis.
5679 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005680 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005681 for (const auto &Arg : Args)
5682 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005683
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005684 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005685 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005686 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005687 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005688 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005689 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005690 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005691 }
5692 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005693 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005694 }
5695
Eric Christopherd3804002013-02-22 20:12:52 +00005696 // Add the split debug info name to the command lines here so we
5697 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005698 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005699 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5700 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005701 const char *SplitDwarfOut;
5702 if (SplitDwarf) {
5703 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005704 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005705 CmdArgs.push_back(SplitDwarfOut);
5706 }
5707
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005708 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5709 // Include them with -fcuda-include-gpubinary.
5710 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005711 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005712 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005713 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005714 }
5715
Eric Christopherd3804002013-02-22 20:12:52 +00005716 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005717 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005718 Output.getType() == types::TY_Object &&
5719 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005720 auto CLCommand =
5721 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005722 C.addCommand(llvm::make_unique<FallbackCommand>(
5723 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005724 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5725 isa<PrecompileJobAction>(JA)) {
5726 // In /fallback builds, run the main compilation even if the pch generation
5727 // fails, so that the main compilation's fallback to cl.exe runs.
5728 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5729 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005730 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005731 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005732 }
5733
Eric Christopherf1545832013-02-22 23:50:16 +00005734 // Handle the debug info splitting at object creation time if we're
5735 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005736 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005737 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005738 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005739
Roman Divacky178e01602011-02-10 16:52:03 +00005740 if (Arg *A = Args.getLastArg(options::OPT_pg))
5741 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5743 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005744
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005745 // Claim some arguments which clang supports automatically.
5746
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005747 // -fpch-preprocess is used with gcc to add a special marker in the output to
5748 // include the PCH file. Clang's PTH solution is completely transparent, so we
5749 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005750 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005751
Daniel Dunbar17731772009-03-23 19:03:36 +00005752 // Claim some arguments which clang doesn't support, but we don't
5753 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005754 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5755 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005756
Rafael Espindolab0092d72013-09-04 19:37:35 +00005757 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005758 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005759}
5760
John McCall5fb5df92012-06-20 06:18:46 +00005761/// Add options related to the Objective-C runtime/ABI.
5762///
5763/// Returns true if the runtime is non-fragile.
5764ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5765 ArgStringList &cmdArgs,
5766 RewriteKind rewriteKind) const {
5767 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005768 Arg *runtimeArg =
5769 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5770 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005771
5772 // Just forward -fobjc-runtime= to the frontend. This supercedes
5773 // options about fragility.
5774 if (runtimeArg &&
5775 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5776 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005777 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005778 if (runtime.tryParse(value)) {
5779 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005780 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005781 }
5782
5783 runtimeArg->render(args, cmdArgs);
5784 return runtime;
5785 }
5786
5787 // Otherwise, we'll need the ABI "version". Version numbers are
5788 // slightly confusing for historical reasons:
5789 // 1 - Traditional "fragile" ABI
5790 // 2 - Non-fragile ABI, version 1
5791 // 3 - Non-fragile ABI, version 2
5792 unsigned objcABIVersion = 1;
5793 // If -fobjc-abi-version= is present, use that to set the version.
5794 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005795 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005796 if (value == "1")
5797 objcABIVersion = 1;
5798 else if (value == "2")
5799 objcABIVersion = 2;
5800 else if (value == "3")
5801 objcABIVersion = 3;
5802 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005803 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005804 } else {
5805 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005806 bool nonFragileABIIsDefault =
5807 (rewriteKind == RK_NonFragile ||
5808 (rewriteKind == RK_None &&
5809 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005810 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5811 options::OPT_fno_objc_nonfragile_abi,
5812 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005813// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005814#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5815 unsigned nonFragileABIVersion = 1;
5816#else
5817 unsigned nonFragileABIVersion = 2;
5818#endif
5819
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005820 if (Arg *abiArg =
5821 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005822 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005823 if (value == "1")
5824 nonFragileABIVersion = 1;
5825 else if (value == "2")
5826 nonFragileABIVersion = 2;
5827 else
5828 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005829 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005830 }
5831
5832 objcABIVersion = 1 + nonFragileABIVersion;
5833 } else {
5834 objcABIVersion = 1;
5835 }
5836 }
5837
5838 // We don't actually care about the ABI version other than whether
5839 // it's non-fragile.
5840 bool isNonFragile = objcABIVersion != 1;
5841
5842 // If we have no runtime argument, ask the toolchain for its default runtime.
5843 // However, the rewriter only really supports the Mac runtime, so assume that.
5844 ObjCRuntime runtime;
5845 if (!runtimeArg) {
5846 switch (rewriteKind) {
5847 case RK_None:
5848 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5849 break;
5850 case RK_Fragile:
5851 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5852 break;
5853 case RK_NonFragile:
5854 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5855 break;
5856 }
5857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005858 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005859 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5860 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005861 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005862 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5863
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005865 } else {
5866 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5867 }
5868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005869 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005870 } else {
5871 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005872 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005873 // non-fragile mode or the GCC runtime in fragile mode.
5874 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005875 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005876 else
5877 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005878 }
5879
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005880 cmdArgs.push_back(
5881 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005882 return runtime;
5883}
5884
Reid Klecknerc542d372014-06-27 17:02:02 +00005885static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5886 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5887 I += HaveDash;
5888 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005889}
Reid Klecknerc542d372014-06-27 17:02:02 +00005890
Benjamin Kramere003ca22015-10-28 13:54:16 +00005891namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005892struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005893 bool Synch = false;
5894 bool Asynch = false;
5895 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005896};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005897} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005898
5899/// /EH controls whether to run destructor cleanups when exceptions are
5900/// thrown. There are three modifiers:
5901/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5902/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5903/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005904/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005905/// The default is /EHs-c-, meaning cleanups are disabled.
5906static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5907 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005909 std::vector<std::string> EHArgs =
5910 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005911 for (auto EHVal : EHArgs) {
5912 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5913 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005914 case 'a':
5915 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005916 if (EH.Asynch)
5917 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005918 continue;
5919 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005920 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005921 continue;
5922 case 's':
5923 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005924 if (EH.Synch)
5925 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005926 continue;
5927 default:
5928 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005929 }
5930 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5931 break;
5932 }
5933 }
David Majnemerb8809092016-02-20 09:23:44 +00005934 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005935 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005936 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005937 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5938 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005939 EH.Synch = true;
5940 EH.NoUnwindC = true;
5941 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005942
Reid Klecknerc542d372014-06-27 17:02:02 +00005943 return EH;
5944}
5945
David Majnemercd5855e2016-02-29 01:40:36 +00005946void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5947 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005948 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005949 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005950 unsigned RTOptionID = options::OPT__SLASH_MT;
5951
Hans Wennborgf1a74252013-09-10 20:18:04 +00005952 if (Args.hasArg(options::OPT__SLASH_LDd))
5953 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5954 // but defining _DEBUG is sticky.
5955 RTOptionID = options::OPT__SLASH_MTd;
5956
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005957 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005958 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005959
David Majnemere2afb472015-07-24 06:49:13 +00005960 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 switch (RTOptionID) {
5962 case options::OPT__SLASH_MD:
5963 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005964 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005965 CmdArgs.push_back("-D_MT");
5966 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005967 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005968 break;
5969 case options::OPT__SLASH_MDd:
5970 CmdArgs.push_back("-D_DEBUG");
5971 CmdArgs.push_back("-D_MT");
5972 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005973 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 break;
5975 case options::OPT__SLASH_MT:
5976 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005977 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005978 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005979 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005980 break;
5981 case options::OPT__SLASH_MTd:
5982 CmdArgs.push_back("-D_DEBUG");
5983 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005984 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005985 break;
5986 default:
5987 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005988 }
5989
David Majnemere2afb472015-07-24 06:49:13 +00005990 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5991 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5992 } else {
5993 CmdArgs.push_back(FlagForCRT.data());
5994
5995 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5996 // users want. The /Za flag to cl.exe turns this off, but it's not
5997 // implemented in clang.
5998 CmdArgs.push_back("--dependent-lib=oldnames");
5999 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006000
Hans Wennborg8858a032014-07-21 23:42:07 +00006001 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6002 // would produce interleaved output, so ignore /showIncludes in such cases.
6003 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6004 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6005 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006006
David Majnemerf6072342014-07-01 22:24:56 +00006007 // This controls whether or not we emit RTTI data for polymorphic types.
6008 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6009 /*default=*/false))
6010 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006011
Reid Kleckner124955a2015-08-05 18:51:13 +00006012 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006013 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006014 if (*EmitCodeView)
6015 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006016 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006017 CmdArgs.push_back("-gcodeview");
6018
Reid Klecknerc542d372014-06-27 17:02:02 +00006019 const Driver &D = getToolChain().getDriver();
6020 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006021 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006022 if (types::isCXX(InputType))
6023 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006024 CmdArgs.push_back("-fexceptions");
6025 }
David Majnemercd5855e2016-02-29 01:40:36 +00006026 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6027 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006028
Hans Wennborge50cec32014-06-13 20:59:54 +00006029 // /EP should expand to -E -P.
6030 if (Args.hasArg(options::OPT__SLASH_EP)) {
6031 CmdArgs.push_back("-E");
6032 CmdArgs.push_back("-P");
6033 }
6034
David Majnemera5b195a2015-02-14 01:35:12 +00006035 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006036 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6037 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006038 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6039 else
6040 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6041
6042 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6043 VolatileOptionID = A->getOption().getID();
6044
6045 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6046 CmdArgs.push_back("-fms-volatile");
6047
David Majnemer86c318f2014-02-11 21:05:00 +00006048 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6049 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6050 if (MostGeneralArg && BestCaseArg)
6051 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6052 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6053
6054 if (MostGeneralArg) {
6055 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6056 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6057 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6058
6059 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6060 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6061 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6062 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6063 << FirstConflict->getAsString(Args)
6064 << SecondConflict->getAsString(Args);
6065
6066 if (SingleArg)
6067 CmdArgs.push_back("-fms-memptr-rep=single");
6068 else if (MultipleArg)
6069 CmdArgs.push_back("-fms-memptr-rep=multiple");
6070 else
6071 CmdArgs.push_back("-fms-memptr-rep=virtual");
6072 }
6073
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006074 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6075 A->render(Args, CmdArgs);
6076
Hans Wennborg81f74482013-09-10 01:07:07 +00006077 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6078 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006079 if (Args.hasArg(options::OPT__SLASH_fallback))
6080 CmdArgs.push_back("msvc-fallback");
6081 else
6082 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006083 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006084}
6085
Douglas Katzman95354292015-06-23 20:42:09 +00006086visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006087 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006088 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006089 return CLFallback.get();
6090}
6091
Daniel Sanders7f933f42015-01-30 17:35:23 +00006092void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6093 ArgStringList &CmdArgs) const {
6094 StringRef CPUName;
6095 StringRef ABIName;
6096 const llvm::Triple &Triple = getToolChain().getTriple();
6097 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6098
6099 CmdArgs.push_back("-target-abi");
6100 CmdArgs.push_back(ABIName.data());
6101}
6102
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006103void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006104 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006105 const ArgList &Args,
6106 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006107 ArgStringList CmdArgs;
6108
6109 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6110 const InputInfo &Input = Inputs[0];
6111
James Y Knight2db38f32015-08-15 03:45:25 +00006112 std::string TripleStr =
6113 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6114 const llvm::Triple Triple(TripleStr);
6115
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006116 // Don't warn about "clang -w -c foo.s"
6117 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006118 // and "clang -emit-llvm -c foo.s"
6119 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006120
Rafael Espindola577637a2015-01-03 00:06:04 +00006121 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006122
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006123 // Invoke ourselves in -cc1as mode.
6124 //
6125 // FIXME: Implement custom jobs for internal actions.
6126 CmdArgs.push_back("-cc1as");
6127
6128 // Add the "effective" target triple.
6129 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006130 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6131
6132 // Set the output mode, we currently only expect to be used as a real
6133 // assembler.
6134 CmdArgs.push_back("-filetype");
6135 CmdArgs.push_back("obj");
6136
Eric Christopher45f2e712012-12-18 00:31:10 +00006137 // Set the main file name, so that debug info works even with
6138 // -save-temps or preprocessed assembly.
6139 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006140 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006141
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006142 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006143 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006144 if (!CPU.empty()) {
6145 CmdArgs.push_back("-target-cpu");
6146 CmdArgs.push_back(Args.MakeArgString(CPU));
6147 }
6148
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006149 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006150 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006151
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006152 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006153 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006154
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006155 // Pass along any -I options so we get proper .include search paths.
6156 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6157
Eric Christopherfc3ee562012-01-10 00:38:01 +00006158 // Determine the original source input.
6159 const Action *SourceAction = &JA;
6160 while (SourceAction->getKind() != Action::InputClass) {
6161 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6162 SourceAction = SourceAction->getInputs()[0];
6163 }
6164
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006165 // Forward -g and handle debug info related flags, assuming we are dealing
6166 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006167 if (SourceAction->getType() == types::TY_Asm ||
6168 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006169 bool WantDebug = false;
6170 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006171 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006172 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006173 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6174 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006175 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006176 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006177 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006178 if (DwarfVersion == 0)
6179 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006180 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006181 (WantDebug ? codegenoptions::LimitedDebugInfo
6182 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006183 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006184
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006185 // Add the -fdebug-compilation-dir flag if needed.
6186 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006187
6188 // Set the AT_producer to the clang version when using the integrated
6189 // assembler on assembly source files.
6190 CmdArgs.push_back("-dwarf-debug-producer");
6191 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006192
6193 // And pass along -I options
6194 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006195 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006196
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006197 // Handle -fPIC et al -- the relocation-model affects the assembler
6198 // for some targets.
6199 llvm::Reloc::Model RelocationModel;
6200 unsigned PICLevel;
6201 bool IsPIE;
6202 std::tie(RelocationModel, PICLevel, IsPIE) =
6203 ParsePICArgs(getToolChain(), Triple, Args);
6204
6205 const char *RMName = RelocationModelName(RelocationModel);
6206 if (RMName) {
6207 CmdArgs.push_back("-mrelocation-model");
6208 CmdArgs.push_back(RMName);
6209 }
6210
Kevin Enderby292dc082011-12-22 19:31:58 +00006211 // Optionally embed the -cc1as level arguments into the debug info, for build
6212 // analysis.
6213 if (getToolChain().UseDwarfDebugFlags()) {
6214 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006215 for (const auto &Arg : Args)
6216 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006217
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006218 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006219 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6220 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006221 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006222 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006223 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006224 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006225 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006226 }
6227 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006228 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006229 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006230
6231 // FIXME: Add -static support, once we have it.
6232
Daniel Sanders7f933f42015-01-30 17:35:23 +00006233 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006234 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006235 default:
6236 break;
6237
6238 case llvm::Triple::mips:
6239 case llvm::Triple::mipsel:
6240 case llvm::Triple::mips64:
6241 case llvm::Triple::mips64el:
6242 AddMIPSTargetArgs(Args, CmdArgs);
6243 break;
6244 }
6245
David Blaikie372d9502014-01-17 03:17:40 +00006246 // Consume all the warning flags. Usually this would be handled more
6247 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6248 // doesn't handle that so rather than warning about unused flags that are
6249 // actually used, we'll lie by omission instead.
6250 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006251 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006252
David Blaikie9260ed62013-07-25 21:19:01 +00006253 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6254 getToolChain().getDriver());
6255
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006256 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006257
6258 assert(Output.isFilename() && "Unexpected lipo output.");
6259 CmdArgs.push_back("-o");
6260 CmdArgs.push_back(Output.getFilename());
6261
Daniel Dunbarb440f562010-08-02 02:38:21 +00006262 assert(Input.isFilename() && "Invalid input.");
6263 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006264
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006265 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006266 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006267
6268 // Handle the debug info splitting at object creation time if we're
6269 // creating an object.
6270 // TODO: Currently only works on linux with newer objcopy.
6271 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006272 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006273 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006274 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006275}
6276
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006277void GnuTool::anchor() {}
6278
Daniel Dunbara3246a02009-03-18 08:07:30 +00006279void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006280 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006281 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006282 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006283 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006284 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006285
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006286 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006287 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006288 // It is unfortunate that we have to claim here, as this means
6289 // we will basically never report anything interesting for
6290 // platforms using a generic gcc, even if we are just using gcc
6291 // to get to the assembler.
6292 A->claim();
6293
Daniel Dunbar939c1212010-08-03 16:14:14 +00006294 // Don't forward any -g arguments to assembly steps.
6295 if (isa<AssembleJobAction>(JA) &&
6296 A->getOption().matches(options::OPT_g_Group))
6297 continue;
6298
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006299 // Don't forward any -W arguments to assembly and link steps.
6300 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6301 A->getOption().matches(options::OPT_W_Group))
6302 continue;
6303
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006304 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006305 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006306 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006307
Daniel Dunbar4e295052010-01-25 22:35:08 +00006308 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006309
6310 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006311 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006312 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006313 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006314 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006315 }
6316
Daniel Dunbar5716d872009-05-02 21:41:52 +00006317 // Try to force gcc to match the tool chain we want, if we recognize
6318 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006319 //
6320 // FIXME: The triple class should directly provide the information we want
6321 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006322 switch (getToolChain().getArch()) {
6323 default:
6324 break;
6325 case llvm::Triple::x86:
6326 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006327 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006328 break;
6329 case llvm::Triple::x86_64:
6330 case llvm::Triple::ppc64:
6331 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006332 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006333 break;
6334 case llvm::Triple::sparcel:
6335 CmdArgs.push_back("-EL");
6336 break;
6337 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006338
Daniel Dunbarb440f562010-08-02 02:38:21 +00006339 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006340 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006341 CmdArgs.push_back(Output.getFilename());
6342 } else {
6343 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006344 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006345 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006346
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006347 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006348
6349 // Only pass -x if gcc will understand it; otherwise hope gcc
6350 // understands the suffix correctly. The main use case this would go
6351 // wrong in is for linker inputs if they happened to have an odd
6352 // suffix; really the only way to get this to happen is a command
6353 // like '-x foobar a.c' which will treat a.c like a linker input.
6354 //
6355 // FIXME: For the linker case specifically, can we safely convert
6356 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006357 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006358 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006359 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006360 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006361 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006362 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006363 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006364 else if (II.getType() == types::TY_ModuleFile)
6365 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006366 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006367
Daniel Dunbara3246a02009-03-18 08:07:30 +00006368 if (types::canTypeBeUserSpecified(II.getType())) {
6369 CmdArgs.push_back("-x");
6370 CmdArgs.push_back(types::getTypeName(II.getType()));
6371 }
6372
Daniel Dunbarb440f562010-08-02 02:38:21 +00006373 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006374 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006375 else {
6376 const Arg &A = II.getInputArg();
6377
6378 // Reverse translate some rewritten options.
6379 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6380 CmdArgs.push_back("-lstdc++");
6381 continue;
6382 }
6383
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006384 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006385 A.render(Args, CmdArgs);
6386 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006387 }
6388
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006389 const std::string customGCCName = D.getCCCGenericGCCName();
6390 const char *GCCName;
6391 if (!customGCCName.empty())
6392 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006393 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006394 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006395 } else
6396 GCCName = "gcc";
6397
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006398 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006399 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006400}
6401
Douglas Katzman95354292015-06-23 20:42:09 +00006402void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6403 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006404 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006405}
6406
Douglas Katzman95354292015-06-23 20:42:09 +00006407void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6408 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006409 const Driver &D = getToolChain().getDriver();
6410
Eric Christophercc7ff502015-01-29 00:56:17 +00006411 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006412 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006413 case types::TY_LLVM_IR:
6414 case types::TY_LTO_IR:
6415 case types::TY_LLVM_BC:
6416 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006417 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006418 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006419 // We assume we've got an "integrated" assembler in that gcc will produce an
6420 // object file itself.
6421 case types::TY_Object:
6422 CmdArgs.push_back("-c");
6423 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006424 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006425 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006426 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006427 case types::TY_Nothing:
6428 CmdArgs.push_back("-fsyntax-only");
6429 break;
6430 default:
6431 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006432 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006433}
6434
Douglas Katzman95354292015-06-23 20:42:09 +00006435void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6436 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006437 // The types are (hopefully) good enough.
6438}
6439
Tony Linthicum76329bf2011-12-12 21:14:55 +00006440// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006441void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006442 ArgStringList &CmdArgs) const {
6443}
6444
Douglas Katzman95354292015-06-23 20:42:09 +00006445void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6446 const InputInfo &Output,
6447 const InputInfoList &Inputs,
6448 const ArgList &Args,
6449 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006450 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006452 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6453 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454 ArgStringList CmdArgs;
6455
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006456 std::string MArchString = "-march=hexagon";
6457 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006458
6459 RenderExtraToolArgs(JA, CmdArgs);
6460
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006461 std::string AsName = "hexagon-llvm-mc";
6462 std::string MCpuString = "-mcpu=hexagon" +
6463 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6464 CmdArgs.push_back("-filetype=obj");
6465 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6466
Tony Linthicum76329bf2011-12-12 21:14:55 +00006467 if (Output.isFilename()) {
6468 CmdArgs.push_back("-o");
6469 CmdArgs.push_back(Output.getFilename());
6470 } else {
6471 assert(Output.isNothing() && "Unexpected output");
6472 CmdArgs.push_back("-fsyntax-only");
6473 }
6474
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6476 std::string N = llvm::utostr(G.getValue());
6477 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6478 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006480 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006481
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482 // Only pass -x if gcc will understand it; otherwise hope gcc
6483 // understands the suffix correctly. The main use case this would go
6484 // wrong in is for linker inputs if they happened to have an odd
6485 // suffix; really the only way to get this to happen is a command
6486 // like '-x foobar a.c' which will treat a.c like a linker input.
6487 //
6488 // FIXME: For the linker case specifically, can we safely convert
6489 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006490 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006491 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006492 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006493 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006494 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006495 else if (II.getType() == types::TY_AST)
6496 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006497 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006498 else if (II.getType() == types::TY_ModuleFile)
6499 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006501
6502 if (II.isFilename())
6503 CmdArgs.push_back(II.getFilename());
6504 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006505 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006506 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006507 II.getInputArg().render(Args, CmdArgs);
6508 }
6509
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006510 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006511 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006512}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006513
Douglas Katzman95354292015-06-23 20:42:09 +00006514void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6515 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006516}
6517
Douglas Katzman54366072015-07-27 16:53:08 +00006518static void
6519constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006521 const InputInfo &Output, const InputInfoList &Inputs,
6522 const ArgList &Args, ArgStringList &CmdArgs,
6523 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006524
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006526
Matthew Curtise689b052012-12-06 15:46:07 +00006527 //----------------------------------------------------------------------------
6528 //
6529 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006530 bool IsStatic = Args.hasArg(options::OPT_static);
6531 bool IsShared = Args.hasArg(options::OPT_shared);
6532 bool IsPIE = Args.hasArg(options::OPT_pie);
6533 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6534 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6535 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6536 bool UseG0 = false;
6537 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006538
Matthew Curtise689b052012-12-06 15:46:07 +00006539 //----------------------------------------------------------------------------
6540 // Silence warnings for various options
6541 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006542 Args.ClaimAllArgs(options::OPT_g_Group);
6543 Args.ClaimAllArgs(options::OPT_emit_llvm);
6544 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6545 // handled somewhere else.
6546 Args.ClaimAllArgs(options::OPT_static_libgcc);
6547
6548 //----------------------------------------------------------------------------
6549 //
6550 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006551 if (Args.hasArg(options::OPT_s))
6552 CmdArgs.push_back("-s");
6553
6554 if (Args.hasArg(options::OPT_r))
6555 CmdArgs.push_back("-r");
6556
6557 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006558 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006560 CmdArgs.push_back("-march=hexagon");
6561 std::string CpuVer =
6562 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6563 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6564 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006565
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006566 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006567 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568 // The following should be the default, but doing as hexagon-gcc does.
6569 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570 }
6571
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006572 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006573 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006574
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006575 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006576 CmdArgs.push_back("-pie");
6577
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006578 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6579 std::string N = llvm::utostr(G.getValue());
6580 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6581 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006582 }
6583
Matthew Curtise689b052012-12-06 15:46:07 +00006584 //----------------------------------------------------------------------------
6585 //
6586 //----------------------------------------------------------------------------
6587 CmdArgs.push_back("-o");
6588 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006589
Matthew Curtise689b052012-12-06 15:46:07 +00006590 //----------------------------------------------------------------------------
6591 // moslib
6592 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006593 std::vector<std::string> OsLibs;
6594 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006595
Sean Silva14facf32015-06-09 01:57:17 +00006596 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6597 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006598 OsLibs.emplace_back(A->getValue());
6599 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006600 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006601 if (OsLibs.empty()) {
6602 OsLibs.push_back("standalone");
6603 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006604 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006605
Matthew Curtise689b052012-12-06 15:46:07 +00006606 //----------------------------------------------------------------------------
6607 // Start Files
6608 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006609 const std::string MCpuSuffix = "/" + CpuVer;
6610 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6611 const std::string RootDir =
6612 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6613 const std::string StartSubDir =
6614 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006615
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006616 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6617 const char *Name) -> std::string {
6618 std::string RelName = SubDir + Name;
6619 std::string P = HTC.GetFilePath(RelName.c_str());
6620 if (llvm::sys::fs::exists(P))
6621 return P;
6622 return RootDir + RelName;
6623 };
6624
6625 if (IncStdLib && IncStartFiles) {
6626 if (!IsShared) {
6627 if (HasStandalone) {
6628 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6629 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006630 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006631 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6632 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006633 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634 std::string Init = UseShared
6635 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6636 : Find(RootDir, StartSubDir, "/init.o");
6637 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006638 }
6639
6640 //----------------------------------------------------------------------------
6641 // Library Search Paths
6642 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006643 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6644 for (const auto &LibPath : LibPaths)
6645 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006646
6647 //----------------------------------------------------------------------------
6648 //
6649 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006650 Args.AddAllArgs(CmdArgs,
6651 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6652 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006653
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006654 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006655
6656 //----------------------------------------------------------------------------
6657 // Libraries
6658 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006659 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006660 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006661 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006662 CmdArgs.push_back("-lm");
6663 }
6664
6665 CmdArgs.push_back("--start-group");
6666
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006667 if (!IsShared) {
6668 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006669 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006670 CmdArgs.push_back("-lc");
6671 }
6672 CmdArgs.push_back("-lgcc");
6673
6674 CmdArgs.push_back("--end-group");
6675 }
6676
6677 //----------------------------------------------------------------------------
6678 // End files
6679 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006680 if (IncStdLib && IncStartFiles) {
6681 std::string Fini = UseShared
6682 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6683 : Find(RootDir, StartSubDir, "/fini.o");
6684 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006685 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006686}
6687
Douglas Katzman95354292015-06-23 20:42:09 +00006688void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6689 const InputInfo &Output,
6690 const InputInfoList &Inputs,
6691 const ArgList &Args,
6692 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006693 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006694
6695 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006696 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006697 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006698
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006699 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006700 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006701 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006702}
6703// Hexagon tools end.
6704
Tom Stellard8fa33092015-07-18 01:49:05 +00006705void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6706 const InputInfo &Output,
6707 const InputInfoList &Inputs,
6708 const ArgList &Args,
6709 const char *LinkingOutput) const {
6710
6711 std::string Linker = getToolChain().GetProgramPath(getShortName());
6712 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006713 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6714 CmdArgs.push_back("-o");
6715 CmdArgs.push_back(Output.getFilename());
6716 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6717 CmdArgs, Inputs));
6718}
6719// AMDGPU tools end.
6720
Dan Gohman52816862015-12-16 23:30:41 +00006721wasm::Linker::Linker(const ToolChain &TC)
6722 : GnuTool("wasm::Linker", "lld", TC) {}
6723
6724bool wasm::Linker::isLinkJob() const {
6725 return true;
6726}
6727
6728bool wasm::Linker::hasIntegratedCPP() const {
6729 return false;
6730}
6731
6732void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6733 const InputInfo &Output,
6734 const InputInfoList &Inputs,
6735 const ArgList &Args,
6736 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006737
6738 const ToolChain &ToolChain = getToolChain();
6739 const Driver &D = ToolChain.getDriver();
6740 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006741 ArgStringList CmdArgs;
6742 CmdArgs.push_back("-flavor");
6743 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006744
6745 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006746 // size is of particular importance. This is significantly facilitated by
6747 // the enabling of -ffunction-sections and -fdata-sections in
6748 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006749 if (areOptimizationsEnabled(Args))
6750 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006751
Dan Gohman57b62c52016-02-22 19:26:15 +00006752 if (Args.hasArg(options::OPT_rdynamic))
6753 CmdArgs.push_back("-export-dynamic");
6754 if (Args.hasArg(options::OPT_s))
6755 CmdArgs.push_back("--strip-all");
6756 if (Args.hasArg(options::OPT_shared))
6757 CmdArgs.push_back("-shared");
6758 if (Args.hasArg(options::OPT_static))
6759 CmdArgs.push_back("-Bstatic");
6760
6761 Args.AddAllArgs(CmdArgs, options::OPT_L);
6762 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6763
6764 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6765 if (Args.hasArg(options::OPT_shared))
6766 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6767 else if (Args.hasArg(options::OPT_pie))
6768 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6769 else
6770 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6771
6772 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6773 }
6774
6775 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6776
6777 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6778 if (D.CCCIsCXX())
6779 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6780
6781 if (Args.hasArg(options::OPT_pthread))
6782 CmdArgs.push_back("-lpthread");
6783
6784 CmdArgs.push_back("-lc");
6785 CmdArgs.push_back("-lcompiler_rt");
6786 }
6787
6788 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6789 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6790
Dan Gohman52816862015-12-16 23:30:41 +00006791 CmdArgs.push_back("-o");
6792 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006793
Dan Gohman52816862015-12-16 23:30:41 +00006794 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6795}
6796
Renato Golin7c542b42015-07-27 23:44:45 +00006797const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006798 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006799 if (!Arch.empty())
6800 MArch = Arch;
6801 else
Bernard Ogden31561762013-12-12 13:27:11 +00006802 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006803 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006804
6805 // Handle -march=native.
6806 if (MArch == "native") {
6807 std::string CPU = llvm::sys::getHostCPUName();
6808 if (CPU != "generic") {
6809 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006810 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006811 // If there is no valid architecture suffix for this CPU we don't know how
6812 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006813 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006814 MArch = "";
6815 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006816 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006817 }
6818 }
6819
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006820 return MArch;
6821}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006822
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006823/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006824StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006825 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006826 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6827 // here means an -march=native that we can't handle, so instead return no CPU.
6828 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006829 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006830
John Brawna95c1a82015-05-08 12:52:18 +00006831 // We need to return an empty string here on invalid MArch values as the
6832 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006833 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006834}
6835
6836/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006837std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006838 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006839 // FIXME: Warn on inconsistent use of -mcpu and -march.
6840 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006841 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006842 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006843 // Handle -mcpu=native.
6844 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006845 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006846 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006847 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006848 }
6849
Renato Goline17c5802015-07-27 23:44:42 +00006850 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006851}
6852
6853/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006854/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006855// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006856StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6857 const llvm::Triple &Triple) {
6858 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006859 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006860 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006861 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006862 if (ArchKind == llvm::ARM::AK_INVALID)
6863 // In case of generic Arch, i.e. "arm",
6864 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006865 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006866 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006867 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6868 // armv7k triple if it's actually been specified via "-arch armv7k".
6869 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006870 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006871 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006872 }
Renato Golin3c007252015-05-28 15:05:53 +00006873 if (ArchKind == llvm::ARM::AK_INVALID)
6874 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006875 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006876}
6877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006878void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006879 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006880 if (Args.hasArg(options::OPT_r))
6881 return;
6882
John Brawn94fd9632015-05-21 12:19:49 +00006883 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6884 // to generate BE-8 executables.
6885 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6886 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006887}
6888
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006889mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006890 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6891 // was first introduced in Release 3. However, other compilers have
6892 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006893 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6894 .Case("mips1", NanLegacy)
6895 .Case("mips2", NanLegacy)
6896 .Case("mips3", NanLegacy)
6897 .Case("mips4", NanLegacy)
6898 .Case("mips5", NanLegacy)
6899 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006900 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006901 .Case("mips32r3", NanLegacy | Nan2008)
6902 .Case("mips32r5", NanLegacy | Nan2008)
6903 .Case("mips32r6", Nan2008)
6904 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006905 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006906 .Case("mips64r3", NanLegacy | Nan2008)
6907 .Case("mips64r5", NanLegacy | Nan2008)
6908 .Case("mips64r6", Nan2008)
6909 .Default(NanLegacy);
6910}
6911
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006912bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6913 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6914 return A && (A->getValue() == StringRef(Value));
6915}
6916
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006917bool mips::isUCLibc(const ArgList &Args) {
6918 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006919 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006920}
6921
Daniel Sanders2bf13662014-07-10 14:40:57 +00006922bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006923 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6924 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006925 .Case("2008", true)
6926 .Case("legacy", false)
6927 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006928
6929 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006930 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006931 .Cases("mips32r6", "mips64r6", true)
6932 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006933
6934 return false;
6935}
6936
Daniel Sanders379d44b2014-07-16 11:52:23 +00006937bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006938 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006939 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006940 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006941 return false;
6942
6943 if (ABIName != "32")
6944 return false;
6945
Toma Tabacu94ea6862015-06-16 13:54:13 +00006946 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6947 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006948 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006949 return false;
6950
Daniel Sanders379d44b2014-07-16 11:52:23 +00006951 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006952 .Cases("mips2", "mips3", "mips4", "mips5", true)
6953 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6954 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6955 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006956}
6957
Toma Tabacu94ea6862015-06-16 13:54:13 +00006958bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6959 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006960 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006961 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6962
6963 // FPXX shouldn't be used if -msingle-float is present.
6964 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6965 options::OPT_mdouble_float))
6966 if (A->getOption().matches(options::OPT_msingle_float))
6967 UseFPXX = false;
6968
6969 return UseFPXX;
6970}
6971
Tim Northover157d9112014-01-16 08:48:16 +00006972llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006973 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6974 // archs which Darwin doesn't use.
6975
6976 // The matching this routine does is fairly pointless, since it is neither the
6977 // complete architecture list, nor a reasonable subset. The problem is that
6978 // historically the driver driver accepts this and also ties its -march=
6979 // handling to the architecture name, so we need to be careful before removing
6980 // support for it.
6981
6982 // This code must be kept in sync with Clang's Darwin specific argument
6983 // translation.
6984
6985 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006986 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6987 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6988 .Case("ppc64", llvm::Triple::ppc64)
6989 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6990 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6991 llvm::Triple::x86)
6992 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6993 // This is derived from the driver driver.
6994 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6995 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6996 .Cases("armv7s", "xscale", llvm::Triple::arm)
6997 .Case("arm64", llvm::Triple::aarch64)
6998 .Case("r600", llvm::Triple::r600)
6999 .Case("amdgcn", llvm::Triple::amdgcn)
7000 .Case("nvptx", llvm::Triple::nvptx)
7001 .Case("nvptx64", llvm::Triple::nvptx64)
7002 .Case("amdil", llvm::Triple::amdil)
7003 .Case("spir", llvm::Triple::spir)
7004 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007005}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007006
Tim Northover157d9112014-01-16 08:48:16 +00007007void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007008 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007009 T.setArch(Arch);
7010
7011 if (Str == "x86_64h")
7012 T.setArchName(Str);
7013 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7014 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007015 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007016 }
7017}
7018
Bob Wilsondecc03e2012-11-23 06:14:39 +00007019const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007020 const InputInfo &Input) {
7021 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007022}
7023
Bob Wilsondecc03e2012-11-23 06:14:39 +00007024const char *Clang::getBaseInputStem(const ArgList &Args,
7025 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007026 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007027
Chris Lattner906bb902011-01-16 08:14:11 +00007028 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007029 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007030
7031 return Str;
7032}
7033
Bob Wilsondecc03e2012-11-23 06:14:39 +00007034const char *Clang::getDependencyFileName(const ArgList &Args,
7035 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007036 // FIXME: Think about this more.
7037 std::string Res;
7038
7039 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007040 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007041 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007042 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007043 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007044 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007045 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007046}
7047
Douglas Katzman95354292015-06-23 20:42:09 +00007048void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7049 const InputInfo &Output,
7050 const InputInfoList &Inputs,
7051 const ArgList &Args,
7052 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007053 const ToolChain &ToolChain = getToolChain();
7054 const Driver &D = ToolChain.getDriver();
7055 ArgStringList CmdArgs;
7056
7057 // Silence warning for "clang -g foo.o -o foo"
7058 Args.ClaimAllArgs(options::OPT_g_Group);
7059 // and "clang -emit-llvm foo.o -o foo"
7060 Args.ClaimAllArgs(options::OPT_emit_llvm);
7061 // and for "clang -w foo.o -o foo". Other warning options are already
7062 // handled somewhere else.
7063 Args.ClaimAllArgs(options::OPT_w);
7064
7065 if (!D.SysRoot.empty())
7066 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7067
7068 // CloudABI only supports static linkage.
7069 CmdArgs.push_back("-Bstatic");
7070 CmdArgs.push_back("--eh-frame-hdr");
7071 CmdArgs.push_back("--gc-sections");
7072
7073 if (Output.isFilename()) {
7074 CmdArgs.push_back("-o");
7075 CmdArgs.push_back(Output.getFilename());
7076 } else {
7077 assert(Output.isNothing() && "Invalid output.");
7078 }
7079
Douglas Katzman78b37b02015-11-17 20:28:07 +00007080 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007081 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7082 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7083 }
7084
7085 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007086 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007087 Args.AddAllArgs(CmdArgs,
7088 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7089 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007090
Teresa Johnson945bc502015-10-15 20:35:53 +00007091 if (D.isUsingLTO())
7092 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007093
7094 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7095
Douglas Katzman78b37b02015-11-17 20:28:07 +00007096 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007097 if (D.CCCIsCXX())
7098 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7099 CmdArgs.push_back("-lc");
7100 CmdArgs.push_back("-lcompiler_rt");
7101 }
7102
Douglas Katzman78b37b02015-11-17 20:28:07 +00007103 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007104 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7105
7106 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007107 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007108}
7109
Douglas Katzman95354292015-06-23 20:42:09 +00007110void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7111 const InputInfo &Output,
7112 const InputInfoList &Inputs,
7113 const ArgList &Args,
7114 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007115 ArgStringList CmdArgs;
7116
7117 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7118 const InputInfo &Input = Inputs[0];
7119
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007120 // Determine the original source input.
7121 const Action *SourceAction = &JA;
7122 while (SourceAction->getKind() != Action::InputClass) {
7123 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7124 SourceAction = SourceAction->getInputs()[0];
7125 }
7126
Eric Christopherf5a8f492015-12-08 00:10:10 +00007127 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007128 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007129 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7130 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007131 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007132 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007133 const llvm::Triple &T(getToolChain().getTriple());
7134 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007135 CmdArgs.push_back("-Q");
7136 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007137
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007138 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007139 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007140 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007141 if (Args.hasArg(options::OPT_gstabs))
7142 CmdArgs.push_back("--gstabs");
7143 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007144 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007145 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007146
Daniel Dunbarbe220842009-03-20 16:06:39 +00007147 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007148 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007149
Daniel Dunbar6d484762010-07-22 01:47:22 +00007150 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007151 if (getToolChain().getArch() == llvm::Triple::x86 ||
7152 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007153 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7154 CmdArgs.push_back("-force_cpusubtype_ALL");
7155
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007156 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007157 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007158 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007159 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007160 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007161 CmdArgs.push_back("-static");
7162
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007163 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007164
7165 assert(Output.isFilename() && "Unexpected lipo output.");
7166 CmdArgs.push_back("-o");
7167 CmdArgs.push_back(Output.getFilename());
7168
Daniel Dunbarb440f562010-08-02 02:38:21 +00007169 assert(Input.isFilename() && "Invalid input.");
7170 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007171
7172 // asm_final spec is empty.
7173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007174 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007175 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007176}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007177
Tim Northover157d9112014-01-16 08:48:16 +00007178void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007179
Tim Northover157d9112014-01-16 08:48:16 +00007180void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7181 ArgStringList &CmdArgs) const {
7182 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007183
Daniel Dunbarc1964212009-03-26 16:23:12 +00007184 // Derived from darwin_arch spec.
7185 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007186 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007187
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007188 // FIXME: Is this needed anymore?
7189 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007190 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007191}
7192
Douglas Katzman95354292015-06-23 20:42:09 +00007193bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007194 // We only need to generate a temp path for LTO if we aren't compiling object
7195 // files. When compiling source files, we run 'dsymutil' after linking. We
7196 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007197 for (const auto &Input : Inputs)
7198 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007199 return true;
7200
7201 return false;
7202}
7203
Douglas Katzman95354292015-06-23 20:42:09 +00007204void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7205 ArgStringList &CmdArgs,
7206 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007207 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007208 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007210 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007211 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7212 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007213 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7214 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007215 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007216 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007217 }
7218
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007219 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007220 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007221 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7222 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007223
Bob Wilson3d27dad2013-08-02 22:25:34 +00007224 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7225 CmdArgs.push_back("-export_dynamic");
7226
Bob Wilsonb111ec92015-03-02 19:01:14 +00007227 // If we are using App Extension restrictions, pass a flag to the linker
7228 // telling it that the compiled code has been audited.
7229 if (Args.hasFlag(options::OPT_fapplication_extension,
7230 options::OPT_fno_application_extension, false))
7231 CmdArgs.push_back("-application_extension");
7232
Teresa Johnson945bc502015-10-15 20:35:53 +00007233 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007234 // If we are using LTO, then automatically create a temporary file path for
7235 // the linker to use, so that it's lifetime will extend past a possible
7236 // dsymutil step.
7237 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7238 const char *TmpPath = C.getArgs().MakeArgString(
7239 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7240 C.addTempFile(TmpPath);
7241 CmdArgs.push_back("-object_path_lto");
7242 CmdArgs.push_back(TmpPath);
7243 }
7244
7245 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7246 // it in clang installed libraries. If not found, the option is not used
7247 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7248 if (Version[0] >= 133) {
7249 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7250 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7251 SmallString<128> LibLTOPath(P);
7252 llvm::sys::path::append(LibLTOPath, "lib");
7253 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7254 if (llvm::sys::fs::exists(LibLTOPath)) {
7255 CmdArgs.push_back("-lto_library");
7256 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7257 } else {
7258 D.Diag(diag::warn_drv_lto_libpath);
7259 }
7260 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007261 }
7262
Daniel Dunbarc1964212009-03-26 16:23:12 +00007263 // Derived from the "link" spec.
7264 Args.AddAllArgs(CmdArgs, options::OPT_static);
7265 if (!Args.hasArg(options::OPT_static))
7266 CmdArgs.push_back("-dynamic");
7267 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7268 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7269 // here. How do we wish to handle such things?
7270 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007271
Daniel Dunbarc1964212009-03-26 16:23:12 +00007272 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007273 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007274 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007275 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007276
7277 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7278 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7279 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7280
7281 Arg *A;
7282 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7283 (A = Args.getLastArg(options::OPT_current__version)) ||
7284 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007285 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7286 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007287
7288 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7289 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7290 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7291 } else {
7292 CmdArgs.push_back("-dylib");
7293
7294 Arg *A;
7295 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7296 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7297 (A = Args.getLastArg(options::OPT_client__name)) ||
7298 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7299 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7300 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007301 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7302 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007303
Daniel Dunbarc1964212009-03-26 16:23:12 +00007304 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7305 "-dylib_compatibility_version");
7306 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7307 "-dylib_current_version");
7308
Tim Northover157d9112014-01-16 08:48:16 +00007309 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007310
7311 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7312 "-dylib_install_name");
7313 }
7314
7315 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7316 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7317 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007318 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007319 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007320 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7321 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7322 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7323 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7324 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7325 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007326 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007327 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7328 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7329 Args.AddAllArgs(CmdArgs, options::OPT_init);
7330
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007331 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007332 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007333
Daniel Dunbarc1964212009-03-26 16:23:12 +00007334 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7335 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7336 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7337 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7338 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007339
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007340 if (const Arg *A =
7341 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7342 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007343 if (A->getOption().matches(options::OPT_fpie) ||
7344 A->getOption().matches(options::OPT_fPIE))
7345 CmdArgs.push_back("-pie");
7346 else
7347 CmdArgs.push_back("-no_pie");
7348 }
Steven Wu574b0f22016-03-01 01:07:58 +00007349 // for embed-bitcode, use -bitcode_bundle in linker command
7350 if (C.getDriver().embedBitcodeEnabled() ||
7351 C.getDriver().embedBitcodeMarkerOnly()) {
7352 // Check if the toolchain supports bitcode build flow.
7353 if (MachOTC.SupportsEmbeddedBitcode())
7354 CmdArgs.push_back("-bitcode_bundle");
7355 else
7356 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7357 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007358
7359 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7360 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7361 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7362 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7363 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7364 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7365 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7366 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7367 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7368 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7369 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7370 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7371 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7372 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7373 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7374 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007375
Daniel Dunbar84384642011-05-02 21:03:47 +00007376 // Give --sysroot= preference, over the Apple specific behavior to also use
7377 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007378 StringRef sysroot = C.getSysRoot();
7379 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007380 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007381 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007382 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7383 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007384 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007385 }
7386
Daniel Dunbarc1964212009-03-26 16:23:12 +00007387 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7388 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7389 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7390 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7391 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007392 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007393 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7394 Args.AddAllArgs(CmdArgs, options::OPT_y);
7395 Args.AddLastArg(CmdArgs, options::OPT_w);
7396 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7397 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7398 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7399 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7400 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7401 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7402 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7403 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7404 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7405 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7406 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7407 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7408}
7409
Douglas Katzman95354292015-06-23 20:42:09 +00007410void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7411 const InputInfo &Output,
7412 const InputInfoList &Inputs,
7413 const ArgList &Args,
7414 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007415 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007416
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007417 // If the number of arguments surpasses the system limits, we will encode the
7418 // input files in a separate file, shortening the command line. To this end,
7419 // build a list of input file names that can be passed via a file with the
7420 // -filelist linker option.
7421 llvm::opt::ArgStringList InputFileList;
7422
Daniel Dunbarc1964212009-03-26 16:23:12 +00007423 // The logic here is derived from gcc's behavior; most of which
7424 // comes from specs (starting with link_command). Consult gcc for
7425 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007426 ArgStringList CmdArgs;
7427
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007428 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7429 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7430 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007431 for (const auto &Arg : Args)
7432 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007433 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007434 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007435 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007437 return;
7438 }
7439
Daniel Dunbarc1964212009-03-26 16:23:12 +00007440 // I'm not sure why this particular decomposition exists in gcc, but
7441 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007442 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007443
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007444 // It seems that the 'e' option is completely ignored for dynamic executables
7445 // (the default), and with static executables, the last one wins, as expected.
7446 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7447 options::OPT_Z_Flag, options::OPT_u_Group,
7448 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007449
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007450 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7451 // members of static archive libraries which implement Objective-C classes or
7452 // categories.
7453 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7454 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007455
Daniel Dunbarc1964212009-03-26 16:23:12 +00007456 CmdArgs.push_back("-o");
7457 CmdArgs.push_back(Output.getFilename());
7458
Douglas Katzman78b37b02015-11-17 20:28:07 +00007459 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007460 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007461
Peter Collingbournec4122c12015-06-15 21:08:13 +00007462 // SafeStack requires its own runtime libraries
7463 // These libraries should be linked first, to make sure the
7464 // __safestack_init constructor executes before everything else
7465 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7466 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7467 "libclang_rt.safestack_osx.a",
7468 /*AlwaysLink=*/true);
7469 }
7470
Daniel Dunbarc1964212009-03-26 16:23:12 +00007471 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007472
Douglas Gregor9295df02012-05-15 21:00:27 +00007473 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007474 // Build the input file for -filelist (list of linker input files) in case we
7475 // need it later
7476 for (const auto &II : Inputs) {
7477 if (!II.isFilename()) {
7478 // This is a linker input argument.
7479 // We cannot mix input arguments and file names in a -filelist input, thus
7480 // we prematurely stop our list (remaining files shall be passed as
7481 // arguments).
7482 if (InputFileList.size() > 0)
7483 break;
7484
7485 continue;
7486 }
7487
7488 InputFileList.push_back(II.getFilename());
7489 }
7490
Douglas Katzman78b37b02015-11-17 20:28:07 +00007491 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007492 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7493
Douglas Katzman78b37b02015-11-17 20:28:07 +00007494 if (isObjCRuntimeLinked(Args) &&
7495 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007496 // We use arclite library for both ARC and subscripting support.
7497 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7498
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007499 CmdArgs.push_back("-framework");
7500 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007501 // Link libobj.
7502 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007503 }
John McCall31168b02011-06-15 23:02:42 +00007504
Daniel Dunbarc1964212009-03-26 16:23:12 +00007505 if (LinkingOutput) {
7506 CmdArgs.push_back("-arch_multiple");
7507 CmdArgs.push_back("-final_output");
7508 CmdArgs.push_back(LinkingOutput);
7509 }
7510
Daniel Dunbarc1964212009-03-26 16:23:12 +00007511 if (Args.hasArg(options::OPT_fnested_functions))
7512 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007513
Justin Bognerc7701242015-05-12 05:44:36 +00007514 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7515
Douglas Katzman78b37b02015-11-17 20:28:07 +00007516 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007517 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007518 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007519
Daniel Dunbarc1964212009-03-26 16:23:12 +00007520 // link_ssp spec is empty.
7521
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007522 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007523 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007524 }
7525
Douglas Katzman78b37b02015-11-17 20:28:07 +00007526 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007527 // endfile_spec is empty.
7528 }
7529
7530 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7531 Args.AddAllArgs(CmdArgs, options::OPT_F);
7532
Steven Wu3ffb61b2015-02-06 18:08:29 +00007533 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007534 for (const Arg *A : Args.filtered(options::OPT_iframework))
7535 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007536
Douglas Katzman78b37b02015-11-17 20:28:07 +00007537 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007538 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7539 if (A->getValue() == StringRef("Accelerate")) {
7540 CmdArgs.push_back("-framework");
7541 CmdArgs.push_back("Accelerate");
7542 }
7543 }
7544 }
7545
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007546 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007547 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007548 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007549 Cmd->setInputFileList(std::move(InputFileList));
7550 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007551}
7552
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007553void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007554 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007555 const InputInfoList &Inputs,
7556 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007557 const char *LinkingOutput) const {
7558 ArgStringList CmdArgs;
7559
7560 CmdArgs.push_back("-create");
7561 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007562
7563 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007564 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007565
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007566 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007567 assert(II.isFilename() && "Unexpected lipo input.");
7568 CmdArgs.push_back(II.getFilename());
7569 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007570
7571 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007572 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007573}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007574
Daniel Dunbar88299622010-06-04 18:28:36 +00007575void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007576 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007577 const InputInfoList &Inputs,
7578 const ArgList &Args,
7579 const char *LinkingOutput) const {
7580 ArgStringList CmdArgs;
7581
Daniel Dunbareb86b042011-05-09 17:23:16 +00007582 CmdArgs.push_back("-o");
7583 CmdArgs.push_back(Output.getFilename());
7584
Daniel Dunbar88299622010-06-04 18:28:36 +00007585 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7586 const InputInfo &Input = Inputs[0];
7587 assert(Input.isFilename() && "Unexpected dsymutil input.");
7588 CmdArgs.push_back(Input.getFilename());
7589
Daniel Dunbar88299622010-06-04 18:28:36 +00007590 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007591 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007592 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007593}
7594
Eric Christopher551ef452011-08-23 17:56:55 +00007595void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007596 const InputInfo &Output,
7597 const InputInfoList &Inputs,
7598 const ArgList &Args,
7599 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007600 ArgStringList CmdArgs;
7601 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007602 CmdArgs.push_back("--debug-info");
7603 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007604 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007605
7606 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7607 const InputInfo &Input = Inputs[0];
7608 assert(Input.isFilename() && "Unexpected verify input");
7609
7610 // Grabbing the output of the earlier dsymutil run.
7611 CmdArgs.push_back(Input.getFilename());
7612
7613 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007614 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007615 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007616}
7617
Douglas Katzman95354292015-06-23 20:42:09 +00007618void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007619 const InputInfo &Output,
7620 const InputInfoList &Inputs,
7621 const ArgList &Args,
7622 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007623 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007624 ArgStringList CmdArgs;
7625
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007626 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007627
7628 CmdArgs.push_back("-o");
7629 CmdArgs.push_back(Output.getFilename());
7630
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007631 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007632 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007633
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007634 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007635 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007636}
7637
Douglas Katzman95354292015-06-23 20:42:09 +00007638void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7639 const InputInfo &Output,
7640 const InputInfoList &Inputs,
7641 const ArgList &Args,
7642 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007643 ArgStringList CmdArgs;
7644
David Chisnall272a0712012-02-29 15:06:12 +00007645 // Demangle C++ names in errors
7646 CmdArgs.push_back("-C");
7647
Douglas Katzman78b37b02015-11-17 20:28:07 +00007648 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007649 CmdArgs.push_back("-e");
7650 CmdArgs.push_back("_start");
7651 }
7652
7653 if (Args.hasArg(options::OPT_static)) {
7654 CmdArgs.push_back("-Bstatic");
7655 CmdArgs.push_back("-dn");
7656 } else {
7657 CmdArgs.push_back("-Bdynamic");
7658 if (Args.hasArg(options::OPT_shared)) {
7659 CmdArgs.push_back("-shared");
7660 } else {
7661 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007662 CmdArgs.push_back(
7663 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007664 }
7665 }
7666
7667 if (Output.isFilename()) {
7668 CmdArgs.push_back("-o");
7669 CmdArgs.push_back(Output.getFilename());
7670 } else {
7671 assert(Output.isNothing() && "Invalid output.");
7672 }
7673
Douglas Katzman78b37b02015-11-17 20:28:07 +00007674 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007675 if (!Args.hasArg(options::OPT_shared))
7676 CmdArgs.push_back(
7677 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7678
7679 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7680 CmdArgs.push_back(
7681 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7682 CmdArgs.push_back(
7683 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007684 }
7685
Douglas Katzman6059ef92015-11-17 17:41:23 +00007686 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007687
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007688 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7689 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007690
7691 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7692
Douglas Katzman78b37b02015-11-17 20:28:07 +00007693 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007694 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007695 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007696 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007697 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007698 if (!Args.hasArg(options::OPT_shared)) {
7699 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007700 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007701 }
David Chisnallf571cde2012-02-15 13:39:01 +00007702 }
7703
Douglas Katzman78b37b02015-11-17 20:28:07 +00007704 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007705 CmdArgs.push_back(
7706 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007707 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007708 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007709
Xinliang David Li69306c02015-10-22 06:15:31 +00007710 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007712 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007713 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007714}
7715
Douglas Katzman95354292015-06-23 20:42:09 +00007716void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7717 const InputInfo &Output,
7718 const InputInfoList &Inputs,
7719 const ArgList &Args,
7720 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007721 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007722 ArgStringList CmdArgs;
7723
Rafael Espindolacc126272014-02-28 01:55:21 +00007724 switch (getToolChain().getArch()) {
7725 case llvm::Triple::x86:
7726 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7727 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007728 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007729 break;
7730
7731 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007732 CmdArgs.push_back("-mppc");
7733 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007734 break;
7735
7736 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007737 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007738 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007739 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7740 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7741 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007742 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007743 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007744
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007745 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007746 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007747 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7748 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7749 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007750 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007751 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007752
7753 case llvm::Triple::mips64:
7754 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007755 StringRef CPUName;
7756 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007757 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007758
7759 CmdArgs.push_back("-mabi");
7760 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7761
7762 if (getToolChain().getArch() == llvm::Triple::mips64)
7763 CmdArgs.push_back("-EB");
7764 else
7765 CmdArgs.push_back("-EL");
7766
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007767 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007768 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007769 }
7770
Rafael Espindolacc126272014-02-28 01:55:21 +00007771 default:
7772 break;
7773 }
7774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007775 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007776
7777 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007778 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007779
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007780 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007781 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007783 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007784 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007785}
7786
Douglas Katzman95354292015-06-23 20:42:09 +00007787void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7788 const InputInfo &Output,
7789 const InputInfoList &Inputs,
7790 const ArgList &Args,
7791 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007792 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007793 ArgStringList CmdArgs;
7794
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007795 // Silence warning for "clang -g foo.o -o foo"
7796 Args.ClaimAllArgs(options::OPT_g_Group);
7797 // and "clang -emit-llvm foo.o -o foo"
7798 Args.ClaimAllArgs(options::OPT_emit_llvm);
7799 // and for "clang -w foo.o -o foo". Other warning options are already
7800 // handled somewhere else.
7801 Args.ClaimAllArgs(options::OPT_w);
7802
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007803 if (getToolChain().getArch() == llvm::Triple::mips64)
7804 CmdArgs.push_back("-EB");
7805 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7806 CmdArgs.push_back("-EL");
7807
Douglas Katzman78b37b02015-11-17 20:28:07 +00007808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007809 CmdArgs.push_back("-e");
7810 CmdArgs.push_back("__start");
7811 }
7812
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007813 if (Args.hasArg(options::OPT_static)) {
7814 CmdArgs.push_back("-Bstatic");
7815 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007816 if (Args.hasArg(options::OPT_rdynamic))
7817 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007818 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007819 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007820 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007821 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007822 } else {
7823 CmdArgs.push_back("-dynamic-linker");
7824 CmdArgs.push_back("/usr/libexec/ld.so");
7825 }
7826 }
7827
Rafael Espindola044f7832013-06-05 04:28:55 +00007828 if (Args.hasArg(options::OPT_nopie))
7829 CmdArgs.push_back("-nopie");
7830
Daniel Dunbarb440f562010-08-02 02:38:21 +00007831 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007832 CmdArgs.push_back("-o");
7833 CmdArgs.push_back(Output.getFilename());
7834 } else {
7835 assert(Output.isNothing() && "Invalid output.");
7836 }
7837
Douglas Katzman78b37b02015-11-17 20:28:07 +00007838 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007839 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007840 if (Args.hasArg(options::OPT_pg))
7841 CmdArgs.push_back(
7842 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007843 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007844 CmdArgs.push_back(
7845 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7846 CmdArgs.push_back(
7847 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007848 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007849 CmdArgs.push_back(
7850 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007851 }
7852 }
7853
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007854 std::string Triple = getToolChain().getTripleString();
7855 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007856 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007857 CmdArgs.push_back(
7858 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007859
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007860 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7861 options::OPT_e, options::OPT_s, options::OPT_t,
7862 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007863
Daniel Dunbar54423b22010-09-17 00:24:54 +00007864 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007865
Douglas Katzman78b37b02015-11-17 20:28:07 +00007866 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007867 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007868 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007869 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007870 CmdArgs.push_back("-lm_p");
7871 else
7872 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007873 }
7874
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007875 // FIXME: For some reason GCC passes -lgcc before adding
7876 // the default system libraries. Just mimic this for now.
7877 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007878
Eric Christopher17674ec2012-09-13 06:32:34 +00007879 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007880 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7881 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007882 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007883 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007884 }
7885
Chandler Carruth45661652011-12-17 22:32:42 +00007886 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007887 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007888 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007889 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007890 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007891 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007892
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007893 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007894 }
7895
Douglas Katzman78b37b02015-11-17 20:28:07 +00007896 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007897 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007898 CmdArgs.push_back(
7899 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007900 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 CmdArgs.push_back(
7902 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903 }
7904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007905 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007906 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007907}
Ed Schoutene33194b2009-04-02 19:13:12 +00007908
Douglas Katzman95354292015-06-23 20:42:09 +00007909void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7910 const InputInfo &Output,
7911 const InputInfoList &Inputs,
7912 const ArgList &Args,
7913 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007914 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007915 ArgStringList CmdArgs;
7916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007917 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007918
7919 CmdArgs.push_back("-o");
7920 CmdArgs.push_back(Output.getFilename());
7921
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007922 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007923 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007924
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007925 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007926 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007927}
7928
Douglas Katzman95354292015-06-23 20:42:09 +00007929void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7930 const InputInfo &Output,
7931 const InputInfoList &Inputs,
7932 const ArgList &Args,
7933 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007934 const Driver &D = getToolChain().getDriver();
7935 ArgStringList CmdArgs;
7936
Douglas Katzman78b37b02015-11-17 20:28:07 +00007937 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007938 CmdArgs.push_back("-e");
7939 CmdArgs.push_back("__start");
7940 }
7941
7942 if (Args.hasArg(options::OPT_static)) {
7943 CmdArgs.push_back("-Bstatic");
7944 } else {
7945 if (Args.hasArg(options::OPT_rdynamic))
7946 CmdArgs.push_back("-export-dynamic");
7947 CmdArgs.push_back("--eh-frame-hdr");
7948 CmdArgs.push_back("-Bdynamic");
7949 if (Args.hasArg(options::OPT_shared)) {
7950 CmdArgs.push_back("-shared");
7951 } else {
7952 CmdArgs.push_back("-dynamic-linker");
7953 CmdArgs.push_back("/usr/libexec/ld.so");
7954 }
7955 }
7956
7957 if (Output.isFilename()) {
7958 CmdArgs.push_back("-o");
7959 CmdArgs.push_back(Output.getFilename());
7960 } else {
7961 assert(Output.isNothing() && "Invalid output.");
7962 }
7963
Douglas Katzman78b37b02015-11-17 20:28:07 +00007964 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007965 if (!Args.hasArg(options::OPT_shared)) {
7966 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007967 CmdArgs.push_back(
7968 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007969 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 CmdArgs.push_back(
7971 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7972 CmdArgs.push_back(
7973 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007974 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007975 CmdArgs.push_back(
7976 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007977 }
7978 }
7979
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007980 Args.AddAllArgs(CmdArgs,
7981 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007982
7983 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7984
Douglas Katzman78b37b02015-11-17 20:28:07 +00007985 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007986 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007987 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7988 if (Args.hasArg(options::OPT_pg))
7989 CmdArgs.push_back("-lm_p");
7990 else
7991 CmdArgs.push_back("-lm");
7992 }
7993
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007994 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007995 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007996 CmdArgs.push_back("-lpthread_p");
7997 else
7998 CmdArgs.push_back("-lpthread");
7999 }
8000
Eli Friedman9fa28852012-08-08 23:57:20 +00008001 if (!Args.hasArg(options::OPT_shared)) {
8002 if (Args.hasArg(options::OPT_pg))
8003 CmdArgs.push_back("-lc_p");
8004 else
8005 CmdArgs.push_back("-lc");
8006 }
8007
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008008 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008009 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008010 case llvm::Triple::arm:
8011 MyArch = "arm";
8012 break;
8013 case llvm::Triple::x86:
8014 MyArch = "i386";
8015 break;
8016 case llvm::Triple::x86_64:
8017 MyArch = "amd64";
8018 break;
8019 default:
8020 llvm_unreachable("Unsupported architecture");
8021 }
8022 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008023 }
8024
Douglas Katzman78b37b02015-11-17 20:28:07 +00008025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008026 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008027 CmdArgs.push_back(
8028 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008029 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008030 CmdArgs.push_back(
8031 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008032 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008034 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008035 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008036}
8037
Douglas Katzman95354292015-06-23 20:42:09 +00008038void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8039 const InputInfo &Output,
8040 const InputInfoList &Inputs,
8041 const ArgList &Args,
8042 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008043 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008044 ArgStringList CmdArgs;
8045
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008046 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8047 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008048 switch (getToolChain().getArch()) {
8049 default:
8050 break;
8051 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008052 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008053 break;
8054 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008055 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008056 break;
8057 case llvm::Triple::mips:
8058 case llvm::Triple::mipsel:
8059 case llvm::Triple::mips64:
8060 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008061 StringRef CPUName;
8062 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008063 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008064
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008065 CmdArgs.push_back("-march");
8066 CmdArgs.push_back(CPUName.data());
8067
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008068 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008069 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008070
8071 if (getToolChain().getArch() == llvm::Triple::mips ||
8072 getToolChain().getArch() == llvm::Triple::mips64)
8073 CmdArgs.push_back("-EB");
8074 else
8075 CmdArgs.push_back("-EL");
8076
Dimitry Andric46f338c2015-12-27 10:36:44 +00008077 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8078 StringRef v = A->getValue();
8079 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8080 A->claim();
8081 }
8082
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008083 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008084 break;
8085 }
8086 case llvm::Triple::arm:
8087 case llvm::Triple::armeb:
8088 case llvm::Triple::thumb:
8089 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008090 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008091
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008092 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008093 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008094 else
Renato Golinf4421f72014-02-19 10:44:07 +00008095 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008096
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008097 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008098 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008099 case llvm::Triple::GNUEABI:
8100 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008101 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008102 break;
8103
8104 default:
8105 CmdArgs.push_back("-matpcs");
8106 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008107 break;
8108 }
8109 case llvm::Triple::sparc:
8110 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008111 case llvm::Triple::sparcv9: {
8112 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8113 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008114 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008115 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008116 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008117 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008119 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008120
8121 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008122 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008123
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008124 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008125 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008126
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008127 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008128 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008129}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008130
Douglas Katzman95354292015-06-23 20:42:09 +00008131void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8132 const InputInfo &Output,
8133 const InputInfoList &Inputs,
8134 const ArgList &Args,
8135 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008136 const toolchains::FreeBSD &ToolChain =
8137 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008138 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008139 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008140 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 !Args.hasArg(options::OPT_shared) &&
8142 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008143 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008144
8145 // Silence warning for "clang -g foo.o -o foo"
8146 Args.ClaimAllArgs(options::OPT_g_Group);
8147 // and "clang -emit-llvm foo.o -o foo"
8148 Args.ClaimAllArgs(options::OPT_emit_llvm);
8149 // and for "clang -w foo.o -o foo". Other warning options are already
8150 // handled somewhere else.
8151 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008152
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008153 if (!D.SysRoot.empty())
8154 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8155
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008156 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008157 CmdArgs.push_back("-pie");
8158
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008159 if (Args.hasArg(options::OPT_static)) {
8160 CmdArgs.push_back("-Bstatic");
8161 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008162 if (Args.hasArg(options::OPT_rdynamic))
8163 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008164 CmdArgs.push_back("--eh-frame-hdr");
8165 if (Args.hasArg(options::OPT_shared)) {
8166 CmdArgs.push_back("-Bshareable");
8167 } else {
8168 CmdArgs.push_back("-dynamic-linker");
8169 CmdArgs.push_back("/libexec/ld-elf.so.1");
8170 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008171 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008172 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8173 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8174 CmdArgs.push_back("--hash-style=both");
8175 }
8176 }
8177 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008178 }
8179
8180 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8181 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008182 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008183 CmdArgs.push_back("-m");
8184 CmdArgs.push_back("elf_i386_fbsd");
8185 }
8186
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008187 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008188 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008189 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008190 }
8191
Dimitry Andric904895f2015-12-27 06:47:09 +00008192 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8193 if (ToolChain.getArch() == llvm::Triple::mips ||
8194 ToolChain.getArch() == llvm::Triple::mipsel ||
8195 ToolChain.getArch() == llvm::Triple::mips64 ||
8196 ToolChain.getArch() == llvm::Triple::mips64el) {
8197 StringRef v = A->getValue();
8198 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8199 A->claim();
8200 }
8201 }
8202
Daniel Dunbarb440f562010-08-02 02:38:21 +00008203 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008204 CmdArgs.push_back("-o");
8205 CmdArgs.push_back(Output.getFilename());
8206 } else {
8207 assert(Output.isNothing() && "Invalid output.");
8208 }
8209
Douglas Katzman78b37b02015-11-17 20:28:07 +00008210 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008211 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008212 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008213 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008214 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008215 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008216 crt1 = "Scrt1.o";
8217 else
8218 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008219 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008220 if (crt1)
8221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8222
8223 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8224
Craig Topper92fc2df2014-05-17 16:56:41 +00008225 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008226 if (Args.hasArg(options::OPT_static))
8227 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008228 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008229 crtbegin = "crtbeginS.o";
8230 else
8231 crtbegin = "crtbegin.o";
8232
8233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008234 }
8235
8236 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008237 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008238 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8239 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008240 Args.AddAllArgs(CmdArgs, options::OPT_s);
8241 Args.AddAllArgs(CmdArgs, options::OPT_t);
8242 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8243 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244
Teresa Johnson945bc502015-10-15 20:35:53 +00008245 if (D.isUsingLTO())
8246 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008247
Alexey Samsonov52550342014-09-15 19:58:40 +00008248 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008249 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008250
Douglas Katzman78b37b02015-11-17 20:28:07 +00008251 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008252 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008253 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008254 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008255 if (Args.hasArg(options::OPT_pg))
8256 CmdArgs.push_back("-lm_p");
8257 else
8258 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008259 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008260 if (NeedsSanitizerDeps)
8261 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008262 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8263 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008264 if (Args.hasArg(options::OPT_pg))
8265 CmdArgs.push_back("-lgcc_p");
8266 else
8267 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008268 if (Args.hasArg(options::OPT_static)) {
8269 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008270 } else if (Args.hasArg(options::OPT_pg)) {
8271 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008272 } else {
8273 CmdArgs.push_back("--as-needed");
8274 CmdArgs.push_back("-lgcc_s");
8275 CmdArgs.push_back("--no-as-needed");
8276 }
8277
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008278 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008279 if (Args.hasArg(options::OPT_pg))
8280 CmdArgs.push_back("-lpthread_p");
8281 else
8282 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008283 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008284
Roman Divacky66f22762011-02-10 16:59:40 +00008285 if (Args.hasArg(options::OPT_pg)) {
8286 if (Args.hasArg(options::OPT_shared))
8287 CmdArgs.push_back("-lc");
8288 else
8289 CmdArgs.push_back("-lc_p");
8290 CmdArgs.push_back("-lgcc_p");
8291 } else {
8292 CmdArgs.push_back("-lc");
8293 CmdArgs.push_back("-lgcc");
8294 }
8295
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008296 if (Args.hasArg(options::OPT_static)) {
8297 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008298 } else if (Args.hasArg(options::OPT_pg)) {
8299 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008300 } else {
8301 CmdArgs.push_back("--as-needed");
8302 CmdArgs.push_back("-lgcc_s");
8303 CmdArgs.push_back("--no-as-needed");
8304 }
8305 }
8306
Douglas Katzman78b37b02015-11-17 20:28:07 +00008307 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008308 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008310 else
8311 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008313 }
8314
Xinliang David Li69306c02015-10-22 06:15:31 +00008315 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008316
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008317 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008318 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008319}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008320
Douglas Katzman95354292015-06-23 20:42:09 +00008321void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008322 const InputInfo &Output,
8323 const InputInfoList &Inputs,
8324 const ArgList &Args,
8325 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008326 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008327 ArgStringList CmdArgs;
8328
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008329 // GNU as needs different flags for creating the correct output format
8330 // on architectures with different ABIs or optional feature sets.
8331 switch (getToolChain().getArch()) {
8332 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008333 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008334 break;
8335 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008336 case llvm::Triple::armeb:
8337 case llvm::Triple::thumb:
8338 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008339 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008340 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8341 std::string Arch =
8342 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008343 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008344 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008345 }
8346
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008347 case llvm::Triple::mips:
8348 case llvm::Triple::mipsel:
8349 case llvm::Triple::mips64:
8350 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008351 StringRef CPUName;
8352 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008353 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008354
8355 CmdArgs.push_back("-march");
8356 CmdArgs.push_back(CPUName.data());
8357
8358 CmdArgs.push_back("-mabi");
8359 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8360
8361 if (getToolChain().getArch() == llvm::Triple::mips ||
8362 getToolChain().getArch() == llvm::Triple::mips64)
8363 CmdArgs.push_back("-EB");
8364 else
8365 CmdArgs.push_back("-EL");
8366
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008367 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008368 break;
8369 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008370
8371 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008372 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008373 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008374 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8375 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008376 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008377 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008378 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008379
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008380 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008381 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008382 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8383 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008384 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008385 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008386 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008387
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008388 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008389 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008390 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008391
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008392 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008393
8394 CmdArgs.push_back("-o");
8395 CmdArgs.push_back(Output.getFilename());
8396
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008397 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008398 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399
David Chisnallddbd68f2011-09-27 22:03:18 +00008400 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008401 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008402}
8403
Douglas Katzman95354292015-06-23 20:42:09 +00008404void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8405 const InputInfo &Output,
8406 const InputInfoList &Inputs,
8407 const ArgList &Args,
8408 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008409 const Driver &D = getToolChain().getDriver();
8410 ArgStringList CmdArgs;
8411
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008412 if (!D.SysRoot.empty())
8413 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8414
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008415 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008416 if (Args.hasArg(options::OPT_static)) {
8417 CmdArgs.push_back("-Bstatic");
8418 } else {
8419 if (Args.hasArg(options::OPT_rdynamic))
8420 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421 if (Args.hasArg(options::OPT_shared)) {
8422 CmdArgs.push_back("-Bshareable");
8423 } else {
8424 CmdArgs.push_back("-dynamic-linker");
8425 CmdArgs.push_back("/libexec/ld.elf_so");
8426 }
8427 }
8428
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008429 // Many NetBSD architectures support more than one ABI.
8430 // Determine the correct emulation for ld.
8431 switch (getToolChain().getArch()) {
8432 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008433 CmdArgs.push_back("-m");
8434 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008435 break;
8436 case llvm::Triple::arm:
8437 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008438 CmdArgs.push_back("-m");
8439 switch (getToolChain().getTriple().getEnvironment()) {
8440 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008441 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008442 CmdArgs.push_back("armelf_nbsd_eabi");
8443 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008444 case llvm::Triple::EABIHF:
8445 case llvm::Triple::GNUEABIHF:
8446 CmdArgs.push_back("armelf_nbsd_eabihf");
8447 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008448 default:
8449 CmdArgs.push_back("armelf_nbsd");
8450 break;
8451 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008452 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008453 case llvm::Triple::armeb:
8454 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008455 arm::appendEBLinkFlags(
8456 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008457 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008458 CmdArgs.push_back("-m");
8459 switch (getToolChain().getTriple().getEnvironment()) {
8460 case llvm::Triple::EABI:
8461 case llvm::Triple::GNUEABI:
8462 CmdArgs.push_back("armelfb_nbsd_eabi");
8463 break;
8464 case llvm::Triple::EABIHF:
8465 case llvm::Triple::GNUEABIHF:
8466 CmdArgs.push_back("armelfb_nbsd_eabihf");
8467 break;
8468 default:
8469 CmdArgs.push_back("armelfb_nbsd");
8470 break;
8471 }
8472 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008473 case llvm::Triple::mips64:
8474 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008475 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008476 CmdArgs.push_back("-m");
8477 if (getToolChain().getArch() == llvm::Triple::mips64)
8478 CmdArgs.push_back("elf32btsmip");
8479 else
8480 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008481 } else if (mips::hasMipsAbiArg(Args, "64")) {
8482 CmdArgs.push_back("-m");
8483 if (getToolChain().getArch() == llvm::Triple::mips64)
8484 CmdArgs.push_back("elf64btsmip");
8485 else
8486 CmdArgs.push_back("elf64ltsmip");
8487 }
8488 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008489 case llvm::Triple::ppc:
8490 CmdArgs.push_back("-m");
8491 CmdArgs.push_back("elf32ppc_nbsd");
8492 break;
8493
8494 case llvm::Triple::ppc64:
8495 case llvm::Triple::ppc64le:
8496 CmdArgs.push_back("-m");
8497 CmdArgs.push_back("elf64ppc");
8498 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008499
8500 case llvm::Triple::sparc:
8501 CmdArgs.push_back("-m");
8502 CmdArgs.push_back("elf32_sparc");
8503 break;
8504
8505 case llvm::Triple::sparcv9:
8506 CmdArgs.push_back("-m");
8507 CmdArgs.push_back("elf64_sparc");
8508 break;
8509
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008510 default:
8511 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008512 }
8513
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008514 if (Output.isFilename()) {
8515 CmdArgs.push_back("-o");
8516 CmdArgs.push_back(Output.getFilename());
8517 } else {
8518 assert(Output.isNothing() && "Invalid output.");
8519 }
8520
Douglas Katzman78b37b02015-11-17 20:28:07 +00008521 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008522 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008523 CmdArgs.push_back(
8524 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8525 CmdArgs.push_back(
8526 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8527 CmdArgs.push_back(
8528 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008529 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008530 CmdArgs.push_back(
8531 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8532 CmdArgs.push_back(
8533 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008534 }
8535 }
8536
8537 Args.AddAllArgs(CmdArgs, options::OPT_L);
8538 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8539 Args.AddAllArgs(CmdArgs, options::OPT_e);
8540 Args.AddAllArgs(CmdArgs, options::OPT_s);
8541 Args.AddAllArgs(CmdArgs, options::OPT_t);
8542 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8543 Args.AddAllArgs(CmdArgs, options::OPT_r);
8544
8545 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8546
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008547 unsigned Major, Minor, Micro;
8548 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8549 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008550 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008551 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008552 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008553 case llvm::Triple::arm:
8554 case llvm::Triple::armeb:
8555 case llvm::Triple::thumb:
8556 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008557 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008558 case llvm::Triple::ppc64:
8559 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008560 case llvm::Triple::sparc:
8561 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008562 case llvm::Triple::x86:
8563 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008564 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008565 break;
8566 default:
8567 break;
8568 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008569 }
8570
Douglas Katzman78b37b02015-11-17 20:28:07 +00008571 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008572 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008573 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008574 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8575 CmdArgs.push_back("-lm");
8576 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008577 if (Args.hasArg(options::OPT_pthread))
8578 CmdArgs.push_back("-lpthread");
8579 CmdArgs.push_back("-lc");
8580
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008581 if (useLibgcc) {
8582 if (Args.hasArg(options::OPT_static)) {
8583 // libgcc_eh depends on libc, so resolve as much as possible,
8584 // pull in any new requirements from libc and then get the rest
8585 // of libgcc.
8586 CmdArgs.push_back("-lgcc_eh");
8587 CmdArgs.push_back("-lc");
8588 CmdArgs.push_back("-lgcc");
8589 } else {
8590 CmdArgs.push_back("-lgcc");
8591 CmdArgs.push_back("--as-needed");
8592 CmdArgs.push_back("-lgcc_s");
8593 CmdArgs.push_back("--no-as-needed");
8594 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008595 }
8596 }
8597
Douglas Katzman78b37b02015-11-17 20:28:07 +00008598 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008599 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008600 CmdArgs.push_back(
8601 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008602 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008603 CmdArgs.push_back(
8604 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8605 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008606 }
8607
Xinliang David Li69306c02015-10-22 06:15:31 +00008608 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008609
Logan Chieneb9162f2014-06-26 14:23:45 +00008610 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008611 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008612}
8613
Douglas Katzman95354292015-06-23 20:42:09 +00008614void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8615 const InputInfo &Output,
8616 const InputInfoList &Inputs,
8617 const ArgList &Args,
8618 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008619 claimNoWarnArgs(Args);
8620
James Y Knight2db38f32015-08-15 03:45:25 +00008621 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8622 llvm::Triple Triple = llvm::Triple(TripleStr);
8623
Rafael Espindola92b00932010-08-10 00:25:48 +00008624 ArgStringList CmdArgs;
8625
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008626 llvm::Reloc::Model RelocationModel;
8627 unsigned PICLevel;
8628 bool IsPIE;
8629 std::tie(RelocationModel, PICLevel, IsPIE) =
8630 ParsePICArgs(getToolChain(), Triple, Args);
8631
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008632 switch (getToolChain().getArch()) {
8633 default:
8634 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008635 // Add --32/--64 to make sure we get the format we want.
8636 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008637 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008638 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008639 break;
8640 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008641 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8642 CmdArgs.push_back("--x32");
8643 else
8644 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008645 break;
8646 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008647 CmdArgs.push_back("-a32");
8648 CmdArgs.push_back("-mppc");
8649 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008650 break;
8651 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008652 CmdArgs.push_back("-a64");
8653 CmdArgs.push_back("-mppc64");
8654 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008655 break;
8656 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008657 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008658 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008659 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008660 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008661 break;
8662 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008663 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008664 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008665 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8666 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8667 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008668 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008669 }
8670 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008671 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008672 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8673 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8674 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008675 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008676 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008677 case llvm::Triple::arm:
8678 case llvm::Triple::armeb:
8679 case llvm::Triple::thumb:
8680 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008681 const llvm::Triple &Triple2 = getToolChain().getTriple();
8682 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008683 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008684 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008685 break;
8686 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008687 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008688 break;
8689 default:
8690 break;
8691 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008692
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008693 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008694 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8695 case arm::FloatABI::Soft:
8696 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8697 break;
8698 case arm::FloatABI::SoftFP:
8699 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8700 break;
8701 case arm::FloatABI::Hard:
8702 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8703 break;
8704 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008705
8706 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008707
8708 // FIXME: remove krait check when GNU tools support krait cpu
8709 // for now replace it with -march=armv7-a to avoid a lower
8710 // march from being picked in the absence of a cpu flag.
8711 Arg *A;
8712 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008713 StringRef(A->getValue()).lower() == "krait")
8714 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008715 else
8716 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008717 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008718 break;
8719 }
8720 case llvm::Triple::mips:
8721 case llvm::Triple::mipsel:
8722 case llvm::Triple::mips64:
8723 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008724 StringRef CPUName;
8725 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008726 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008727 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008728
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008729 CmdArgs.push_back("-march");
8730 CmdArgs.push_back(CPUName.data());
8731
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008732 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008733 CmdArgs.push_back(ABIName.data());
8734
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008735 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8736 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008737 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008738 CmdArgs.push_back("-mno-shared");
8739
Daniel Sanders379d44b2014-07-16 11:52:23 +00008740 // LLVM doesn't support -mplt yet and acts as if it is always given.
8741 // However, -mplt has no effect with the N64 ABI.
8742 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008743
8744 if (getToolChain().getArch() == llvm::Triple::mips ||
8745 getToolChain().getArch() == llvm::Triple::mips64)
8746 CmdArgs.push_back("-EB");
8747 else
8748 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008749
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008750 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8751 if (StringRef(A->getValue()) == "2008")
8752 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8753 }
8754
Daniel Sanders379d44b2014-07-16 11:52:23 +00008755 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8756 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8757 options::OPT_mfp64)) {
8758 A->claim();
8759 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008760 } else if (mips::shouldUseFPXX(
8761 Args, getToolChain().getTriple(), CPUName, ABIName,
8762 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008763 CmdArgs.push_back("-mfpxx");
8764
8765 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8766 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008767 if (Arg *A =
8768 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008769 if (A->getOption().matches(options::OPT_mips16)) {
8770 A->claim();
8771 A->render(Args, CmdArgs);
8772 } else {
8773 A->claim();
8774 CmdArgs.push_back("-no-mips16");
8775 }
8776 }
8777
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008778 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8779 options::OPT_mno_micromips);
8780 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8781 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8782
Simon Atanasyanbd986632013-11-26 11:58:04 +00008783 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8784 // Do not use AddLastArg because not all versions of MIPS assembler
8785 // support -mmsa / -mno-msa options.
8786 if (A->getOption().matches(options::OPT_mmsa))
8787 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8788 }
8789
Daniel Sanders379d44b2014-07-16 11:52:23 +00008790 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8791 options::OPT_msoft_float);
8792
Toma Tabacub36d6102015-06-11 12:13:18 +00008793 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8794 options::OPT_msingle_float);
8795
Daniel Sanders379d44b2014-07-16 11:52:23 +00008796 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8797 options::OPT_mno_odd_spreg);
8798
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008799 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008800 break;
8801 }
8802 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008803 // Always pass an -march option, since our default of z10 is later
8804 // than the GNU assembler's default.
8805 StringRef CPUName = getSystemZTargetCPU(Args);
8806 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008807 break;
8808 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008809 }
8810
Renato Golina74bbc72015-07-22 15:32:36 +00008811 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008812 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008813
8814 CmdArgs.push_back("-o");
8815 CmdArgs.push_back(Output.getFilename());
8816
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008817 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008818 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008820 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008822
8823 // Handle the debug info splitting at object creation time if we're
8824 // creating an object.
8825 // TODO: Currently only works on linux with newer objcopy.
8826 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008827 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008828 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008829 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008830}
8831
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008832static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008833 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008834 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008835 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008836 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8837 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008838 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008839 CmdArgs.push_back("-lgcc");
8840
Logan Chien3d3373c2012-11-19 12:04:11 +00008841 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008842 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008843 CmdArgs.push_back("-lgcc");
8844 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008845 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008846 CmdArgs.push_back("--as-needed");
8847 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008848 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008849 CmdArgs.push_back("--no-as-needed");
8850 }
8851
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008852 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008853 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008854 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008855 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008856
8857 // According to Android ABI, we have to link with libdl if we are
8858 // linking with non-static libgcc.
8859 //
8860 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8861 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8862 if (isAndroid && !StaticLibgcc)
8863 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008864}
8865
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008866static std::string getLinuxDynamicLinker(const ArgList &Args,
8867 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008868 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8869
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008870 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008871 if (ToolChain.getTriple().isArch64Bit())
8872 return "/system/bin/linker64";
8873 else
8874 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008875 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8876 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008877 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008878 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008879 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008880 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008881 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008882 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008883 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008884 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008885 return "/lib/ld-linux-armhf.so.3";
8886 else
8887 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008888 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8889 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008890 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008891 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008892 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008893 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008894 return "/lib/ld-linux.so.3";
8895 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8896 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008897 std::string LibDir =
8898 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008899 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008900 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008901 if (mips::isUCLibc(Args))
8902 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008903 else if (!ToolChain.getTriple().hasEnvironment()) {
8904 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8905 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8906 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8907 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008908 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008909
8910 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008911 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008912 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008913 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008914 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8915 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008916 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008917 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008918 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8919 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008920 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008921 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008922 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008923 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008924 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008925 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008926 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8927 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008928 else
8929 return "/lib64/ld-linux-x86-64.so.2";
8930}
8931
Renato Golinc4b49242014-02-13 10:01:16 +00008932static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008933 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008934 // Make use of compiler-rt if --rtlib option is used
8935 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8936
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008937 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008938 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008939 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008940 default:
8941 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008942 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008943 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008944 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008945 break;
8946 }
Renato Golinc4b49242014-02-13 10:01:16 +00008947 break;
8948 case ToolChain::RLT_Libgcc:
8949 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8950 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008951 }
8952}
8953
Rafael Espindola1e085772014-08-15 17:14:35 +00008954static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8955 switch (T.getArch()) {
8956 case llvm::Triple::x86:
8957 return "elf_i386";
8958 case llvm::Triple::aarch64:
8959 return "aarch64linux";
8960 case llvm::Triple::aarch64_be:
8961 return "aarch64_be_linux";
8962 case llvm::Triple::arm:
8963 case llvm::Triple::thumb:
8964 return "armelf_linux_eabi";
8965 case llvm::Triple::armeb:
8966 case llvm::Triple::thumbeb:
8967 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8968 case llvm::Triple::ppc:
8969 return "elf32ppclinux";
8970 case llvm::Triple::ppc64:
8971 return "elf64ppc";
8972 case llvm::Triple::ppc64le:
8973 return "elf64lppc";
8974 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008975 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008976 return "elf32_sparc";
8977 case llvm::Triple::sparcv9:
8978 return "elf64_sparc";
8979 case llvm::Triple::mips:
8980 return "elf32btsmip";
8981 case llvm::Triple::mipsel:
8982 return "elf32ltsmip";
8983 case llvm::Triple::mips64:
8984 if (mips::hasMipsAbiArg(Args, "n32"))
8985 return "elf32btsmipn32";
8986 return "elf64btsmip";
8987 case llvm::Triple::mips64el:
8988 if (mips::hasMipsAbiArg(Args, "n32"))
8989 return "elf32ltsmipn32";
8990 return "elf64ltsmip";
8991 case llvm::Triple::systemz:
8992 return "elf64_s390";
8993 case llvm::Triple::x86_64:
8994 if (T.getEnvironment() == llvm::Triple::GNUX32)
8995 return "elf32_x86_64";
8996 return "elf_x86_64";
8997 default:
8998 llvm_unreachable("Unexpected arch");
8999 }
9000}
9001
Douglas Katzman95354292015-06-23 20:42:09 +00009002void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9003 const InputInfo &Output,
9004 const InputInfoList &Inputs,
9005 const ArgList &Args,
9006 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009007 const toolchains::Linux &ToolChain =
9008 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009009 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009010
9011 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9012 llvm::Triple Triple = llvm::Triple(TripleStr);
9013
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009014 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009015 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009016 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009017 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9018 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009019 const bool HasCRTBeginEndFiles =
9020 ToolChain.getTriple().hasEnvironment() ||
9021 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009022
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009023 ArgStringList CmdArgs;
9024
Rafael Espindolad1002f62010-11-15 18:28:16 +00009025 // Silence warning for "clang -g foo.o -o foo"
9026 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009027 // and "clang -emit-llvm foo.o -o foo"
9028 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009029 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009030 // handled somewhere else.
9031 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009032
Peter Collingbourne39719a72015-11-20 20:49:39 +00009033 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9034 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009035 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009036 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009037 CmdArgs.push_back("-target");
9038 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9039 }
9040
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009041 if (!D.SysRoot.empty())
9042 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009043
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009044 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009045 CmdArgs.push_back("-pie");
9046
Rafael Espindola1c76c592010-11-07 22:57:16 +00009047 if (Args.hasArg(options::OPT_rdynamic))
9048 CmdArgs.push_back("-export-dynamic");
9049
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009050 if (Args.hasArg(options::OPT_s))
9051 CmdArgs.push_back("-s");
9052
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009053 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009054 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009055
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009056 for (const auto &Opt : ToolChain.ExtraOpts)
9057 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009058
9059 if (!Args.hasArg(options::OPT_static)) {
9060 CmdArgs.push_back("--eh-frame-hdr");
9061 }
9062
9063 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009064 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009065
9066 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009067 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9068 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009069 CmdArgs.push_back("-Bstatic");
9070 else
9071 CmdArgs.push_back("-static");
9072 } else if (Args.hasArg(options::OPT_shared)) {
9073 CmdArgs.push_back("-shared");
9074 }
9075
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009076 if (!Args.hasArg(options::OPT_static)) {
9077 if (Args.hasArg(options::OPT_rdynamic))
9078 CmdArgs.push_back("-export-dynamic");
9079
9080 if (!Args.hasArg(options::OPT_shared)) {
9081 const std::string Loader =
9082 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9083 CmdArgs.push_back("-dynamic-linker");
9084 CmdArgs.push_back(Args.MakeArgString(Loader));
9085 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009086 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009087
9088 CmdArgs.push_back("-o");
9089 CmdArgs.push_back(Output.getFilename());
9090
Douglas Katzman78b37b02015-11-17 20:28:07 +00009091 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009092 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009093 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009094 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009095 if (Args.hasArg(options::OPT_pg))
9096 crt1 = "gcrt1.o";
9097 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009098 crt1 = "Scrt1.o";
9099 else
9100 crt1 = "crt1.o";
9101 }
9102 if (crt1)
9103 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009104
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009105 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9106 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009107
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009108 const char *crtbegin;
9109 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009110 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009111 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009112 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009113 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009114 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009115 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009116 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009117
9118 if (HasCRTBeginEndFiles)
9119 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009120
9121 // Add crtfastmath.o if available and fast math is enabled.
9122 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009123 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009124
9125 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009126 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009127
Douglas Katzman6059ef92015-11-17 17:41:23 +00009128 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009129
Teresa Johnson945bc502015-10-15 20:35:53 +00009130 if (D.isUsingLTO())
9131 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009132
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009133 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9134 CmdArgs.push_back("--no-demangle");
9135
Alexey Samsonov52550342014-09-15 19:58:40 +00009136 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009137 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009138 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009139 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009140
Douglas Katzman78b37b02015-11-17 20:28:07 +00009141 if (D.CCCIsCXX() &&
9142 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009143 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009144 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009145 if (OnlyLibstdcxxStatic)
9146 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009147 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009148 if (OnlyLibstdcxxStatic)
9149 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009150 CmdArgs.push_back("-lm");
9151 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009152 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9153 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009154
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009155 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009156 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9157 if (Args.hasArg(options::OPT_static))
9158 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009159
Alexey Samsonov52550342014-09-15 19:58:40 +00009160 if (NeedsSanitizerDeps)
9161 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9162
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009163 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9164 Args.hasArg(options::OPT_pthreads);
9165
9166 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9167 options::OPT_fno_openmp, false)) {
9168 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9169 // FIXME: Does this really make sense for all GNU toolchains?
9170 WantPthread = true;
9171
9172 // Also link the particular OpenMP runtimes.
9173 switch (getOpenMPRuntime(ToolChain, Args)) {
9174 case OMPRT_OMP:
9175 CmdArgs.push_back("-lomp");
9176 break;
9177 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009178 CmdArgs.push_back("-lgomp");
9179
9180 // FIXME: Exclude this for platforms with libgomp that don't require
9181 // librt. Most modern Linux platforms require it, but some may not.
9182 CmdArgs.push_back("-lrt");
9183 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009184 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009185 CmdArgs.push_back("-liomp5");
9186 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009187 case OMPRT_Unknown:
9188 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009189 break;
9190 }
Chandler Carruth01538002013-01-17 13:19:29 +00009191 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009192
Renato Golinc4b49242014-02-13 10:01:16 +00009193 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009194
Richard Smith31d1de22015-05-20 22:48:44 +00009195 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009196 CmdArgs.push_back("-lpthread");
9197
Rafael Espindolab17bc532016-01-25 18:29:16 +00009198 if (Args.hasArg(options::OPT_fsplit_stack))
9199 CmdArgs.push_back("--wrap=pthread_create");
9200
Chandler Carruth94a32012012-05-14 18:31:18 +00009201 CmdArgs.push_back("-lc");
9202
9203 if (Args.hasArg(options::OPT_static))
9204 CmdArgs.push_back("--end-group");
9205 else
Renato Golinc4b49242014-02-13 10:01:16 +00009206 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009207 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009208
Rafael Espindola81937ec2010-12-01 01:52:43 +00009209 if (!Args.hasArg(options::OPT_nostartfiles)) {
9210 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009211 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009212 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009213 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009214 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009215 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009216 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009217
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009218 if (HasCRTBeginEndFiles)
9219 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009220 if (!isAndroid)
9221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009222 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009223 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009224
Peter Collingbourne39719a72015-11-20 20:49:39 +00009225 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009226}
9227
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009228// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9229// for the various SFI requirements like register masking. The assembly tool
9230// inserts the file containing the macros as an input into all the assembly
9231// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009232void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9233 const InputInfo &Output,
9234 const InputInfoList &Inputs,
9235 const ArgList &Args,
9236 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009237 const toolchains::NaClToolChain &ToolChain =
9238 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009239 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009240 "nacl-arm-macros.s");
9241 InputInfoList NewInputs;
9242 NewInputs.push_back(NaClMacros);
9243 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009244 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9245 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009246}
9247
Douglas Katzman750cfc52015-06-29 18:42:16 +00009248// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009249// we use static by default, do not yet support sanitizers or LTO, and a few
9250// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009251// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009252void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9253 const InputInfo &Output,
9254 const InputInfoList &Inputs,
9255 const ArgList &Args,
9256 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009257
Douglas Katzman54366072015-07-27 16:53:08 +00009258 const toolchains::NaClToolChain &ToolChain =
9259 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009260 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009261 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009262 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009263 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009264
9265 ArgStringList CmdArgs;
9266
9267 // Silence warning for "clang -g foo.o -o foo"
9268 Args.ClaimAllArgs(options::OPT_g_Group);
9269 // and "clang -emit-llvm foo.o -o foo"
9270 Args.ClaimAllArgs(options::OPT_emit_llvm);
9271 // and for "clang -w foo.o -o foo". Other warning options are already
9272 // handled somewhere else.
9273 Args.ClaimAllArgs(options::OPT_w);
9274
9275 if (!D.SysRoot.empty())
9276 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9277
9278 if (Args.hasArg(options::OPT_rdynamic))
9279 CmdArgs.push_back("-export-dynamic");
9280
9281 if (Args.hasArg(options::OPT_s))
9282 CmdArgs.push_back("-s");
9283
Douglas Katzman54366072015-07-27 16:53:08 +00009284 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9285 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009286 CmdArgs.push_back("--build-id");
9287
9288 if (!IsStatic)
9289 CmdArgs.push_back("--eh-frame-hdr");
9290
9291 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009292 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009293 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009294 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009295 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009296 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009297 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009298 else if (Arch == llvm::Triple::mipsel)
9299 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009300 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009301 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9302 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009303
9304 if (IsStatic)
9305 CmdArgs.push_back("-static");
9306 else if (Args.hasArg(options::OPT_shared))
9307 CmdArgs.push_back("-shared");
9308
9309 CmdArgs.push_back("-o");
9310 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009311 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009312 if (!Args.hasArg(options::OPT_shared))
9313 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9314 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9315
9316 const char *crtbegin;
9317 if (IsStatic)
9318 crtbegin = "crtbeginT.o";
9319 else if (Args.hasArg(options::OPT_shared))
9320 crtbegin = "crtbeginS.o";
9321 else
9322 crtbegin = "crtbegin.o";
9323 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9324 }
9325
9326 Args.AddAllArgs(CmdArgs, options::OPT_L);
9327 Args.AddAllArgs(CmdArgs, options::OPT_u);
9328
Douglas Katzman6059ef92015-11-17 17:41:23 +00009329 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009330
9331 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9332 CmdArgs.push_back("--no-demangle");
9333
9334 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9335
Douglas Katzman78b37b02015-11-17 20:28:07 +00009336 if (D.CCCIsCXX() &&
9337 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009338 bool OnlyLibstdcxxStatic =
9339 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009340 if (OnlyLibstdcxxStatic)
9341 CmdArgs.push_back("-Bstatic");
9342 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9343 if (OnlyLibstdcxxStatic)
9344 CmdArgs.push_back("-Bdynamic");
9345 CmdArgs.push_back("-lm");
9346 }
9347
9348 if (!Args.hasArg(options::OPT_nostdlib)) {
9349 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9350 // Always use groups, since it has no effect on dynamic libraries.
9351 CmdArgs.push_back("--start-group");
9352 CmdArgs.push_back("-lc");
9353 // NaCl's libc++ currently requires libpthread, so just always include it
9354 // in the group for C++.
9355 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009356 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009357 // Gold, used by Mips, handles nested groups differently than ld, and
9358 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9359 // which is not a desired behaviour here.
9360 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9361 if (getToolChain().getArch() == llvm::Triple::mipsel)
9362 CmdArgs.push_back("-lnacl");
9363
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009364 CmdArgs.push_back("-lpthread");
9365 }
9366
9367 CmdArgs.push_back("-lgcc");
9368 CmdArgs.push_back("--as-needed");
9369 if (IsStatic)
9370 CmdArgs.push_back("-lgcc_eh");
9371 else
9372 CmdArgs.push_back("-lgcc_s");
9373 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009374
9375 // Mips needs to create and use pnacl_legacy library that contains
9376 // definitions from bitcode/pnaclmm.c and definitions for
9377 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9378 if (getToolChain().getArch() == llvm::Triple::mipsel)
9379 CmdArgs.push_back("-lpnacl_legacy");
9380
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009381 CmdArgs.push_back("--end-group");
9382 }
9383
9384 if (!Args.hasArg(options::OPT_nostartfiles)) {
9385 const char *crtend;
9386 if (Args.hasArg(options::OPT_shared))
9387 crtend = "crtendS.o";
9388 else
9389 crtend = "crtend.o";
9390
9391 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9392 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9393 }
9394 }
9395
Peter Collingbourne39719a72015-11-20 20:49:39 +00009396 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009398}
9399
Douglas Katzman95354292015-06-23 20:42:09 +00009400void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9401 const InputInfo &Output,
9402 const InputInfoList &Inputs,
9403 const ArgList &Args,
9404 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009405 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009406 ArgStringList CmdArgs;
9407
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009408 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009409
9410 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009411 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009412
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009413 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009414 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009415
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009416 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009417 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009418}
9419
Douglas Katzman95354292015-06-23 20:42:09 +00009420void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9421 const InputInfo &Output,
9422 const InputInfoList &Inputs,
9423 const ArgList &Args,
9424 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009425 const Driver &D = getToolChain().getDriver();
9426 ArgStringList CmdArgs;
9427
Daniel Dunbarb440f562010-08-02 02:38:21 +00009428 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009429 CmdArgs.push_back("-o");
9430 CmdArgs.push_back(Output.getFilename());
9431 } else {
9432 assert(Output.isNothing() && "Invalid output.");
9433 }
9434
Douglas Katzman78b37b02015-11-17 20:28:07 +00009435 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009436 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9437 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9438 CmdArgs.push_back(
9439 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9440 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009441 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009442
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009443 Args.AddAllArgs(CmdArgs,
9444 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009445
Daniel Dunbar54423b22010-09-17 00:24:54 +00009446 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009447
Xinliang David Li69306c02015-10-22 06:15:31 +00009448 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009449
Douglas Katzman78b37b02015-11-17 20:28:07 +00009450 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009451 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009452 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009453 CmdArgs.push_back("-lm");
9454 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009455 }
9456
Douglas Katzman78b37b02015-11-17 20:28:07 +00009457 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009458 if (Args.hasArg(options::OPT_pthread))
9459 CmdArgs.push_back("-lpthread");
9460 CmdArgs.push_back("-lc");
9461 CmdArgs.push_back("-lCompilerRT-Generic");
9462 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9463 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009464 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009465 }
9466
Logan Chieneb9162f2014-06-26 14:23:45 +00009467 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009468 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009469}
9470
Daniel Dunbarcc912342009-05-02 18:28:39 +00009471/// DragonFly Tools
9472
9473// For now, DragonFly Assemble does just about the same as for
9474// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009475void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9476 const InputInfo &Output,
9477 const InputInfoList &Inputs,
9478 const ArgList &Args,
9479 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009480 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009481 ArgStringList CmdArgs;
9482
9483 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9484 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009485 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009486 CmdArgs.push_back("--32");
9487
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009488 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009489
9490 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009491 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009492
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009493 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009494 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009495
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009496 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009497 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009498}
9499
Douglas Katzman95354292015-06-23 20:42:09 +00009500void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9501 const InputInfo &Output,
9502 const InputInfoList &Inputs,
9503 const ArgList &Args,
9504 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009505 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009506 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009507
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009508 if (!D.SysRoot.empty())
9509 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9510
John McCall65b8da02013-04-11 22:55:55 +00009511 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009512 if (Args.hasArg(options::OPT_static)) {
9513 CmdArgs.push_back("-Bstatic");
9514 } else {
John McCall65b8da02013-04-11 22:55:55 +00009515 if (Args.hasArg(options::OPT_rdynamic))
9516 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009517 if (Args.hasArg(options::OPT_shared))
9518 CmdArgs.push_back("-Bshareable");
9519 else {
9520 CmdArgs.push_back("-dynamic-linker");
9521 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9522 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009523 CmdArgs.push_back("--hash-style=gnu");
9524 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009525 }
9526
9527 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9528 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009529 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009530 CmdArgs.push_back("-m");
9531 CmdArgs.push_back("elf_i386");
9532 }
9533
Daniel Dunbarb440f562010-08-02 02:38:21 +00009534 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009535 CmdArgs.push_back("-o");
9536 CmdArgs.push_back(Output.getFilename());
9537 } else {
9538 assert(Output.isNothing() && "Invalid output.");
9539 }
9540
Douglas Katzman78b37b02015-11-17 20:28:07 +00009541 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009542 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009543 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009544 CmdArgs.push_back(
9545 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009546 else {
9547 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009548 CmdArgs.push_back(
9549 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009550 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009551 CmdArgs.push_back(
9552 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009553 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009554 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009555 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009556 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009557 CmdArgs.push_back(
9558 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009559 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009560 CmdArgs.push_back(
9561 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009562 }
9563
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009564 Args.AddAllArgs(CmdArgs,
9565 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009566
Daniel Dunbar54423b22010-09-17 00:24:54 +00009567 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009568
Douglas Katzman78b37b02015-11-17 20:28:07 +00009569 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009570 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009571
9572 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009573 CmdArgs.push_back("-rpath");
9574 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009575 }
9576
Hans Wennborg70850d82013-07-18 20:29:38 +00009577 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009578 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009579 CmdArgs.push_back("-lm");
9580 }
9581
Daniel Dunbarcc912342009-05-02 18:28:39 +00009582 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009583 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009584
9585 if (!Args.hasArg(options::OPT_nolibc)) {
9586 CmdArgs.push_back("-lc");
9587 }
9588
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009589 if (Args.hasArg(options::OPT_static) ||
9590 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009591 CmdArgs.push_back("-lgcc");
9592 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009593 } else {
9594 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009595 CmdArgs.push_back("-lgcc_pic");
9596 if (!Args.hasArg(options::OPT_shared))
9597 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009598 } else {
John McCall65b8da02013-04-11 22:55:55 +00009599 CmdArgs.push_back("-lgcc");
9600 CmdArgs.push_back("--as-needed");
9601 CmdArgs.push_back("-lgcc_pic");
9602 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009603 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009604 }
9605 }
9606
Douglas Katzman78b37b02015-11-17 20:28:07 +00009607 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009608 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009609 CmdArgs.push_back(
9610 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009611 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009612 CmdArgs.push_back(
9613 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9614 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009615 }
9616
Xinliang David Li69306c02015-10-22 06:15:31 +00009617 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009618
Logan Chieneb9162f2014-06-26 14:23:45 +00009619 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009620 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009621}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009622
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009623// Try to find Exe from a Visual Studio distribution. This first tries to find
9624// an installed copy of Visual Studio and, failing that, looks in the PATH,
9625// making sure that whatever executable that's found is not a same-named exe
9626// from clang itself to prevent clang from falling back to itself.
9627static std::string FindVisualStudioExecutable(const ToolChain &TC,
9628 const char *Exe,
9629 const char *ClangProgramPath) {
9630 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9631 std::string visualStudioBinDir;
9632 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9633 visualStudioBinDir)) {
9634 SmallString<128> FilePath(visualStudioBinDir);
9635 llvm::sys::path::append(FilePath, Exe);
9636 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9637 return FilePath.str();
9638 }
9639
9640 return Exe;
9641}
9642
Douglas Katzman95354292015-06-23 20:42:09 +00009643void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9644 const InputInfo &Output,
9645 const InputInfoList &Inputs,
9646 const ArgList &Args,
9647 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009648 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009649 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009650
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009651 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9652 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009653 CmdArgs.push_back(
9654 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009655
Douglas Katzman78b37b02015-11-17 20:28:07 +00009656 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9657 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009658 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009659
Zachary Turner10d75b22014-10-22 20:40:43 +00009660 if (!llvm::sys::Process::GetEnv("LIB")) {
9661 // If the VC environment hasn't been configured (perhaps because the user
9662 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009663 // the environment variable is set however, assume the user knows what
9664 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009665 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009666 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009667 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9668 SmallString<128> LibDir(VisualStudioDir);
9669 llvm::sys::path::append(LibDir, "VC", "lib");
9670 switch (MSVC.getArch()) {
9671 case llvm::Triple::x86:
9672 // x86 just puts the libraries directly in lib
9673 break;
9674 case llvm::Triple::x86_64:
9675 llvm::sys::path::append(LibDir, "amd64");
9676 break;
9677 case llvm::Triple::arm:
9678 llvm::sys::path::append(LibDir, "arm");
9679 break;
9680 default:
9681 break;
9682 }
9683 CmdArgs.push_back(
9684 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009685
9686 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9687 std::string UniversalCRTLibPath;
9688 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9689 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9690 UniversalCRTLibPath.c_str()));
9691 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009692 }
9693
9694 std::string WindowsSdkLibPath;
9695 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9696 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9697 WindowsSdkLibPath.c_str()));
9698 }
9699
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009700 CmdArgs.push_back("-nologo");
9701
Reid Kleckner124955a2015-08-05 18:51:13 +00009702 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009703 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009705 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009706 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009707 if (DLL) {
9708 CmdArgs.push_back(Args.MakeArgString("-dll"));
9709
9710 SmallString<128> ImplibName(Output.getFilename());
9711 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009712 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009713 }
9714
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009715 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009716 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009717 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009718 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009719 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9720 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009721 // Make sure the dynamic runtime thunk is not optimized out at link time
9722 // to ensure proper SEH handling.
9723 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009724 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009725 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009726 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009727 for (const auto &Lib : {"asan", "asan_cxx"})
9728 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009729 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009730 }
9731
Hans Wennborg2e274592013-08-13 23:38:57 +00009732 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009733
Alexey Bataevc7e84352015-08-19 04:49:01 +00009734 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9735 options::OPT_fno_openmp, false)) {
9736 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9737 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9738 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9739 TC.getDriver().Dir + "/../lib"));
9740 switch (getOpenMPRuntime(getToolChain(), Args)) {
9741 case OMPRT_OMP:
9742 CmdArgs.push_back("-defaultlib:libomp.lib");
9743 break;
9744 case OMPRT_IOMP5:
9745 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9746 break;
9747 case OMPRT_GOMP:
9748 break;
9749 case OMPRT_Unknown:
9750 // Already diagnosed.
9751 break;
9752 }
9753 }
9754
Reid Kleckner337188f2014-09-16 19:22:00 +00009755 // Add filenames, libraries, and other linker inputs.
9756 for (const auto &Input : Inputs) {
9757 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009758 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009759 continue;
9760 }
9761
9762 const Arg &A = Input.getInputArg();
9763
9764 // Render -l options differently for the MSVC linker.
9765 if (A.getOption().matches(options::OPT_l)) {
9766 StringRef Lib = A.getValue();
9767 const char *LinkLibArg;
9768 if (Lib.endswith(".lib"))
9769 LinkLibArg = Args.MakeArgString(Lib);
9770 else
9771 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9772 CmdArgs.push_back(LinkLibArg);
9773 continue;
9774 }
9775
9776 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9777 // or -L. Render it, even if MSVC doesn't understand it.
9778 A.renderAsInput(Args, CmdArgs);
9779 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009780
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009781 TC.addProfileRTLibs(Args, CmdArgs);
9782
Zachary Turner719f58c2014-12-01 23:06:47 +00009783 // We need to special case some linker paths. In the case of lld, we need to
9784 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9785 // linker, we need to use a special search algorithm.
9786 llvm::SmallString<128> linkPath;
9787 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9788 if (Linker.equals_lower("lld"))
9789 Linker = "lld-link";
9790
9791 if (Linker.equals_lower("link")) {
9792 // If we're using the MSVC linker, it's not sufficient to just use link
9793 // from the program PATH, because other environments like GnuWin32 install
9794 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009795 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009796 C.getDriver().getClangProgramPath());
9797 } else {
9798 linkPath = Linker;
9799 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009800 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009801 }
9802
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009803 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009804 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009805}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009806
Douglas Katzman95354292015-06-23 20:42:09 +00009807void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9808 const InputInfo &Output,
9809 const InputInfoList &Inputs,
9810 const ArgList &Args,
9811 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009812 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9813}
9814
Douglas Katzman95354292015-06-23 20:42:09 +00009815std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009816 Compilation &C, const JobAction &JA, const InputInfo &Output,
9817 const InputInfoList &Inputs, const ArgList &Args,
9818 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009819 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009820 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009821 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009822 CmdArgs.push_back("/W0"); // No warnings.
9823
9824 // The goal is to be able to invoke this tool correctly based on
9825 // any flag accepted by clang-cl.
9826
9827 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009828 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009829
9830 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009831 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9832 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9833 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009834 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9835 if (A->getOption().getID() == options::OPT_O0) {
9836 CmdArgs.push_back("/Od");
9837 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009838 CmdArgs.push_back("/Og");
9839
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009840 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009841 if (OptLevel == "s" || OptLevel == "z")
9842 CmdArgs.push_back("/Os");
9843 else
9844 CmdArgs.push_back("/Ot");
9845
9846 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009847 }
9848 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009849 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9850 options::OPT_fno_omit_frame_pointer))
9851 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9852 ? "/Oy"
9853 : "/Oy-");
9854 if (!Args.hasArg(options::OPT_fwritable_strings))
9855 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009856
Nico Weber3f8dafb2015-03-12 19:37:10 +00009857 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009858 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9859
David Majnemerf6072342014-07-01 22:24:56 +00009860 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9861 /*default=*/false))
9862 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009863 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9864 options::OPT_fno_function_sections))
9865 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9866 ? "/Gy"
9867 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009868 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9869 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009870 CmdArgs.push_back(
9871 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009872 if (Args.hasArg(options::OPT_fsyntax_only))
9873 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009874 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9875 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009876 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009877
Nico Weber3f8dafb2015-03-12 19:37:10 +00009878 std::vector<std::string> Includes =
9879 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009880 for (const auto &Include : Includes)
9881 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009882
Hans Wennborg87cfa712013-09-19 20:32:16 +00009883 // Flags that can simply be passed through.
9884 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9885 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009886 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9887 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009888 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009889 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009890
9891 // The order of these flags is relevant, so pick the last one.
9892 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9893 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9894 A->render(Args, CmdArgs);
9895
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009896 // Pass through all unknown arguments so that the fallback command can see
9897 // them too.
9898 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9899
Hans Wennborg87cfa712013-09-19 20:32:16 +00009900 // Input filename.
9901 assert(Inputs.size() == 1);
9902 const InputInfo &II = Inputs[0];
9903 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9904 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9905 if (II.isFilename())
9906 CmdArgs.push_back(II.getFilename());
9907 else
9908 II.getInputArg().renderAsInput(Args, CmdArgs);
9909
9910 // Output filename.
9911 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009912 const char *Fo =
9913 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009914 CmdArgs.push_back(Fo);
9915
Hans Wennborg188382e2013-09-20 18:16:35 +00009916 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009917 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9918 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009919 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009920 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009921}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009922
Yaron Keren1c0070c2015-07-02 04:45:27 +00009923/// MinGW Tools
9924void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9925 const InputInfo &Output,
9926 const InputInfoList &Inputs,
9927 const ArgList &Args,
9928 const char *LinkingOutput) const {
9929 claimNoWarnArgs(Args);
9930 ArgStringList CmdArgs;
9931
9932 if (getToolChain().getArch() == llvm::Triple::x86) {
9933 CmdArgs.push_back("--32");
9934 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9935 CmdArgs.push_back("--64");
9936 }
9937
9938 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9939
9940 CmdArgs.push_back("-o");
9941 CmdArgs.push_back(Output.getFilename());
9942
9943 for (const auto &II : Inputs)
9944 CmdArgs.push_back(II.getFilename());
9945
9946 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009947 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009948
9949 if (Args.hasArg(options::OPT_gsplit_dwarf))
9950 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9951 SplitDebugName(Args, Inputs[0]));
9952}
9953
9954void MinGW::Linker::AddLibGCC(const ArgList &Args,
9955 ArgStringList &CmdArgs) const {
9956 if (Args.hasArg(options::OPT_mthreads))
9957 CmdArgs.push_back("-lmingwthrd");
9958 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009959
Yaron Kerenaa281332015-08-09 00:24:07 +00009960 // Make use of compiler-rt if --rtlib option is used
9961 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9962 if (RLT == ToolChain::RLT_Libgcc) {
9963 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9964 Args.hasArg(options::OPT_static);
9965 bool Shared = Args.hasArg(options::OPT_shared);
9966 bool CXX = getToolChain().getDriver().CCCIsCXX();
9967
9968 if (Static || (!CXX && !Shared)) {
9969 CmdArgs.push_back("-lgcc");
9970 CmdArgs.push_back("-lgcc_eh");
9971 } else {
9972 CmdArgs.push_back("-lgcc_s");
9973 CmdArgs.push_back("-lgcc");
9974 }
9975 } else {
9976 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9977 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009978
Yaron Keren1c0070c2015-07-02 04:45:27 +00009979 CmdArgs.push_back("-lmoldname");
9980 CmdArgs.push_back("-lmingwex");
9981 CmdArgs.push_back("-lmsvcrt");
9982}
9983
9984void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9985 const InputInfo &Output,
9986 const InputInfoList &Inputs,
9987 const ArgList &Args,
9988 const char *LinkingOutput) const {
9989 const ToolChain &TC = getToolChain();
9990 const Driver &D = TC.getDriver();
9991 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9992
9993 ArgStringList CmdArgs;
9994
9995 // Silence warning for "clang -g foo.o -o foo"
9996 Args.ClaimAllArgs(options::OPT_g_Group);
9997 // and "clang -emit-llvm foo.o -o foo"
9998 Args.ClaimAllArgs(options::OPT_emit_llvm);
9999 // and for "clang -w foo.o -o foo". Other warning options are already
10000 // handled somewhere else.
10001 Args.ClaimAllArgs(options::OPT_w);
10002
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010003 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10004 if (LinkerName.equals_lower("lld")) {
10005 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010006 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010007 } else if (!LinkerName.equals_lower("ld")) {
10008 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010009 }
10010
Yaron Keren1c0070c2015-07-02 04:45:27 +000010011 if (!D.SysRoot.empty())
10012 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10013
10014 if (Args.hasArg(options::OPT_s))
10015 CmdArgs.push_back("-s");
10016
10017 CmdArgs.push_back("-m");
10018 if (TC.getArch() == llvm::Triple::x86)
10019 CmdArgs.push_back("i386pe");
10020 if (TC.getArch() == llvm::Triple::x86_64)
10021 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010022 if (TC.getArch() == llvm::Triple::arm)
10023 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010024
10025 if (Args.hasArg(options::OPT_mwindows)) {
10026 CmdArgs.push_back("--subsystem");
10027 CmdArgs.push_back("windows");
10028 } else if (Args.hasArg(options::OPT_mconsole)) {
10029 CmdArgs.push_back("--subsystem");
10030 CmdArgs.push_back("console");
10031 }
10032
10033 if (Args.hasArg(options::OPT_static))
10034 CmdArgs.push_back("-Bstatic");
10035 else {
10036 if (Args.hasArg(options::OPT_mdll))
10037 CmdArgs.push_back("--dll");
10038 else if (Args.hasArg(options::OPT_shared))
10039 CmdArgs.push_back("--shared");
10040 CmdArgs.push_back("-Bdynamic");
10041 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10042 CmdArgs.push_back("-e");
10043 if (TC.getArch() == llvm::Triple::x86)
10044 CmdArgs.push_back("_DllMainCRTStartup@12");
10045 else
10046 CmdArgs.push_back("DllMainCRTStartup");
10047 CmdArgs.push_back("--enable-auto-image-base");
10048 }
10049 }
10050
10051 CmdArgs.push_back("-o");
10052 CmdArgs.push_back(Output.getFilename());
10053
10054 Args.AddAllArgs(CmdArgs, options::OPT_e);
10055 // FIXME: add -N, -n flags
10056 Args.AddLastArg(CmdArgs, options::OPT_r);
10057 Args.AddLastArg(CmdArgs, options::OPT_s);
10058 Args.AddLastArg(CmdArgs, options::OPT_t);
10059 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10060 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10061
Douglas Katzman78b37b02015-11-17 20:28:07 +000010062 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010063 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10064 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10065 } else {
10066 if (Args.hasArg(options::OPT_municode))
10067 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10068 else
10069 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10070 }
10071 if (Args.hasArg(options::OPT_pg))
10072 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10073 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10074 }
10075
10076 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010077 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010078 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10079
10080 // TODO: Add ASan stuff here
10081
10082 // TODO: Add profile stuff here
10083
Douglas Katzman78b37b02015-11-17 20:28:07 +000010084 if (D.CCCIsCXX() &&
10085 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010086 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10087 !Args.hasArg(options::OPT_static);
10088 if (OnlyLibstdcxxStatic)
10089 CmdArgs.push_back("-Bstatic");
10090 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10091 if (OnlyLibstdcxxStatic)
10092 CmdArgs.push_back("-Bdynamic");
10093 }
10094
10095 if (!Args.hasArg(options::OPT_nostdlib)) {
10096 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10097 if (Args.hasArg(options::OPT_static))
10098 CmdArgs.push_back("--start-group");
10099
10100 if (Args.hasArg(options::OPT_fstack_protector) ||
10101 Args.hasArg(options::OPT_fstack_protector_strong) ||
10102 Args.hasArg(options::OPT_fstack_protector_all)) {
10103 CmdArgs.push_back("-lssp_nonshared");
10104 CmdArgs.push_back("-lssp");
10105 }
10106 if (Args.hasArg(options::OPT_fopenmp))
10107 CmdArgs.push_back("-lgomp");
10108
10109 AddLibGCC(Args, CmdArgs);
10110
10111 if (Args.hasArg(options::OPT_pg))
10112 CmdArgs.push_back("-lgmon");
10113
Yaron Kerenadce68e2015-07-06 18:52:19 +000010114 if (Args.hasArg(options::OPT_pthread))
10115 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010116
10117 // add system libraries
10118 if (Args.hasArg(options::OPT_mwindows)) {
10119 CmdArgs.push_back("-lgdi32");
10120 CmdArgs.push_back("-lcomdlg32");
10121 }
10122 CmdArgs.push_back("-ladvapi32");
10123 CmdArgs.push_back("-lshell32");
10124 CmdArgs.push_back("-luser32");
10125 CmdArgs.push_back("-lkernel32");
10126
10127 if (Args.hasArg(options::OPT_static))
10128 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010129 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010130 AddLibGCC(Args, CmdArgs);
10131 }
10132
10133 if (!Args.hasArg(options::OPT_nostartfiles)) {
10134 // Add crtfastmath.o if available and fast math is enabled.
10135 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10136
10137 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10138 }
10139 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010140 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010141 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010142}
10143
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010144/// XCore Tools
10145// We pass assemble and link construction to the xcc tool.
10146
Douglas Katzman95354292015-06-23 20:42:09 +000010147void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10148 const InputInfo &Output,
10149 const InputInfoList &Inputs,
10150 const ArgList &Args,
10151 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010152 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010153 ArgStringList CmdArgs;
10154
10155 CmdArgs.push_back("-o");
10156 CmdArgs.push_back(Output.getFilename());
10157
10158 CmdArgs.push_back("-c");
10159
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010160 if (Args.hasArg(options::OPT_v))
10161 CmdArgs.push_back("-v");
10162
Robert Lytton894d25c2014-05-02 09:33:25 +000010163 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10164 if (!A->getOption().matches(options::OPT_g0))
10165 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010166
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010167 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10168 false))
10169 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010170
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010171 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010172
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010173 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010174 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010175
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010176 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010177 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010178}
10179
Douglas Katzman95354292015-06-23 20:42:09 +000010180void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10181 const InputInfo &Output,
10182 const InputInfoList &Inputs,
10183 const ArgList &Args,
10184 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010185 ArgStringList CmdArgs;
10186
10187 if (Output.isFilename()) {
10188 CmdArgs.push_back("-o");
10189 CmdArgs.push_back(Output.getFilename());
10190 } else {
10191 assert(Output.isNothing() && "Invalid output.");
10192 }
10193
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010194 if (Args.hasArg(options::OPT_v))
10195 CmdArgs.push_back("-v");
10196
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010197 // Pass -fexceptions through to the linker if it was present.
10198 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10199 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010200 CmdArgs.push_back("-fexceptions");
10201
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010202 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10203
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010204 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010205 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010206}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010207
Douglas Katzman95354292015-06-23 20:42:09 +000010208void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10209 const InputInfo &Output,
10210 const InputInfoList &Inputs,
10211 const ArgList &Args,
10212 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010213 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010214 const auto &TC =
10215 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10216 ArgStringList CmdArgs;
10217 const char *Exec;
10218
10219 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010220 default:
10221 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010222 case llvm::Triple::arm:
10223 case llvm::Triple::thumb:
10224 break;
10225 case llvm::Triple::x86:
10226 CmdArgs.push_back("--32");
10227 break;
10228 case llvm::Triple::x86_64:
10229 CmdArgs.push_back("--64");
10230 break;
10231 }
10232
10233 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10234
10235 CmdArgs.push_back("-o");
10236 CmdArgs.push_back(Output.getFilename());
10237
10238 for (const auto &Input : Inputs)
10239 CmdArgs.push_back(Input.getFilename());
10240
10241 const std::string Assembler = TC.GetProgramPath("as");
10242 Exec = Args.MakeArgString(Assembler);
10243
Justin Bognerd3371d82015-07-17 03:35:54 +000010244 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010245}
10246
Douglas Katzman95354292015-06-23 20:42:09 +000010247void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10248 const InputInfo &Output,
10249 const InputInfoList &Inputs,
10250 const ArgList &Args,
10251 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010252 const auto &TC =
10253 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10254 const llvm::Triple &T = TC.getTriple();
10255 const Driver &D = TC.getDriver();
10256 SmallString<128> EntryPoint;
10257 ArgStringList CmdArgs;
10258 const char *Exec;
10259
10260 // Silence warning for "clang -g foo.o -o foo"
10261 Args.ClaimAllArgs(options::OPT_g_Group);
10262 // and "clang -emit-llvm foo.o -o foo"
10263 Args.ClaimAllArgs(options::OPT_emit_llvm);
10264 // and for "clang -w foo.o -o foo"
10265 Args.ClaimAllArgs(options::OPT_w);
10266 // Other warning options are already handled somewhere else.
10267
10268 if (!D.SysRoot.empty())
10269 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10270
10271 if (Args.hasArg(options::OPT_pie))
10272 CmdArgs.push_back("-pie");
10273 if (Args.hasArg(options::OPT_rdynamic))
10274 CmdArgs.push_back("-export-dynamic");
10275 if (Args.hasArg(options::OPT_s))
10276 CmdArgs.push_back("--strip-all");
10277
10278 CmdArgs.push_back("-m");
10279 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010280 default:
10281 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010282 case llvm::Triple::arm:
10283 case llvm::Triple::thumb:
10284 // FIXME: this is incorrect for WinCE
10285 CmdArgs.push_back("thumb2pe");
10286 break;
10287 case llvm::Triple::x86:
10288 CmdArgs.push_back("i386pe");
10289 EntryPoint.append("_");
10290 break;
10291 case llvm::Triple::x86_64:
10292 CmdArgs.push_back("i386pep");
10293 break;
10294 }
10295
10296 if (Args.hasArg(options::OPT_shared)) {
10297 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010298 default:
10299 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010300 case llvm::Triple::arm:
10301 case llvm::Triple::thumb:
10302 case llvm::Triple::x86_64:
10303 EntryPoint.append("_DllMainCRTStartup");
10304 break;
10305 case llvm::Triple::x86:
10306 EntryPoint.append("_DllMainCRTStartup@12");
10307 break;
10308 }
10309
10310 CmdArgs.push_back("-shared");
10311 CmdArgs.push_back("-Bdynamic");
10312
10313 CmdArgs.push_back("--enable-auto-image-base");
10314
10315 CmdArgs.push_back("--entry");
10316 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10317 } else {
10318 EntryPoint.append("mainCRTStartup");
10319
10320 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10321 : "-Bdynamic");
10322
Douglas Katzman78b37b02015-11-17 20:28:07 +000010323 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010324 CmdArgs.push_back("--entry");
10325 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10326 }
10327
10328 // FIXME: handle subsystem
10329 }
10330
10331 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010332 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010333
10334 CmdArgs.push_back("-o");
10335 CmdArgs.push_back(Output.getFilename());
10336
10337 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10338 SmallString<261> ImpLib(Output.getFilename());
10339 llvm::sys::path::replace_extension(ImpLib, ".lib");
10340
10341 CmdArgs.push_back("--out-implib");
10342 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10343 }
10344
Douglas Katzman78b37b02015-11-17 20:28:07 +000010345 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010346 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10347 const char *CRTBegin;
10348
10349 CRTBegin =
10350 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10351 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10352 }
10353
10354 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010355 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010356 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10357
10358 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10359 !Args.hasArg(options::OPT_nodefaultlibs)) {
10360 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10361 !Args.hasArg(options::OPT_static);
10362 if (StaticCXX)
10363 CmdArgs.push_back("-Bstatic");
10364 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10365 if (StaticCXX)
10366 CmdArgs.push_back("-Bdynamic");
10367 }
10368
10369 if (!Args.hasArg(options::OPT_nostdlib)) {
10370 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10371 // TODO handle /MT[d] /MD[d]
10372 CmdArgs.push_back("-lmsvcrt");
10373 AddRunTimeLibs(TC, D, CmdArgs, Args);
10374 }
10375 }
10376
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010377 if (TC.getSanitizerArgs().needsAsanRt()) {
10378 // TODO handle /MT[d] /MD[d]
10379 if (Args.hasArg(options::OPT_shared)) {
10380 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10381 } else {
10382 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10383 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10384 // Make sure the dynamic runtime thunk is not optimized out at link time
10385 // to ensure proper SEH handling.
10386 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10387 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10388 ? "___asan_seh_interceptor"
10389 : "__asan_seh_interceptor"));
10390 }
10391 }
10392
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010393 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010394
Justin Bognerd3371d82015-07-17 03:35:54 +000010395 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010396}
Douglas Katzman84a75642015-06-19 14:55:19 +000010397
Douglas Katzman95354292015-06-23 20:42:09 +000010398void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10399 const InputInfo &Output,
10400 const InputInfoList &Inputs,
10401 const ArgList &Args,
10402 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010403 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010404 assert(Inputs.size() == 1);
10405 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010406 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10407 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010408
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010409 if (JA.getKind() == Action::PreprocessJobClass) {
10410 Args.ClaimAllArgs();
10411 CmdArgs.push_back("-E");
10412 } else {
10413 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10414 CmdArgs.push_back("-S");
10415 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10416 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010417 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010418 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010419
Douglas Katzmanf6071112015-08-03 14:34:22 +000010420 // Append all -I, -iquote, -isystem paths, defines/undefines,
10421 // 'f' flags, optimize flags, and warning options.
10422 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010423 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010424 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010425 options::OPT_f_Group, options::OPT_f_clang_Group,
10426 options::OPT_g_Group, options::OPT_M_Group,
10427 options::OPT_O_Group, options::OPT_W_Group});
10428
10429 // If we're producing a dependency file, and assembly is the final action,
10430 // then the name of the target in the dependency file should be the '.o'
10431 // file, not the '.s' file produced by this step. For example, instead of
10432 // /tmp/mumble.s: mumble.c .../someheader.h
10433 // the filename on the lefthand side should be "mumble.o"
10434 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10435 C.getActions().size() == 1 &&
10436 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10437 Arg *A = Args.getLastArg(options::OPT_o);
10438 if (A) {
10439 CmdArgs.push_back("-MT");
10440 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10441 }
10442 }
10443
Douglas Katzman84a75642015-06-19 14:55:19 +000010444 CmdArgs.push_back(II.getFilename());
10445 CmdArgs.push_back("-o");
10446 CmdArgs.push_back(Output.getFilename());
10447
10448 std::string Exec =
10449 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010450 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10451 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010452}
10453
Douglas Katzman95354292015-06-23 20:42:09 +000010454void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10455 const InputInfo &Output,
10456 const InputInfoList &Inputs,
10457 const ArgList &Args,
10458 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010459 ArgStringList CmdArgs;
10460
10461 assert(Inputs.size() == 1);
10462 const InputInfo &II = Inputs[0];
10463 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10464 assert(Output.getType() == types::TY_Object);
10465
10466 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010467 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010468 CmdArgs.push_back("-noSPrefixing");
10469 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010470 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10471 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10472 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010473 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010474 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010475 }
10476 CmdArgs.push_back("-elf"); // Output format.
10477 CmdArgs.push_back(II.getFilename());
10478 CmdArgs.push_back(
10479 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10480
10481 std::string Exec =
10482 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010483 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10484 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010485}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010486
10487void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10488 const InputInfo &Output,
10489 const InputInfoList &Inputs,
10490 const ArgList &Args,
10491 const char *LinkingOutput) const {
10492 const auto &TC =
10493 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10494 const llvm::Triple &T = TC.getTriple();
10495 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010496 bool UseStartfiles =
10497 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010498 bool UseDefaultLibs =
10499 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010500
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010501 if (T.getArch() == llvm::Triple::sparc)
10502 CmdArgs.push_back("-EB");
10503 else // SHAVE assumes little-endian, and sparcel is expressly so.
10504 CmdArgs.push_back("-EL");
10505
10506 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10507 // but we never pass through a --sysroot option and various other bits.
10508 // For example, there are no sanitizers (yet) nor gold linker.
10509
10510 // Eat some arguments that may be present but have no effect.
10511 Args.ClaimAllArgs(options::OPT_g_Group);
10512 Args.ClaimAllArgs(options::OPT_w);
10513 Args.ClaimAllArgs(options::OPT_static_libgcc);
10514
10515 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10516 CmdArgs.push_back("-s");
10517
10518 CmdArgs.push_back("-o");
10519 CmdArgs.push_back(Output.getFilename());
10520
10521 if (UseStartfiles) {
10522 // If you want startfiles, it means you want the builtin crti and crtbegin,
10523 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010524 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10525 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010526 }
10527
10528 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10529 options::OPT_e, options::OPT_s, options::OPT_t,
10530 options::OPT_Z_Flag, options::OPT_r});
10531
Douglas Katzman674a3122015-11-18 16:24:46 +000010532 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010533
10534 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10535
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010536 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010537 if (C.getDriver().CCCIsCXX())
10538 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010539 if (T.getOS() == llvm::Triple::RTEMS) {
10540 CmdArgs.push_back("--start-group");
10541 CmdArgs.push_back("-lc");
10542 // You must provide your own "-L" option to enable finding these.
10543 CmdArgs.push_back("-lrtemscpu");
10544 CmdArgs.push_back("-lrtemsbsp");
10545 CmdArgs.push_back("--end-group");
10546 } else {
10547 CmdArgs.push_back("-lc");
10548 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010549 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010550 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010551 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010552 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10553 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010554 }
10555
10556 std::string Exec =
10557 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10558 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10559 CmdArgs, Inputs));
10560}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010561
10562void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10563 const InputInfo &Output,
10564 const InputInfoList &Inputs,
10565 const ArgList &Args,
10566 const char *LinkingOutput) const {
10567 claimNoWarnArgs(Args);
10568 ArgStringList CmdArgs;
10569
10570 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10571
10572 CmdArgs.push_back("-o");
10573 CmdArgs.push_back(Output.getFilename());
10574
10575 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10576 const InputInfo &Input = Inputs[0];
10577 assert(Input.isFilename() && "Invalid input.");
10578 CmdArgs.push_back(Input.getFilename());
10579
10580 const char *Exec =
10581 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10582 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10583}
10584
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010585static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10586 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10587 if (SanArgs.needsUbsanRt()) {
10588 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10589 }
10590 if (SanArgs.needsAsanRt()) {
10591 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10592 }
10593}
10594
10595static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10596 const JobAction &JA, const InputInfo &Output,
10597 const InputInfoList &Inputs,
10598 const ArgList &Args,
10599 const char *LinkingOutput) {
10600 const toolchains::FreeBSD &ToolChain =
10601 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10602 const Driver &D = ToolChain.getDriver();
10603 ArgStringList CmdArgs;
10604
10605 // Silence warning for "clang -g foo.o -o foo"
10606 Args.ClaimAllArgs(options::OPT_g_Group);
10607 // and "clang -emit-llvm foo.o -o foo"
10608 Args.ClaimAllArgs(options::OPT_emit_llvm);
10609 // and for "clang -w foo.o -o foo". Other warning options are already
10610 // handled somewhere else.
10611 Args.ClaimAllArgs(options::OPT_w);
10612
10613 if (!D.SysRoot.empty())
10614 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10615
10616 if (Args.hasArg(options::OPT_pie))
10617 CmdArgs.push_back("-pie");
10618
10619 if (Args.hasArg(options::OPT_rdynamic))
10620 CmdArgs.push_back("-export-dynamic");
10621 if (Args.hasArg(options::OPT_shared))
10622 CmdArgs.push_back("--oformat=so");
10623
10624 if (Output.isFilename()) {
10625 CmdArgs.push_back("-o");
10626 CmdArgs.push_back(Output.getFilename());
10627 } else {
10628 assert(Output.isNothing() && "Invalid output.");
10629 }
10630
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010631 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10632
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010633 Args.AddAllArgs(CmdArgs, options::OPT_L);
10634 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10635 Args.AddAllArgs(CmdArgs, options::OPT_e);
10636 Args.AddAllArgs(CmdArgs, options::OPT_s);
10637 Args.AddAllArgs(CmdArgs, options::OPT_t);
10638 Args.AddAllArgs(CmdArgs, options::OPT_r);
10639
10640 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10641 CmdArgs.push_back("--no-demangle");
10642
10643 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10644
10645 if (Args.hasArg(options::OPT_pthread)) {
10646 CmdArgs.push_back("-lpthread");
10647 }
10648
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010649 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10650
10651 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10652}
10653
10654static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10655 const JobAction &JA, const InputInfo &Output,
10656 const InputInfoList &Inputs,
10657 const ArgList &Args,
10658 const char *LinkingOutput) {
10659 const toolchains::FreeBSD &ToolChain =
10660 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10661 const Driver &D = ToolChain.getDriver();
10662 ArgStringList CmdArgs;
10663
10664 // Silence warning for "clang -g foo.o -o foo"
10665 Args.ClaimAllArgs(options::OPT_g_Group);
10666 // and "clang -emit-llvm foo.o -o foo"
10667 Args.ClaimAllArgs(options::OPT_emit_llvm);
10668 // and for "clang -w foo.o -o foo". Other warning options are already
10669 // handled somewhere else.
10670 Args.ClaimAllArgs(options::OPT_w);
10671
10672 if (!D.SysRoot.empty())
10673 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10674
10675 if (Args.hasArg(options::OPT_pie))
10676 CmdArgs.push_back("-pie");
10677
10678 if (Args.hasArg(options::OPT_static)) {
10679 CmdArgs.push_back("-Bstatic");
10680 } else {
10681 if (Args.hasArg(options::OPT_rdynamic))
10682 CmdArgs.push_back("-export-dynamic");
10683 CmdArgs.push_back("--eh-frame-hdr");
10684 if (Args.hasArg(options::OPT_shared)) {
10685 CmdArgs.push_back("-Bshareable");
10686 } else {
10687 CmdArgs.push_back("-dynamic-linker");
10688 CmdArgs.push_back("/libexec/ld-elf.so.1");
10689 }
10690 CmdArgs.push_back("--enable-new-dtags");
10691 }
10692
10693 if (Output.isFilename()) {
10694 CmdArgs.push_back("-o");
10695 CmdArgs.push_back(Output.getFilename());
10696 } else {
10697 assert(Output.isNothing() && "Invalid output.");
10698 }
10699
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010700 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10701
Douglas Katzman78b37b02015-11-17 20:28:07 +000010702 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010703 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010704 if (!Args.hasArg(options::OPT_shared)) {
10705 if (Args.hasArg(options::OPT_pg))
10706 crt1 = "gcrt1.o";
10707 else if (Args.hasArg(options::OPT_pie))
10708 crt1 = "Scrt1.o";
10709 else
10710 crt1 = "crt1.o";
10711 }
10712 if (crt1)
10713 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10714
10715 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10716
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010717 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010718 if (Args.hasArg(options::OPT_static))
10719 crtbegin = "crtbeginT.o";
10720 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10721 crtbegin = "crtbeginS.o";
10722 else
10723 crtbegin = "crtbegin.o";
10724
10725 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10726 }
10727
10728 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010729 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010730 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10731 Args.AddAllArgs(CmdArgs, options::OPT_e);
10732 Args.AddAllArgs(CmdArgs, options::OPT_s);
10733 Args.AddAllArgs(CmdArgs, options::OPT_t);
10734 Args.AddAllArgs(CmdArgs, options::OPT_r);
10735
10736 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10737 CmdArgs.push_back("--no-demangle");
10738
10739 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10740
Douglas Katzman78b37b02015-11-17 20:28:07 +000010741 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010742 // For PS4, we always want to pass libm, libstdc++ and libkernel
10743 // libraries for both C and C++ compilations.
10744 CmdArgs.push_back("-lkernel");
10745 if (D.CCCIsCXX()) {
10746 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10747 if (Args.hasArg(options::OPT_pg))
10748 CmdArgs.push_back("-lm_p");
10749 else
10750 CmdArgs.push_back("-lm");
10751 }
10752 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10753 // the default system libraries. Just mimic this for now.
10754 if (Args.hasArg(options::OPT_pg))
10755 CmdArgs.push_back("-lgcc_p");
10756 else
10757 CmdArgs.push_back("-lcompiler_rt");
10758 if (Args.hasArg(options::OPT_static)) {
10759 CmdArgs.push_back("-lstdc++");
10760 } else if (Args.hasArg(options::OPT_pg)) {
10761 CmdArgs.push_back("-lgcc_eh_p");
10762 } else {
10763 CmdArgs.push_back("--as-needed");
10764 CmdArgs.push_back("-lstdc++");
10765 CmdArgs.push_back("--no-as-needed");
10766 }
10767
10768 if (Args.hasArg(options::OPT_pthread)) {
10769 if (Args.hasArg(options::OPT_pg))
10770 CmdArgs.push_back("-lpthread_p");
10771 else
10772 CmdArgs.push_back("-lpthread");
10773 }
10774
10775 if (Args.hasArg(options::OPT_pg)) {
10776 if (Args.hasArg(options::OPT_shared))
10777 CmdArgs.push_back("-lc");
10778 else {
10779 if (Args.hasArg(options::OPT_static)) {
10780 CmdArgs.push_back("--start-group");
10781 CmdArgs.push_back("-lc_p");
10782 CmdArgs.push_back("-lpthread_p");
10783 CmdArgs.push_back("--end-group");
10784 } else {
10785 CmdArgs.push_back("-lc_p");
10786 }
10787 }
10788 CmdArgs.push_back("-lgcc_p");
10789 } else {
10790 if (Args.hasArg(options::OPT_static)) {
10791 CmdArgs.push_back("--start-group");
10792 CmdArgs.push_back("-lc");
10793 CmdArgs.push_back("-lpthread");
10794 CmdArgs.push_back("--end-group");
10795 } else {
10796 CmdArgs.push_back("-lc");
10797 }
10798 CmdArgs.push_back("-lcompiler_rt");
10799 }
10800
10801 if (Args.hasArg(options::OPT_static)) {
10802 CmdArgs.push_back("-lstdc++");
10803 } else if (Args.hasArg(options::OPT_pg)) {
10804 CmdArgs.push_back("-lgcc_eh_p");
10805 } else {
10806 CmdArgs.push_back("--as-needed");
10807 CmdArgs.push_back("-lstdc++");
10808 CmdArgs.push_back("--no-as-needed");
10809 }
10810 }
10811
Douglas Katzman78b37b02015-11-17 20:28:07 +000010812 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010813 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10814 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10815 else
10816 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10817 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10818 }
10819
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010820 const char *Exec =
10821#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010822 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010823#else
10824 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10825#endif
10826
10827 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10828}
10829
10830void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10831 const InputInfo &Output,
10832 const InputInfoList &Inputs,
10833 const ArgList &Args,
10834 const char *LinkingOutput) const {
10835 const toolchains::FreeBSD &ToolChain =
10836 static_cast<const toolchains::FreeBSD &>(getToolChain());
10837 const Driver &D = ToolChain.getDriver();
10838 bool PS4Linker;
10839 StringRef LinkerOptName;
10840 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10841 LinkerOptName = A->getValue();
10842 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10843 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10844 }
10845
10846 if (LinkerOptName == "gold")
10847 PS4Linker = false;
10848 else if (LinkerOptName == "ps4")
10849 PS4Linker = true;
10850 else
10851 PS4Linker = !Args.hasArg(options::OPT_shared);
10852
10853 if (PS4Linker)
10854 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10855 else
10856 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10857}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010858
10859void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10860 const InputInfo &Output,
10861 const InputInfoList &Inputs,
10862 const ArgList &Args,
10863 const char *LinkingOutput) const {
10864 const auto &TC =
10865 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010866 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010867
10868 std::vector<std::string> gpu_archs =
10869 Args.getAllArgValues(options::OPT_march_EQ);
10870 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10871 const std::string& gpu_arch = gpu_archs[0];
10872
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010873 ArgStringList CmdArgs;
10874 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010875 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10876 // ptxas does not accept -g option if optimization is enabled, so
10877 // we ignore the compiler's -O* options if we want debug info.
10878 CmdArgs.push_back("-g");
10879 CmdArgs.push_back("--dont-merge-basicblocks");
10880 CmdArgs.push_back("--return-at-end");
10881 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10882 // Map the -O we received to -O{0,1,2,3}.
10883 //
10884 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10885 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010886
Justin Lebar2836dcd2016-01-19 19:52:21 +000010887 // -O3 seems like the least-bad option when -Osomething is specified to
10888 // clang but it isn't handled below.
10889 StringRef OOpt = "3";
10890 if (A->getOption().matches(options::OPT_O4) ||
10891 A->getOption().matches(options::OPT_Ofast))
10892 OOpt = "3";
10893 else if (A->getOption().matches(options::OPT_O0))
10894 OOpt = "0";
10895 else if (A->getOption().matches(options::OPT_O)) {
10896 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10897 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10898 .Case("1", "1")
10899 .Case("2", "2")
10900 .Case("3", "3")
10901 .Case("s", "2")
10902 .Case("z", "2")
10903 .Default("2");
10904 }
10905 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10906 } else {
10907 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10908 // to no optimizations, but ptxas's default is -O3.
10909 CmdArgs.push_back("-O0");
10910 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010911
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010912 CmdArgs.push_back("--gpu-name");
10913 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10914 CmdArgs.push_back("--output-file");
10915 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10916 for (const auto& II : Inputs)
10917 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10918
10919 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10920 CmdArgs.push_back(Args.MakeArgString(A));
10921
10922 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10923 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10924}
10925
10926// All inputs to this linker must be from CudaDeviceActions, as we need to look
10927// at the Inputs' Actions in order to figure out which GPU architecture they
10928// correspond to.
10929void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10930 const InputInfo &Output,
10931 const InputInfoList &Inputs,
10932 const ArgList &Args,
10933 const char *LinkingOutput) const {
10934 const auto &TC =
10935 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010936 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010937
10938 ArgStringList CmdArgs;
10939 CmdArgs.push_back("--cuda");
10940 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10941 CmdArgs.push_back(Args.MakeArgString("--create"));
10942 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10943
10944 for (const auto& II : Inputs) {
10945 auto* A = cast<const CudaDeviceAction>(II.getAction());
10946 // We need to pass an Arch of the form "sm_XX" for cubin files and
10947 // "compute_XX" for ptx.
10948 const char *Arch = (II.getType() == types::TY_PP_Asm)
10949 ? A->getComputeArchName()
10950 : A->getGpuArchName();
10951 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10952 Arch + ",file=" + II.getFilename()));
10953 }
10954
10955 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10956 CmdArgs.push_back(Args.MakeArgString(A));
10957
10958 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10959 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10960}