blob: c6edc2a14f6a182a3900a5f500c0c05a71224725 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Petar Jovanovic009494f2016-05-17 10:46:10 +00001186 if (Triple.isAndroid()) {
1187 DefMips32CPU = "mips32";
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001188 DefMips64CPU = "mips64r6";
Petar Jovanovic009494f2016-05-17 10:46:10 +00001189 }
Daniel Sanders2bf13662014-07-10 14:40:57 +00001190
Brad Smithba26f582015-01-06 02:53:17 +00001191 // MIPS3 is the default for mips64*-unknown-openbsd.
1192 if (Triple.getOS() == llvm::Triple::OpenBSD)
1193 DefMips64CPU = "mips3";
1194
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001195 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001196 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001197
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001199 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001200 // Convert a GNU style Mips ABI name to the name
1201 // accepted by LLVM Mips backend.
1202 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001203 .Case("32", "o32")
1204 .Case("64", "n64")
1205 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001206 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001207
1208 // Setup default CPU and ABI names.
1209 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001210 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001211 default:
1212 llvm_unreachable("Unexpected triple arch name");
1213 case llvm::Triple::mips:
1214 case llvm::Triple::mipsel:
1215 CPUName = DefMips32CPU;
1216 break;
1217 case llvm::Triple::mips64:
1218 case llvm::Triple::mips64el:
1219 CPUName = DefMips64CPU;
1220 break;
1221 }
1222 }
1223
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001224 if (ABIName.empty()) {
1225 // Deduce ABI name from the target triple.
1226 if (Triple.getArch() == llvm::Triple::mips ||
1227 Triple.getArch() == llvm::Triple::mipsel)
1228 ABIName = "o32";
1229 else
1230 ABIName = "n64";
1231 }
1232
1233 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001234 // Deduce CPU name from ABI name.
1235 CPUName = llvm::StringSwitch<const char *>(ABIName)
Daniel Sanders07c86542016-05-27 14:30:23 +00001236 .Case("o32", DefMips32CPU)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001237 .Cases("n32", "n64", DefMips64CPU)
1238 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001239 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001240
1241 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001242}
1243
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001244std::string mips::getMipsABILibSuffix(const ArgList &Args,
1245 const llvm::Triple &Triple) {
1246 StringRef CPUName, ABIName;
1247 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1248 return llvm::StringSwitch<std::string>(ABIName)
1249 .Case("o32", "")
1250 .Case("n32", "32")
1251 .Case("n64", "64");
1252}
1253
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001254// Convert ABI name to the GNU tools acceptable variant.
1255static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1256 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001257 .Case("o32", "32")
1258 .Case("n64", "64")
1259 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001260}
1261
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001262// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1263// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001264static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1265 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001266 if (Arg *A =
1267 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1268 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001271 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001273 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001274 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1275 .Case("soft", mips::FloatABI::Soft)
1276 .Case("hard", mips::FloatABI::Hard)
1277 .Default(mips::FloatABI::Invalid);
1278 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001279 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001280 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001281 }
1282 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001283 }
1284
1285 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001286 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001287 // Assume "hard", because it's a default value used by gcc.
1288 // When we start to recognize specific target MIPS processors,
1289 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001290 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001291 }
1292
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001293 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1294 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001295}
1296
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001297static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001298 std::vector<const char *> &Features,
1299 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001300 StringRef FeatureName) {
1301 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001302 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001304 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001305 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001306 }
1307}
1308
Daniel Sanders379d44b2014-07-16 11:52:23 +00001309static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1310 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001311 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001312 StringRef CPUName;
1313 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001314 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001315 ABIName = getGnuCompatibleMipsABIName(ABIName);
1316
Daniel Sandersfeb61302014-08-08 15:47:17 +00001317 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1318 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001319
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001320 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1321 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001322 // FIXME: Note, this is a hack. We need to pass the selected float
1323 // mode to the MipsTargetInfoBase to define appropriate macros there.
1324 // Now it is the only method.
1325 Features.push_back("+soft-float");
1326 }
1327
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001328 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001329 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001330 if (Val == "2008") {
1331 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1332 Features.push_back("+nan2008");
1333 else {
1334 Features.push_back("-nan2008");
1335 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1336 }
1337 } else if (Val == "legacy") {
1338 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1339 Features.push_back("-nan2008");
1340 else {
1341 Features.push_back("+nan2008");
1342 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1343 }
1344 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001345 D.Diag(diag::err_drv_unsupported_option_argument)
1346 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001347 }
1348
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001349 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1350 options::OPT_mdouble_float, "single-float");
1351 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1352 "mips16");
1353 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1354 options::OPT_mno_micromips, "micromips");
1355 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1356 "dsp");
1357 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1358 "dspr2");
1359 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1360 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001361
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001362 // Add the last -mfp32/-mfpxx/-mfp64, if none are given and the ABI is O32
1363 // pass -mfpxx, or if none are given and fp64a is default, pass fp64 and
1364 // nooddspreg.
Daniel Sanders379d44b2014-07-16 11:52:23 +00001365 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1366 options::OPT_mfp64)) {
1367 if (A->getOption().matches(options::OPT_mfp32))
1368 Features.push_back(Args.MakeArgString("-fp64"));
1369 else if (A->getOption().matches(options::OPT_mfpxx)) {
1370 Features.push_back(Args.MakeArgString("+fpxx"));
1371 Features.push_back(Args.MakeArgString("+nooddspreg"));
1372 } else
1373 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001374 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001375 Features.push_back(Args.MakeArgString("+fpxx"));
1376 Features.push_back(Args.MakeArgString("+nooddspreg"));
Petar Jovanovic3ca16222016-05-18 12:46:06 +00001377 } else if (mips::isFP64ADefault(Triple, CPUName)) {
1378 Features.push_back(Args.MakeArgString("+fp64"));
1379 Features.push_back(Args.MakeArgString("+nooddspreg"));
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001380 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001381
Daniel Sanders28e5d392014-07-10 10:39:51 +00001382 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1383 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001384}
1385
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001386void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001387 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001388 const Driver &D = getToolChain().getDriver();
1389 StringRef CPUName;
1390 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001391 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001392 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001393
1394 CmdArgs.push_back("-target-abi");
1395 CmdArgs.push_back(ABIName.data());
1396
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001397 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1398 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001399 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001400 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001401 CmdArgs.push_back("-mfloat-abi");
1402 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001403 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001404 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001405 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001406 CmdArgs.push_back("-mfloat-abi");
1407 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001408 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001409
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001410 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1411 if (A->getOption().matches(options::OPT_mxgot)) {
1412 CmdArgs.push_back("-mllvm");
1413 CmdArgs.push_back("-mxgot");
1414 }
1415 }
1416
Simon Atanasyanc580b322013-05-11 06:33:44 +00001417 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1418 options::OPT_mno_ldc1_sdc1)) {
1419 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1420 CmdArgs.push_back("-mllvm");
1421 CmdArgs.push_back("-mno-ldc1-sdc1");
1422 }
1423 }
1424
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001425 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1426 options::OPT_mno_check_zero_division)) {
1427 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1428 CmdArgs.push_back("-mllvm");
1429 CmdArgs.push_back("-mno-check-zero-division");
1430 }
1431 }
1432
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001433 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001434 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001435 CmdArgs.push_back("-mllvm");
1436 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1437 A->claim();
1438 }
Simon Dardisd0e83ba2016-05-27 15:13:31 +00001439
1440 if (Arg *A = Args.getLastArg(options::OPT_mcompact_branches_EQ)) {
1441 StringRef Val = StringRef(A->getValue());
1442 if (mips::hasCompactBranches(CPUName)) {
1443 if (Val == "never" || Val == "always" || Val == "optimal") {
1444 CmdArgs.push_back("-mllvm");
1445 CmdArgs.push_back(Args.MakeArgString("-mips-compact-branches=" + Val));
1446 } else
1447 D.Diag(diag::err_drv_unsupported_option_argument)
1448 << A->getOption().getName() << Val;
1449 } else
1450 D.Diag(diag::warn_target_unsupported_compact_branches) << CPUName;
1451 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001452}
1453
Hal Finkel8eb59282012-06-11 22:35:19 +00001454/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1455static std::string getPPCTargetCPU(const ArgList &Args) {
1456 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001457 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001458
1459 if (CPUName == "native") {
1460 std::string CPU = llvm::sys::getHostCPUName();
1461 if (!CPU.empty() && CPU != "generic")
1462 return CPU;
1463 else
1464 return "";
1465 }
1466
1467 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001468 .Case("common", "generic")
1469 .Case("440", "440")
1470 .Case("440fp", "440")
1471 .Case("450", "450")
1472 .Case("601", "601")
1473 .Case("602", "602")
1474 .Case("603", "603")
1475 .Case("603e", "603e")
1476 .Case("603ev", "603ev")
1477 .Case("604", "604")
1478 .Case("604e", "604e")
1479 .Case("620", "620")
1480 .Case("630", "pwr3")
1481 .Case("G3", "g3")
1482 .Case("7400", "7400")
1483 .Case("G4", "g4")
1484 .Case("7450", "7450")
1485 .Case("G4+", "g4+")
1486 .Case("750", "750")
1487 .Case("970", "970")
1488 .Case("G5", "g5")
1489 .Case("a2", "a2")
1490 .Case("a2q", "a2q")
1491 .Case("e500mc", "e500mc")
1492 .Case("e5500", "e5500")
1493 .Case("power3", "pwr3")
1494 .Case("power4", "pwr4")
1495 .Case("power5", "pwr5")
1496 .Case("power5x", "pwr5x")
1497 .Case("power6", "pwr6")
1498 .Case("power6x", "pwr6x")
1499 .Case("power7", "pwr7")
1500 .Case("power8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001501 .Case("power9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 .Case("pwr3", "pwr3")
1503 .Case("pwr4", "pwr4")
1504 .Case("pwr5", "pwr5")
1505 .Case("pwr5x", "pwr5x")
1506 .Case("pwr6", "pwr6")
1507 .Case("pwr6x", "pwr6x")
1508 .Case("pwr7", "pwr7")
1509 .Case("pwr8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001510 .Case("pwr9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001511 .Case("powerpc", "ppc")
1512 .Case("powerpc64", "ppc64")
1513 .Case("powerpc64le", "ppc64le")
1514 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001515 }
1516
1517 return "";
1518}
1519
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001520static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1521 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001522 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001523 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001524
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001525 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1526 if (FloatABI == ppc::FloatABI::Soft &&
1527 !(Triple.getArch() == llvm::Triple::ppc64 ||
1528 Triple.getArch() == llvm::Triple::ppc64le))
1529 Features.push_back("+soft-float");
1530 else if (FloatABI == ppc::FloatABI::Soft &&
1531 (Triple.getArch() == llvm::Triple::ppc64 ||
1532 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001533 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001534 << "soft float is not supported for ppc64";
1535
Eric Christopher643bb6a2013-10-16 20:40:08 +00001536 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001537 AddTargetFeature(Args, Features, options::OPT_faltivec,
1538 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001539}
1540
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001541ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1542 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1543 if (Arg *A =
1544 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1545 options::OPT_mfloat_abi_EQ)) {
1546 if (A->getOption().matches(options::OPT_msoft_float))
1547 ABI = ppc::FloatABI::Soft;
1548 else if (A->getOption().matches(options::OPT_mhard_float))
1549 ABI = ppc::FloatABI::Hard;
1550 else {
1551 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1552 .Case("soft", ppc::FloatABI::Soft)
1553 .Case("hard", ppc::FloatABI::Hard)
1554 .Default(ppc::FloatABI::Invalid);
1555 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1556 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1557 ABI = ppc::FloatABI::Hard;
1558 }
1559 }
1560 }
1561
1562 // If unspecified, choose the default based on the platform.
1563 if (ABI == ppc::FloatABI::Invalid) {
1564 ABI = ppc::FloatABI::Hard;
1565 }
1566
1567 return ABI;
1568}
1569
Ulrich Weigand8afad612014-07-28 13:17:52 +00001570void Clang::AddPPCTargetArgs(const ArgList &Args,
1571 ArgStringList &CmdArgs) const {
1572 // Select the ABI to use.
1573 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001574 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001576 case llvm::Triple::ppc64: {
1577 // When targeting a processor that supports QPX, or if QPX is
1578 // specifically enabled, default to using the ABI that supports QPX (so
1579 // long as it is not specifically disabled).
1580 bool HasQPX = false;
1581 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1582 HasQPX = A->getValue() == StringRef("a2q");
1583 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1584 if (HasQPX) {
1585 ABIName = "elfv1-qpx";
1586 break;
1587 }
1588
Ulrich Weigand8afad612014-07-28 13:17:52 +00001589 ABIName = "elfv1";
1590 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001591 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001592 case llvm::Triple::ppc64le:
1593 ABIName = "elfv2";
1594 break;
1595 default:
1596 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001597 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001598
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001599 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1600 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1601 // the option if given as we don't have backend support for any targets
1602 // that don't use the altivec abi.
1603 if (StringRef(A->getValue()) != "altivec")
1604 ABIName = A->getValue();
1605
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001606 ppc::FloatABI FloatABI =
1607 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1608
1609 if (FloatABI == ppc::FloatABI::Soft) {
1610 // Floating point operations and argument passing are soft.
1611 CmdArgs.push_back("-msoft-float");
1612 CmdArgs.push_back("-mfloat-abi");
1613 CmdArgs.push_back("soft");
1614 } else {
1615 // Floating point operations and argument passing are hard.
1616 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1617 CmdArgs.push_back("-mfloat-abi");
1618 CmdArgs.push_back("hard");
1619 }
1620
Ulrich Weigand8afad612014-07-28 13:17:52 +00001621 if (ABIName) {
1622 CmdArgs.push_back("-target-abi");
1623 CmdArgs.push_back(ABIName);
1624 }
1625}
1626
1627bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1628 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1629 return A && (A->getValue() == StringRef(Value));
1630}
1631
Tom Stellard6674c702013-04-01 20:56:53 +00001632/// Get the (LLVM) name of the R600 gpu we are targeting.
1633static std::string getR600TargetGPU(const ArgList &Args) {
1634 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001635 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001636 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001637 .Cases("rv630", "rv635", "r600")
1638 .Cases("rv610", "rv620", "rs780", "rs880")
1639 .Case("rv740", "rv770")
1640 .Case("palm", "cedar")
1641 .Cases("sumo", "sumo2", "sumo")
1642 .Case("hemlock", "cypress")
1643 .Case("aruba", "cayman")
1644 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001645 }
1646 return "";
1647}
1648
Jacques Pienaard964cc22016-03-28 21:02:54 +00001649static std::string getLanaiTargetCPU(const ArgList &Args) {
1650 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1651 return A->getValue();
1652 }
1653 return "";
1654}
1655
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001656sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
1657 const ArgList &Args) {
1658 sparc::FloatABI ABI = sparc::FloatABI::Invalid;
1659 if (Arg *A =
1660 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1661 options::OPT_mfloat_abi_EQ)) {
1662 if (A->getOption().matches(options::OPT_msoft_float))
1663 ABI = sparc::FloatABI::Soft;
1664 else if (A->getOption().matches(options::OPT_mhard_float))
1665 ABI = sparc::FloatABI::Hard;
1666 else {
1667 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue())
1668 .Case("soft", sparc::FloatABI::Soft)
1669 .Case("hard", sparc::FloatABI::Hard)
1670 .Default(sparc::FloatABI::Invalid);
1671 if (ABI == sparc::FloatABI::Invalid &&
1672 !StringRef(A->getValue()).empty()) {
1673 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1674 ABI = sparc::FloatABI::Hard;
1675 }
1676 }
1677 }
1678
1679 // If unspecified, choose the default based on the platform.
1680 // Only the hard-float ABI on Sparc is standardized, and it is the
1681 // default. GCC also supports a nonstandard soft-float ABI mode, also
1682 // implemented in LLVM. However as this is not standard we set the default
1683 // to be hard-float.
1684 if (ABI == sparc::FloatABI::Invalid) {
1685 ABI = sparc::FloatABI::Hard;
1686 }
1687
1688 return ABI;
1689}
1690
1691static void getSparcTargetFeatures(const Driver &D, const ArgList &Args,
1692 std::vector<const char *> &Features) {
1693 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);
1694 if (FloatABI == sparc::FloatABI::Soft)
1695 Features.push_back("+soft-float");
1696}
1697
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001698void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001699 ArgStringList &CmdArgs) const {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001700 //const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001701 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001702
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001703 sparc::FloatABI FloatABI =
1704 sparc::getSparcFloatABI(getToolChain().getDriver(), Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001705
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001706 if (FloatABI == sparc::FloatABI::Soft) {
1707 // Floating point operations and argument passing are soft.
1708 CmdArgs.push_back("-msoft-float");
1709 CmdArgs.push_back("-mfloat-abi");
1710 CmdArgs.push_back("soft");
1711 } else {
1712 // Floating point operations and argument passing are hard.
1713 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!");
1714 CmdArgs.push_back("-mfloat-abi");
1715 CmdArgs.push_back("hard");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001716 }
1717}
1718
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00001719void Clang::AddSystemZTargetArgs(const ArgList &Args,
1720 ArgStringList &CmdArgs) const {
1721 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1722 CmdArgs.push_back("-mbackchain");
1723}
1724
Richard Sandiford4652d892013-07-19 16:51:51 +00001725static const char *getSystemZTargetCPU(const ArgList &Args) {
1726 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1727 return A->getValue();
1728 return "z10";
1729}
1730
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001731static void getSystemZTargetFeatures(const ArgList &Args,
1732 std::vector<const char *> &Features) {
1733 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001734 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001735 if (A->getOption().matches(options::OPT_mhtm))
1736 Features.push_back("+transactional-execution");
1737 else
1738 Features.push_back("-transactional-execution");
1739 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001740 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001741 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001742 if (A->getOption().matches(options::OPT_mvx))
1743 Features.push_back("+vector");
1744 else
1745 Features.push_back("-vector");
1746 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001747}
1748
Chandler Carruth953fb082013-01-13 11:46:33 +00001749static const char *getX86TargetCPU(const ArgList &Args,
1750 const llvm::Triple &Triple) {
1751 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001752 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001753 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001754 return "core-avx2";
1755
Chandler Carruth953fb082013-01-13 11:46:33 +00001756 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001757 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001758
1759 // FIXME: Reject attempts to use -march=native unless the target matches
1760 // the host.
1761 //
1762 // FIXME: We should also incorporate the detected target features for use
1763 // with -native.
1764 std::string CPU = llvm::sys::getHostCPUName();
1765 if (!CPU.empty() && CPU != "generic")
1766 return Args.MakeArgString(CPU);
1767 }
1768
Reid Kleckner3123eff2015-06-30 16:32:04 +00001769 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1770 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1771 StringRef Arch = A->getValue();
1772 const char *CPU;
1773 if (Triple.getArch() == llvm::Triple::x86) {
1774 CPU = llvm::StringSwitch<const char *>(Arch)
1775 .Case("IA32", "i386")
1776 .Case("SSE", "pentium3")
1777 .Case("SSE2", "pentium4")
1778 .Case("AVX", "sandybridge")
1779 .Case("AVX2", "haswell")
1780 .Default(nullptr);
1781 } else {
1782 CPU = llvm::StringSwitch<const char *>(Arch)
1783 .Case("AVX", "sandybridge")
1784 .Case("AVX2", "haswell")
1785 .Default(nullptr);
1786 }
1787 if (CPU)
1788 return CPU;
1789 }
1790
Chandler Carruth953fb082013-01-13 11:46:33 +00001791 // Select the default CPU if none was given (or detection failed).
1792
1793 if (Triple.getArch() != llvm::Triple::x86_64 &&
1794 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001795 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001796
1797 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1798
1799 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001800 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001801 if (Triple.getArchName() == "x86_64h")
1802 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001803 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001804 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001805
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001806 // Set up default CPU name for PS4 compilers.
1807 if (Triple.isPS4CPU())
1808 return "btver2";
1809
Alexey Bataev286d1b92014-01-31 04:07:13 +00001810 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001811 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001812 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001813
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001814 // Everything else goes to x86-64 in 64-bit mode.
1815 if (Is64Bit)
1816 return "x86-64";
1817
1818 switch (Triple.getOS()) {
1819 case llvm::Triple::FreeBSD:
1820 case llvm::Triple::NetBSD:
1821 case llvm::Triple::OpenBSD:
1822 return "i486";
1823 case llvm::Triple::Haiku:
1824 return "i586";
1825 case llvm::Triple::Bitrig:
1826 return "i686";
1827 default:
1828 // Fallback to p4.
1829 return "pentium4";
1830 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001831}
1832
Dan Gohmanc2853072015-09-03 22:51:53 +00001833/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1834static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1835 // If we have -mcpu=, use that.
1836 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1837 StringRef CPU = A->getValue();
1838
1839#ifdef __wasm__
1840 // Handle "native" by examining the host. "native" isn't meaningful when
1841 // cross compiling, so only support this when the host is also WebAssembly.
1842 if (CPU == "native")
1843 return llvm::sys::getHostCPUName();
1844#endif
1845
1846 return CPU;
1847 }
1848
1849 return "generic";
1850}
1851
Renato Golin7c542b42015-07-27 23:44:45 +00001852static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1853 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001854 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 default:
1856 return "";
1857
Amara Emerson703da2e2013-10-31 09:32:33 +00001858 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001859 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001860 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001861
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001862 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001863 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001864 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001865 case llvm::Triple::thumbeb: {
1866 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001867 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001868 return arm::getARMTargetCPU(MCPU, MArch, T);
1869 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001870 case llvm::Triple::mips:
1871 case llvm::Triple::mipsel:
1872 case llvm::Triple::mips64:
1873 case llvm::Triple::mips64el: {
1874 StringRef CPUName;
1875 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001876 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001877 return CPUName;
1878 }
1879
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001880 case llvm::Triple::nvptx:
1881 case llvm::Triple::nvptx64:
1882 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1883 return A->getValue();
1884 return "";
1885
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001886 case llvm::Triple::ppc:
1887 case llvm::Triple::ppc64:
1888 case llvm::Triple::ppc64le: {
1889 std::string TargetCPUName = getPPCTargetCPU(Args);
1890 // LLVM may default to generating code for the native CPU,
1891 // but, like gcc, we default to a more generic option for
1892 // each architecture. (except on Darwin)
1893 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1894 if (T.getArch() == llvm::Triple::ppc64)
1895 TargetCPUName = "ppc64";
1896 else if (T.getArch() == llvm::Triple::ppc64le)
1897 TargetCPUName = "ppc64le";
1898 else
1899 TargetCPUName = "ppc";
1900 }
1901 return TargetCPUName;
1902 }
1903
1904 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001905 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001906 case llvm::Triple::sparcv9:
1907 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001908 return A->getValue();
1909 return "";
1910
1911 case llvm::Triple::x86:
1912 case llvm::Triple::x86_64:
1913 return getX86TargetCPU(Args, T);
1914
1915 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001916 return "hexagon" +
1917 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001918
Jacques Pienaard964cc22016-03-28 21:02:54 +00001919 case llvm::Triple::lanai:
1920 return getLanaiTargetCPU(Args);
1921
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001922 case llvm::Triple::systemz:
1923 return getSystemZTargetCPU(Args);
1924
1925 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001926 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001927 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001928
1929 case llvm::Triple::wasm32:
1930 case llvm::Triple::wasm64:
1931 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001932 }
1933}
1934
Alp Tokerce365ca2013-12-02 12:43:03 +00001935static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001936 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001937 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1938 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1939 // forward.
1940 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001941 std::string Plugin =
1942 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001943 CmdArgs.push_back(Args.MakeArgString(Plugin));
1944
1945 // Try to pass driver level flags relevant to LTO code generation down to
1946 // the plugin.
1947
1948 // Handle flags for selecting CPU variants.
1949 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1950 if (!CPU.empty())
1951 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001952
James Molloyf97fdae2015-12-21 10:44:36 +00001953 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1954 StringRef OOpt;
1955 if (A->getOption().matches(options::OPT_O4) ||
1956 A->getOption().matches(options::OPT_Ofast))
1957 OOpt = "3";
1958 else if (A->getOption().matches(options::OPT_O))
1959 OOpt = A->getValue();
1960 else if (A->getOption().matches(options::OPT_O0))
1961 OOpt = "0";
1962 if (!OOpt.empty())
1963 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1964 }
1965
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001966 if (IsThinLTO)
1967 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001968
1969 // If an explicit debugger tuning argument appeared, pass it along.
1970 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1971 options::OPT_ggdbN_Group)) {
1972 if (A->getOption().matches(options::OPT_glldb))
1973 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1974 else if (A->getOption().matches(options::OPT_gsce))
1975 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1976 else
1977 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1978 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001979}
1980
Sanjay Patel2987c292015-06-11 14:53:41 +00001981/// This is a helper function for validating the optional refinement step
1982/// parameter in reciprocal argument strings. Return false if there is an error
1983/// parsing the refinement step. Otherwise, return true and set the Position
1984/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001985static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001986 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001987 const char RefinementStepToken = ':';
1988 Position = In.find(RefinementStepToken);
1989 if (Position != StringRef::npos) {
1990 StringRef Option = A.getOption().getName();
1991 StringRef RefStep = In.substr(Position + 1);
1992 // Allow exactly one numeric character for the additional refinement
1993 // step parameter. This is reasonable for all currently-supported
1994 // operations and architectures because we would expect that a larger value
1995 // of refinement steps would cause the estimate "optimization" to
1996 // under-perform the native operation. Also, if the estimate does not
1997 // converge quickly, it probably will not ever converge, so further
1998 // refinement steps will not produce a better answer.
1999 if (RefStep.size() != 1) {
2000 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2001 return false;
2002 }
2003 char RefStepChar = RefStep[0];
2004 if (RefStepChar < '0' || RefStepChar > '9') {
2005 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
2006 return false;
2007 }
2008 }
2009 return true;
2010}
2011
2012/// The -mrecip flag requires processing of many optional parameters.
2013static void ParseMRecip(const Driver &D, const ArgList &Args,
2014 ArgStringList &OutStrings) {
2015 StringRef DisabledPrefixIn = "!";
2016 StringRef DisabledPrefixOut = "!";
2017 StringRef EnabledPrefixOut = "";
2018 StringRef Out = "-mrecip=";
2019
2020 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
2021 if (!A)
2022 return;
2023
2024 unsigned NumOptions = A->getNumValues();
2025 if (NumOptions == 0) {
2026 // No option is the same as "all".
2027 OutStrings.push_back(Args.MakeArgString(Out + "all"));
2028 return;
2029 }
2030
2031 // Pass through "all", "none", or "default" with an optional refinement step.
2032 if (NumOptions == 1) {
2033 StringRef Val = A->getValue(0);
2034 size_t RefStepLoc;
2035 if (!getRefinementStep(Val, D, *A, RefStepLoc))
2036 return;
2037 StringRef ValBase = Val.slice(0, RefStepLoc);
2038 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
2039 OutStrings.push_back(Args.MakeArgString(Out + Val));
2040 return;
2041 }
2042 }
2043
2044 // Each reciprocal type may be enabled or disabled individually.
2045 // Check each input value for validity, concatenate them all back together,
2046 // and pass through.
2047
2048 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002049 OptionStrings.insert(std::make_pair("divd", false));
2050 OptionStrings.insert(std::make_pair("divf", false));
2051 OptionStrings.insert(std::make_pair("vec-divd", false));
2052 OptionStrings.insert(std::make_pair("vec-divf", false));
2053 OptionStrings.insert(std::make_pair("sqrtd", false));
2054 OptionStrings.insert(std::make_pair("sqrtf", false));
2055 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
2056 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00002057
2058 for (unsigned i = 0; i != NumOptions; ++i) {
2059 StringRef Val = A->getValue(i);
2060
2061 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2062 // Ignore the disablement token for string matching.
2063 if (IsDisabled)
2064 Val = Val.substr(1);
2065
2066 size_t RefStep;
2067 if (!getRefinementStep(Val, D, *A, RefStep))
2068 return;
2069
2070 StringRef ValBase = Val.slice(0, RefStep);
2071 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2072 if (OptionIter == OptionStrings.end()) {
2073 // Try again specifying float suffix.
2074 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2075 if (OptionIter == OptionStrings.end()) {
2076 // The input name did not match any known option string.
2077 D.Diag(diag::err_drv_unknown_argument) << Val;
2078 return;
2079 }
2080 // The option was specified without a float or double suffix.
2081 // Make sure that the double entry was not already specified.
2082 // The float entry will be checked below.
2083 if (OptionStrings[ValBase.str() + 'd']) {
2084 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2085 return;
2086 }
2087 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002088
Sanjay Patel2987c292015-06-11 14:53:41 +00002089 if (OptionIter->second == true) {
2090 // Duplicate option specified.
2091 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2092 return;
2093 }
2094
2095 // Mark the matched option as found. Do not allow duplicate specifiers.
2096 OptionIter->second = true;
2097
2098 // If the precision was not specified, also mark the double entry as found.
2099 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2100 OptionStrings[ValBase.str() + 'd'] = true;
2101
2102 // Build the output string.
2103 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2104 Out = Args.MakeArgString(Out + Prefix + Val);
2105 if (i != NumOptions - 1)
2106 Out = Args.MakeArgString(Out + ",");
2107 }
2108
2109 OutStrings.push_back(Args.MakeArgString(Out));
2110}
2111
Eric Christopherc54920a2015-03-23 19:26:05 +00002112static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002113 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002114 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002115 // If -march=native, autodetect the feature list.
2116 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2117 if (StringRef(A->getValue()) == "native") {
2118 llvm::StringMap<bool> HostFeatures;
2119 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2120 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002121 Features.push_back(
2122 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002123 }
2124 }
2125
Jim Grosbach82eee262013-11-16 00:53:35 +00002126 if (Triple.getArchName() == "x86_64h") {
2127 // x86_64h implies quite a few of the more modern subtarget features
2128 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2129 Features.push_back("-rdrnd");
2130 Features.push_back("-aes");
2131 Features.push_back("-pclmul");
2132 Features.push_back("-rtm");
2133 Features.push_back("-hle");
2134 Features.push_back("-fsgsbase");
2135 }
2136
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002137 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002138 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002139 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002140 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002141 Features.push_back("+sse4.2");
2142 Features.push_back("+popcnt");
2143 } else
2144 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002145 }
2146
Eric Christopherc54920a2015-03-23 19:26:05 +00002147 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002148 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2149 StringRef Arch = A->getValue();
2150 bool ArchUsed = false;
2151 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002152 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002153 if (Arch == "AVX" || Arch == "AVX2") {
2154 ArchUsed = true;
2155 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2156 }
2157 }
2158 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002159 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002160 if (Arch == "IA32") {
2161 ArchUsed = true;
2162 } else if (Arch == "SSE" || Arch == "SSE2") {
2163 ArchUsed = true;
2164 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2165 }
2166 }
2167 if (!ArchUsed)
2168 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2169 }
2170
Jim Grosbach82eee262013-11-16 00:53:35 +00002171 // Now add any that the user explicitly requested on the command line,
2172 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002173 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002174}
2175
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002176void Clang::AddX86TargetArgs(const ArgList &Args,
2177 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002178 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002179 Args.hasArg(options::OPT_mkernel) ||
2180 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002181 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002182
Bob Wilson2616e2e2013-02-10 16:01:41 +00002183 // Default to avoid implicit floating-point for kernel/kext code, but allow
2184 // that to be overridden with -mno-soft-float.
2185 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2186 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002187 if (Arg *A = Args.getLastArg(
2188 options::OPT_msoft_float, options::OPT_mno_soft_float,
2189 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002190 const Option &O = A->getOption();
2191 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2192 O.matches(options::OPT_msoft_float));
2193 }
2194 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002195 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002196
2197 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2198 StringRef Value = A->getValue();
2199 if (Value == "intel" || Value == "att") {
2200 CmdArgs.push_back("-mllvm");
2201 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2202 } else {
2203 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2204 << A->getOption().getName() << Value;
2205 }
2206 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002207
2208 // Set flags to support MCU ABI.
2209 if (Args.hasArg(options::OPT_miamcu)) {
2210 CmdArgs.push_back("-mfloat-abi");
2211 CmdArgs.push_back("soft");
2212 CmdArgs.push_back("-mstack-alignment=4");
2213 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002214}
2215
Tony Linthicum76329bf2011-12-12 21:14:55 +00002216void Clang::AddHexagonTargetArgs(const ArgList &Args,
2217 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002218 CmdArgs.push_back("-mqdsp6-compat");
2219 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002220
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002221 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2222 std::string N = llvm::utostr(G.getValue());
2223 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002224 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002225 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002226 }
2227
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002228 if (!Args.hasArg(options::OPT_fno_short_enums))
2229 CmdArgs.push_back("-fshort-enums");
2230 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002231 CmdArgs.push_back("-mllvm");
2232 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002233 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002234 CmdArgs.push_back("-mllvm");
2235 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002236}
2237
Jacques Pienaard964cc22016-03-28 21:02:54 +00002238void Clang::AddLanaiTargetArgs(const ArgList &Args,
2239 ArgStringList &CmdArgs) const {
2240 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2241 StringRef CPUName = A->getValue();
2242
2243 CmdArgs.push_back("-target-cpu");
2244 CmdArgs.push_back(Args.MakeArgString(CPUName));
2245 }
2246 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2247 StringRef Value = A->getValue();
2248 // Only support mregparm=4 to support old usage. Report error for all other
2249 // cases.
2250 int Mregparm;
2251 if (Value.getAsInteger(10, Mregparm)) {
2252 if (Mregparm != 4) {
2253 getToolChain().getDriver().Diag(
2254 diag::err_drv_unsupported_option_argument)
2255 << A->getOption().getName() << Value;
2256 }
2257 }
2258 }
2259}
2260
Dan Gohmane3d71e12016-01-07 01:00:21 +00002261void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2262 ArgStringList &CmdArgs) const {
2263 // Default to "hidden" visibility.
2264 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2265 options::OPT_fvisibility_ms_compat)) {
2266 CmdArgs.push_back("-fvisibility");
2267 CmdArgs.push_back("hidden");
2268 }
2269}
2270
Kevin Qin110db6f2014-07-18 07:03:22 +00002271// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002272static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002273 std::vector<const char *> &Features) {
2274 SmallVector<StringRef, 8> Split;
2275 text.split(Split, StringRef("+"), -1, false);
2276
Benjamin Kramer72e64312015-09-24 14:48:49 +00002277 for (StringRef Feature : Split) {
Renato Golin3b8709c2016-05-25 12:36:31 +00002278 const char *result = llvm::StringSwitch<const char *>(Feature)
2279 .Case("fp", "+fp-armv8")
2280 .Case("simd", "+neon")
2281 .Case("crc", "+crc")
2282 .Case("crypto", "+crypto")
2283 .Case("fp16", "+fullfp16")
2284 .Case("profile", "+spe")
2285 .Case("nofp", "-fp-armv8")
2286 .Case("nosimd", "-neon")
2287 .Case("nocrc", "-crc")
2288 .Case("nocrypto", "-crypto")
2289 .Case("nofp16", "-fullfp16")
2290 .Case("noprofile", "-spe")
2291 .Default(nullptr);
2292 if (result)
2293 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002294 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002295 D.Diag(diag::err_drv_no_neon_modifier);
2296 else
2297 return false;
2298 }
2299 return true;
2300}
2301
2302// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2303// decode CPU and feature.
2304static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2305 std::vector<const char *> &Features) {
2306 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2307 CPU = Split.first;
Renato Golin3b8709c2016-05-25 12:36:31 +00002308 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
2309 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2310 CPU == "kryo") {
2311 Features.push_back("+neon");
2312 Features.push_back("+crc");
2313 Features.push_back("+crypto");
2314 } else if (CPU == "cyclone") {
2315 Features.push_back("+neon");
2316 Features.push_back("+crypto");
2317 } else if (CPU == "generic") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002318 Features.push_back("+neon");
2319 } else {
Renato Golin3b8709c2016-05-25 12:36:31 +00002320 return false;
2321 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002322
2323 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2324 return false;
2325
2326 return true;
2327}
2328
2329static bool
2330getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2331 const ArgList &Args,
2332 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002333 std::string MarchLowerCase = March.lower();
2334 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002335
Renato Golin3b8709c2016-05-25 12:36:31 +00002336 if (Split.first == "armv8-a" || Split.first == "armv8a") {
2337 // ok, no additional features.
2338 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
2339 Features.push_back("+v8.1a");
2340 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2341 Features.push_back("+v8.2a");
2342 } else {
2343 return false;
2344 }
2345
2346 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002347 return false;
2348
2349 return true;
2350}
2351
2352static bool
2353getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2354 const ArgList &Args,
2355 std::vector<const char *> &Features) {
2356 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002357 std::string McpuLowerCase = Mcpu.lower();
2358 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002359 return false;
2360
2361 return true;
2362}
2363
2364static bool
2365getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2366 const ArgList &Args,
2367 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002368 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002369 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002370 if (MtuneLowerCase == "native")
2371 MtuneLowerCase = llvm::sys::getHostCPUName();
2372 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002373 Features.push_back("+zcm");
2374 Features.push_back("+zcz");
2375 }
2376 return true;
2377}
2378
2379static bool
2380getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2381 const ArgList &Args,
2382 std::vector<const char *> &Features) {
2383 StringRef CPU;
2384 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002385 std::string McpuLowerCase = Mcpu.lower();
2386 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002387 return false;
2388
2389 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2390}
2391
Justin Bognerf9052562015-11-13 23:07:31 +00002392static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002393 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002394 Arg *A;
2395 bool success = true;
2396 // Enable NEON by default.
2397 Features.push_back("+neon");
2398 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2399 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2400 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2401 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002402 else if (Args.hasArg(options::OPT_arch))
2403 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2404 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002405
2406 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2407 success =
2408 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2409 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2410 success =
2411 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002412 else if (Args.hasArg(options::OPT_arch))
2413 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2414 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002415
2416 if (!success)
2417 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002418
2419 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2420 Features.push_back("-fp-armv8");
2421 Features.push_back("-crypto");
2422 Features.push_back("-neon");
2423 }
Bradley Smith418c5932014-05-02 15:17:51 +00002424
2425 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002426 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002427 if (A->getOption().matches(options::OPT_mcrc))
2428 Features.push_back("+crc");
2429 else
2430 Features.push_back("-crc");
2431 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002432
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002433 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2434 options::OPT_munaligned_access))
2435 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2436 Features.push_back("+strict-align");
2437
Justin Bognerf9052562015-11-13 23:07:31 +00002438 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002439 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002440}
2441
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002442static void getHexagonTargetFeatures(const ArgList &Args,
2443 std::vector<const char *> &Features) {
2444 bool HasHVX = false, HasHVXD = false;
2445
Eric Christopher49062a52015-12-22 03:12:34 +00002446 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2447 // doing dependent option handling here rather than in initFeatureMap or a
2448 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002449 for (auto &A : Args) {
2450 auto &Opt = A->getOption();
2451 if (Opt.matches(options::OPT_mhexagon_hvx))
2452 HasHVX = true;
2453 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2454 HasHVXD = HasHVX = false;
2455 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2456 HasHVXD = HasHVX = true;
2457 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2458 HasHVXD = false;
2459 else
2460 continue;
2461 A->claim();
2462 }
2463
2464 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2465 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2466}
2467
Dan Gohmanc2853072015-09-03 22:51:53 +00002468static void getWebAssemblyTargetFeatures(const ArgList &Args,
2469 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002470 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002471}
2472
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002473static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2474 std::vector<const char *> &Features) {
2475 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2476 StringRef value = dAbi->getValue();
2477 if (value == "1.0") {
2478 Features.push_back("+amdgpu-debugger-insert-nops");
Konstantin Zhuravlyove6dbd902016-05-26 19:36:39 +00002479 Features.push_back("+amdgpu-debugger-reserve-regs");
2480 Features.push_back("+amdgpu-debugger-emit-prologue");
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002481 } else {
2482 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2483 }
2484 }
2485
2486 handleTargetFeaturesGroup(
2487 Args, Features, options::OPT_m_amdgpu_Features_Group);
2488}
2489
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002490static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002491 const ArgList &Args, ArgStringList &CmdArgs,
2492 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002493 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002494 std::vector<const char *> Features;
2495 switch (Triple.getArch()) {
2496 default:
2497 break;
2498 case llvm::Triple::mips:
2499 case llvm::Triple::mipsel:
2500 case llvm::Triple::mips64:
2501 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002502 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002503 break;
2504
2505 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002506 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002507 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002508 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002509 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002510 break;
2511
2512 case llvm::Triple::ppc:
2513 case llvm::Triple::ppc64:
2514 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002515 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002516 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002517 case llvm::Triple::systemz:
2518 getSystemZTargetFeatures(Args, Features);
2519 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002520 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002521 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002522 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002523 break;
2524 case llvm::Triple::x86:
2525 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002526 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002527 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002528 case llvm::Triple::hexagon:
2529 getHexagonTargetFeatures(Args, Features);
2530 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002531 case llvm::Triple::wasm32:
2532 case llvm::Triple::wasm64:
2533 getWebAssemblyTargetFeatures(Args, Features);
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00002534 break;
2535 case llvm::Triple::sparc:
2536 case llvm::Triple::sparcel:
2537 case llvm::Triple::sparcv9:
2538 getSparcTargetFeatures(D, Args, Features);
Dan Gohmanc2853072015-09-03 22:51:53 +00002539 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002540 case llvm::Triple::r600:
2541 case llvm::Triple::amdgcn:
2542 getAMDGPUTargetFeatures(D, Args, Features);
2543 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002544 }
Rafael Espindola43964802013-08-21 17:34:32 +00002545
2546 // Find the last of each feature.
2547 llvm::StringMap<unsigned> LastOpt;
2548 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2549 const char *Name = Features[I];
2550 assert(Name[0] == '-' || Name[0] == '+');
2551 LastOpt[Name + 1] = I;
2552 }
2553
2554 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2555 // If this feature was overridden, ignore it.
2556 const char *Name = Features[I];
2557 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2558 assert(LastI != LastOpt.end());
2559 unsigned Last = LastI->second;
2560 if (Last != I)
2561 continue;
2562
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002563 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002564 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002565 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002566}
2567
David Majnemerae394812014-12-09 00:12:30 +00002568static bool
2569shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2570 const llvm::Triple &Triple) {
2571 // We use the zero-cost exception tables for Objective-C if the non-fragile
2572 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2573 // later.
2574 if (runtime.isNonFragile())
2575 return true;
2576
2577 if (!Triple.isMacOSX())
2578 return false;
2579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002581 (Triple.getArch() == llvm::Triple::x86_64 ||
2582 Triple.getArch() == llvm::Triple::arm));
2583}
2584
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002585/// Adds exception related arguments to the driver command arguments. There's a
2586/// master flag, -fexceptions and also language specific flags to enable/disable
2587/// C++ and Objective-C exceptions. This makes it possible to for example
2588/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002589static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002590 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002591 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002592 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002593 const Driver &D = TC.getDriver();
2594 const llvm::Triple &Triple = TC.getTriple();
2595
Chad Rosier4fab82c2012-03-26 22:04:46 +00002596 if (KernelOrKext) {
2597 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2598 // arguments now to avoid warnings about unused arguments.
2599 Args.ClaimAllArgs(options::OPT_fexceptions);
2600 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2601 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2602 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2603 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2604 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002605 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002606 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002607
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002608 // See if the user explicitly enabled exceptions.
2609 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2610 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002611
David Majnemerae394812014-12-09 00:12:30 +00002612 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2613 // is not necessarily sensible, but follows GCC.
2614 if (types::isObjC(InputType) &&
2615 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002616 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002617 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002618
David Majnemerae394812014-12-09 00:12:30 +00002619 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002620 }
2621
2622 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002623 // Disable C++ EH by default on XCore and PS4.
2624 bool CXXExceptionsEnabled =
2625 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002626 Arg *ExceptionArg = Args.getLastArg(
2627 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2628 options::OPT_fexceptions, options::OPT_fno_exceptions);
2629 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002630 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002631 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2632 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002633
2634 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002635 if (Triple.isPS4CPU()) {
2636 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2637 assert(ExceptionArg &&
2638 "On the PS4 exceptions should only be enabled if passing "
2639 "an argument");
2640 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2641 const Arg *RTTIArg = TC.getRTTIArg();
2642 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2643 D.Diag(diag::err_drv_argument_not_allowed_with)
2644 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2645 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2646 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2647 } else
2648 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2649
Anders Carlssone96ab552011-02-28 02:27:16 +00002650 CmdArgs.push_back("-fcxx-exceptions");
2651
David Majnemer8de68642014-12-05 08:11:58 +00002652 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002653 }
2654 }
2655
David Majnemer8de68642014-12-05 08:11:58 +00002656 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002657 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002658}
2659
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002660static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002661 bool Default = true;
2662 if (TC.getTriple().isOSDarwin()) {
2663 // The native darwin assembler doesn't support the linker_option directives,
2664 // so we disable them if we think the .s file will be passed to it.
2665 Default = TC.useIntegratedAs();
2666 }
2667 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2668 Default);
2669}
2670
Ted Kremenek62093662013-03-12 17:02:12 +00002671static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2672 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002673 bool UseDwarfDirectory =
2674 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2675 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002676 return !UseDwarfDirectory;
2677}
2678
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002679/// \brief Check whether the given input tree contains any compilation actions.
2680static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002681 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002682 return true;
2683
Nico Weber5a459f82016-02-23 19:30:43 +00002684 for (const auto &AI : A->inputs())
2685 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002686 return true;
2687
2688 return false;
2689}
2690
2691/// \brief Check if -relax-all should be passed to the internal assembler.
2692/// This is done by default when compiling non-assembler source with -O0.
2693static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2694 bool RelaxDefault = true;
2695
2696 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2697 RelaxDefault = A->getOption().matches(options::OPT_O0);
2698
2699 if (RelaxDefault) {
2700 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002701 for (const auto &Act : C.getActions()) {
2702 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002703 RelaxDefault = true;
2704 break;
2705 }
2706 }
2707 }
2708
2709 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002710 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002711}
2712
Paul Robinson0334a042015-12-19 19:41:48 +00002713// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2714// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002715static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002716 assert(A.getOption().matches(options::OPT_gN_Group) &&
2717 "Not a -g option that specifies a debug-info level");
2718 if (A.getOption().matches(options::OPT_g0) ||
2719 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002720 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002721 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2722 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002723 return codegenoptions::DebugLineTablesOnly;
2724 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002725}
2726
Douglas Katzman3459ce22015-10-08 04:24:12 +00002727// Extract the integer N from a string spelled "-dwarf-N", returning 0
2728// on mismatch. The StringRef input (rather than an Arg) allows
2729// for use by the "-Xassembler" option parser.
2730static unsigned DwarfVersionNum(StringRef ArgValue) {
2731 return llvm::StringSwitch<unsigned>(ArgValue)
2732 .Case("-gdwarf-2", 2)
2733 .Case("-gdwarf-3", 3)
2734 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002735 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002736 .Default(0);
2737}
2738
2739static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002740 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002741 unsigned DwarfVersion,
2742 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002743 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002744 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002745 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2746 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002747 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002748 CmdArgs.push_back("-debug-info-kind=limited");
2749 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002750 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002751 CmdArgs.push_back("-debug-info-kind=standalone");
2752 break;
2753 default:
2754 break;
2755 }
2756 if (DwarfVersion > 0)
2757 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002758 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002759 switch (DebuggerTuning) {
2760 case llvm::DebuggerKind::GDB:
2761 CmdArgs.push_back("-debugger-tuning=gdb");
2762 break;
2763 case llvm::DebuggerKind::LLDB:
2764 CmdArgs.push_back("-debugger-tuning=lldb");
2765 break;
2766 case llvm::DebuggerKind::SCE:
2767 CmdArgs.push_back("-debugger-tuning=sce");
2768 break;
2769 default:
2770 break;
2771 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002772}
2773
David Blaikie9260ed62013-07-25 21:19:01 +00002774static void CollectArgsForIntegratedAssembler(Compilation &C,
2775 const ArgList &Args,
2776 ArgStringList &CmdArgs,
2777 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002778 if (UseRelaxAll(C, Args))
2779 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002780
David Majnemer2b9349d2015-12-21 22:09:34 +00002781 // Only default to -mincremental-linker-compatible if we think we are
2782 // targeting the MSVC linker.
2783 bool DefaultIncrementalLinkerCompatible =
2784 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2785 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2786 options::OPT_mno_incremental_linker_compatible,
2787 DefaultIncrementalLinkerCompatible))
2788 CmdArgs.push_back("-mincremental-linker-compatible");
2789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002790 // When passing -I arguments to the assembler we sometimes need to
2791 // unconditionally take the next argument. For example, when parsing
2792 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2793 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2794 // arg after parsing the '-I' arg.
2795 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002797 // When using an integrated assembler, translate -Wa, and -Xassembler
2798 // options.
2799 bool CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002800
2801 bool UseRelaxRelocations = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002802 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002803 for (const Arg *A :
2804 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2805 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002806
Benjamin Kramer72e64312015-09-24 14:48:49 +00002807 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002808 if (TakeNextArg) {
2809 CmdArgs.push_back(Value.data());
2810 TakeNextArg = false;
2811 continue;
2812 }
David Blaikie9260ed62013-07-25 21:19:01 +00002813
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002814 switch (C.getDefaultToolChain().getArch()) {
2815 default:
2816 break;
2817 case llvm::Triple::mips:
2818 case llvm::Triple::mipsel:
2819 case llvm::Triple::mips64:
2820 case llvm::Triple::mips64el:
2821 if (Value == "--trap") {
2822 CmdArgs.push_back("-target-feature");
2823 CmdArgs.push_back("+use-tcc-in-div");
2824 continue;
2825 }
2826 if (Value == "--break") {
2827 CmdArgs.push_back("-target-feature");
2828 CmdArgs.push_back("-use-tcc-in-div");
2829 continue;
2830 }
2831 if (Value.startswith("-msoft-float")) {
2832 CmdArgs.push_back("-target-feature");
2833 CmdArgs.push_back("+soft-float");
2834 continue;
2835 }
2836 if (Value.startswith("-mhard-float")) {
2837 CmdArgs.push_back("-target-feature");
2838 CmdArgs.push_back("-soft-float");
2839 continue;
2840 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002841
2842 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2843 .Case("-mips1", "+mips1")
2844 .Case("-mips2", "+mips2")
2845 .Case("-mips3", "+mips3")
2846 .Case("-mips4", "+mips4")
2847 .Case("-mips5", "+mips5")
2848 .Case("-mips32", "+mips32")
2849 .Case("-mips32r2", "+mips32r2")
2850 .Case("-mips32r3", "+mips32r3")
2851 .Case("-mips32r5", "+mips32r5")
2852 .Case("-mips32r6", "+mips32r6")
2853 .Case("-mips64", "+mips64")
2854 .Case("-mips64r2", "+mips64r2")
2855 .Case("-mips64r3", "+mips64r3")
2856 .Case("-mips64r5", "+mips64r5")
2857 .Case("-mips64r6", "+mips64r6")
2858 .Default(nullptr);
2859 if (MipsTargetFeature)
2860 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002861 }
2862
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002863 if (Value == "-force_cpusubtype_ALL") {
2864 // Do nothing, this is the default and we don't support anything else.
2865 } else if (Value == "-L") {
2866 CmdArgs.push_back("-msave-temp-labels");
2867 } else if (Value == "--fatal-warnings") {
2868 CmdArgs.push_back("-massembler-fatal-warnings");
2869 } else if (Value == "--noexecstack") {
2870 CmdArgs.push_back("-mnoexecstack");
2871 } else if (Value == "-compress-debug-sections" ||
2872 Value == "--compress-debug-sections") {
2873 CompressDebugSections = true;
2874 } else if (Value == "-nocompress-debug-sections" ||
2875 Value == "--nocompress-debug-sections") {
2876 CompressDebugSections = false;
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002877 } else if (Value == "-mrelax-relocations=yes" ||
2878 Value == "--mrelax-relocations=yes") {
2879 UseRelaxRelocations = true;
2880 } else if (Value == "-mrelax-relocations=no" ||
2881 Value == "--mrelax-relocations=no") {
2882 UseRelaxRelocations = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002883 } else if (Value.startswith("-I")) {
2884 CmdArgs.push_back(Value.data());
2885 // We need to consume the next argument if the current arg is a plain
2886 // -I. The next arg will be the include directory.
2887 if (Value == "-I")
2888 TakeNextArg = true;
2889 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002890 // "-gdwarf-N" options are not cc1as options.
2891 unsigned DwarfVersion = DwarfVersionNum(Value);
2892 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2893 CmdArgs.push_back(Value.data());
2894 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002895 RenderDebugEnablingArgs(Args, CmdArgs,
2896 codegenoptions::LimitedDebugInfo,
2897 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002898 }
Renato Golin7c542b42015-07-27 23:44:45 +00002899 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2900 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2901 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002902 } else {
2903 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002904 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002905 }
2906 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002907 }
2908 if (CompressDebugSections) {
2909 if (llvm::zlib::isAvailable())
2910 CmdArgs.push_back("-compress-debug-sections");
2911 else
2912 D.Diag(diag::warn_debug_compression_unavailable);
2913 }
Rafael Espindolaf8f01c32016-05-29 02:01:14 +00002914 if (UseRelaxRelocations)
2915 CmdArgs.push_back("--mrelax-relocations");
Scott Egertonb67d4692016-01-14 13:01:48 +00002916 if (MipsTargetFeature != nullptr) {
2917 CmdArgs.push_back("-target-feature");
2918 CmdArgs.push_back(MipsTargetFeature);
2919 }
David Blaikie9260ed62013-07-25 21:19:01 +00002920}
2921
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002922// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002923// FIXME: Make sure we can also emit shared objects if they're requested
2924// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002925static void addClangRT(const ToolChain &TC, const ArgList &Args,
2926 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002927 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002928}
2929
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002930namespace {
2931enum OpenMPRuntimeKind {
2932 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2933 /// without knowing what runtime to target.
2934 OMPRT_Unknown,
2935
2936 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2937 /// the default for Clang.
2938 OMPRT_OMP,
2939
2940 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2941 /// this runtime but can swallow the pragmas, and find and link against the
2942 /// runtime library itself.
2943 OMPRT_GOMP,
2944
Chandler Carruthc6625c62015-05-28 21:10:31 +00002945 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002946 /// OpenMP runtime. We support this mode for users with existing dependencies
2947 /// on this runtime library name.
2948 OMPRT_IOMP5
2949};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002950}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002951
2952/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002953static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2954 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002955 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2956
2957 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2958 if (A)
2959 RuntimeName = A->getValue();
2960
2961 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002962 .Case("libomp", OMPRT_OMP)
2963 .Case("libgomp", OMPRT_GOMP)
2964 .Case("libiomp5", OMPRT_IOMP5)
2965 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002966
2967 if (RT == OMPRT_Unknown) {
2968 if (A)
2969 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002970 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002971 else
2972 // FIXME: We could use a nicer diagnostic here.
2973 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2974 }
2975
2976 return RT;
2977}
2978
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002979static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2980 const ArgList &Args) {
2981 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2982 options::OPT_fno_openmp, false))
2983 return;
2984
2985 switch (getOpenMPRuntime(TC, Args)) {
2986 case OMPRT_OMP:
2987 CmdArgs.push_back("-lomp");
2988 break;
2989 case OMPRT_GOMP:
2990 CmdArgs.push_back("-lgomp");
2991 break;
2992 case OMPRT_IOMP5:
2993 CmdArgs.push_back("-liomp5");
2994 break;
2995 case OMPRT_Unknown:
2996 // Already diagnosed.
2997 break;
2998 }
2999}
3000
Alexey Samsonov52550342014-09-15 19:58:40 +00003001static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
3002 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00003003 bool IsShared, bool IsWhole) {
3004 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00003005 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00003006 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00003007 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00003008 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00003009}
3010
Alexey Samsonov52550342014-09-15 19:58:40 +00003011// Tries to use a file with the list of dynamic symbols that need to be exported
3012// from the runtime library. Returns true if the file was found.
3013static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
3014 ArgStringList &CmdArgs,
3015 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00003016 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00003017 if (llvm::sys::fs::exists(SanRT + ".syms")) {
3018 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00003019 return true;
3020 }
3021 return false;
3022}
3023
3024static void linkSanitizerRuntimeDeps(const ToolChain &TC,
3025 ArgStringList &CmdArgs) {
3026 // Force linking against the system libraries sanitizers depends on
3027 // (see PR15823 why this is necessary).
3028 CmdArgs.push_back("--no-as-needed");
3029 CmdArgs.push_back("-lpthread");
3030 CmdArgs.push_back("-lrt");
3031 CmdArgs.push_back("-lm");
3032 // There's no libdl on FreeBSD.
3033 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3034 CmdArgs.push_back("-ldl");
3035}
3036
3037static void
3038collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3039 SmallVectorImpl<StringRef> &SharedRuntimes,
3040 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003041 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
3042 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
3043 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003044 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
3045 // Collect shared runtimes.
3046 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
3047 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00003048 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003049 // The stats_client library is also statically linked into DSOs.
3050 if (SanArgs.needsStatsRt())
3051 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003052
Alexey Samsonov52550342014-09-15 19:58:40 +00003053 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003054 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003055 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003056 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00003057 }
3058 if (SanArgs.needsAsanRt()) {
3059 if (SanArgs.needsSharedAsanRt()) {
3060 HelperStaticRuntimes.push_back("asan-preinit");
3061 } else {
3062 StaticRuntimes.push_back("asan");
3063 if (SanArgs.linkCXXRuntimes())
3064 StaticRuntimes.push_back("asan_cxx");
3065 }
3066 }
3067 if (SanArgs.needsDfsanRt())
3068 StaticRuntimes.push_back("dfsan");
3069 if (SanArgs.needsLsanRt())
3070 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003071 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003072 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003073 if (SanArgs.linkCXXRuntimes())
3074 StaticRuntimes.push_back("msan_cxx");
3075 }
3076 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003077 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003078 if (SanArgs.linkCXXRuntimes())
3079 StaticRuntimes.push_back("tsan_cxx");
3080 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003081 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00003082 StaticRuntimes.push_back("ubsan_standalone");
3083 if (SanArgs.linkCXXRuntimes())
3084 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003085 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003086 if (SanArgs.needsSafeStackRt())
3087 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003088 if (SanArgs.needsCfiRt())
3089 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003090 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003091 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003092 if (SanArgs.linkCXXRuntimes())
3093 StaticRuntimes.push_back("ubsan_standalone_cxx");
3094 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003095 if (SanArgs.needsStatsRt()) {
3096 NonWholeStaticRuntimes.push_back("stats");
3097 RequiredSymbols.push_back("__sanitizer_stats_register");
3098 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003099 if (SanArgs.needsEsanRt())
3100 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003101}
3102
Alexey Samsonov52550342014-09-15 19:58:40 +00003103// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3104// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3105static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003106 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003107 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003108 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003109 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003110 NonWholeStaticRuntimes, HelperStaticRuntimes,
3111 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003112 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003113 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003114 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003115 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003116 bool AddExportDynamic = false;
3117 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003118 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003119 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3120 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003121 for (auto RT : NonWholeStaticRuntimes) {
3122 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3123 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3124 }
3125 for (auto S : RequiredSymbols) {
3126 CmdArgs.push_back("-u");
3127 CmdArgs.push_back(Args.MakeArgString(S));
3128 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003129 // If there is a static runtime with no dynamic list, force all the symbols
3130 // to be dynamic to be sure we export sanitizer interface functions.
3131 if (AddExportDynamic)
3132 CmdArgs.push_back("-export-dynamic");
3133 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003134}
3135
Reid Kleckner86ea7702015-02-04 23:45:07 +00003136static bool areOptimizationsEnabled(const ArgList &Args) {
3137 // Find the last -O arg and see if it is non-zero.
3138 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3139 return !A->getOption().matches(options::OPT_O0);
3140 // Defaults to -O0.
3141 return false;
3142}
3143
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003144static bool shouldUseFramePointerForTarget(const ArgList &Args,
3145 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003146 switch (Triple.getArch()) {
3147 case llvm::Triple::xcore:
3148 case llvm::Triple::wasm32:
3149 case llvm::Triple::wasm64:
3150 // XCore never wants frame pointers, regardless of OS.
3151 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003152 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003153 default:
3154 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003155 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003156
3157 if (Triple.isOSLinux()) {
3158 switch (Triple.getArch()) {
3159 // Don't use a frame pointer on linux if optimizing for certain targets.
3160 case llvm::Triple::mips64:
3161 case llvm::Triple::mips64el:
3162 case llvm::Triple::mips:
3163 case llvm::Triple::mipsel:
3164 case llvm::Triple::systemz:
3165 case llvm::Triple::x86:
3166 case llvm::Triple::x86_64:
3167 return !areOptimizationsEnabled(Args);
3168 default:
3169 return true;
3170 }
3171 }
3172
3173 if (Triple.isOSWindows()) {
3174 switch (Triple.getArch()) {
3175 case llvm::Triple::x86:
3176 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003177 case llvm::Triple::x86_64:
3178 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003179 case llvm::Triple::arm:
3180 case llvm::Triple::thumb:
3181 // Windows on ARM builds with FPO disabled to aid fast stack walking
3182 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003183 default:
3184 // All other supported Windows ISAs use xdata unwind information, so frame
3185 // pointers are not generally useful.
3186 return false;
3187 }
3188 }
3189
3190 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003191}
3192
Rafael Espindola224dd632011-12-14 21:02:23 +00003193static bool shouldUseFramePointer(const ArgList &Args,
3194 const llvm::Triple &Triple) {
3195 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3196 options::OPT_fomit_frame_pointer))
3197 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003198 if (Args.hasArg(options::OPT_pg))
3199 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003200
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003201 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003202}
3203
Eric Christopherb7d97e92013-04-03 01:58:53 +00003204static bool shouldUseLeafFramePointer(const ArgList &Args,
3205 const llvm::Triple &Triple) {
3206 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3207 options::OPT_momit_leaf_frame_pointer))
3208 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003209 if (Args.hasArg(options::OPT_pg))
3210 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003211
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003212 if (Triple.isPS4CPU())
3213 return false;
3214
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003215 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003216}
3217
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003218/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003219static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003220 SmallString<128> cwd;
3221 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003222 CmdArgs.push_back("-fdebug-compilation-dir");
3223 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003224 }
3225}
3226
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003227static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003228 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3229 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3230 SmallString<128> T(FinalOutput->getValue());
3231 llvm::sys::path::replace_extension(T, "dwo");
3232 return Args.MakeArgString(T);
3233 } else {
3234 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003235 SmallString<128> T(
3236 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003237 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003238 llvm::sys::path::replace_extension(F, "dwo");
3239 T += F;
3240 return Args.MakeArgString(F);
3241 }
3242}
3243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003244static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3245 const JobAction &JA, const ArgList &Args,
3246 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003247 ArgStringList ExtractArgs;
3248 ExtractArgs.push_back("--extract-dwo");
3249
3250 ArgStringList StripArgs;
3251 StripArgs.push_back("--strip-dwo");
3252
3253 // Grabbing the output of the earlier compile step.
3254 StripArgs.push_back(Output.getFilename());
3255 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003256 ExtractArgs.push_back(OutFile);
3257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003258 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003259 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003260
3261 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003262 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003263
3264 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003265 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003266}
3267
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003268/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003269/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3270static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003271 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003272 if (A->getOption().matches(options::OPT_O4) ||
3273 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003274 return true;
3275
3276 if (A->getOption().matches(options::OPT_O0))
3277 return false;
3278
3279 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3280
Rafael Espindola91780de2013-08-26 14:05:41 +00003281 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003282 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003283 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003284 return true;
3285
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003286 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003287 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003288 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003289
3290 unsigned OptLevel = 0;
3291 if (S.getAsInteger(10, OptLevel))
3292 return false;
3293
3294 return OptLevel > 1;
3295 }
3296
3297 return false;
3298}
3299
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003300/// Add -x lang to \p CmdArgs for \p Input.
3301static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3302 ArgStringList &CmdArgs) {
3303 // When using -verify-pch, we don't want to provide the type
3304 // 'precompiled-header' if it was inferred from the file extension
3305 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3306 return;
3307
3308 CmdArgs.push_back("-x");
3309 if (Args.hasArg(options::OPT_rewrite_objc))
3310 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3311 else
3312 CmdArgs.push_back(types::getTypeName(Input.getType()));
3313}
3314
David Majnemerc371ff02015-03-22 08:39:22 +00003315static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003316 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003317 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003318
3319 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003320 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003321
3322 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003323 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003324 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003325 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003326}
3327
Rafael Espindola577637a2015-01-03 00:06:04 +00003328// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003329// options that build systems might add but are unused when assembling or only
3330// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003331static void claimNoWarnArgs(const ArgList &Args) {
3332 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003333 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003334 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003335 Args.ClaimAllArgs(options::OPT_flto);
3336 Args.ClaimAllArgs(options::OPT_fno_lto);
3337}
3338
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003339static void appendUserToPath(SmallVectorImpl<char> &Result) {
3340#ifdef LLVM_ON_UNIX
3341 const char *Username = getenv("LOGNAME");
3342#else
3343 const char *Username = getenv("USERNAME");
3344#endif
3345 if (Username) {
3346 // Validate that LoginName can be used in a path, and get its length.
3347 size_t Len = 0;
3348 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003349 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003350 Username = nullptr;
3351 break;
3352 }
3353 }
3354
3355 if (Username && Len > 0) {
3356 Result.append(Username, Username + Len);
3357 return;
3358 }
3359 }
3360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003361// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003362#ifdef LLVM_ON_UNIX
3363 std::string UID = llvm::utostr(getuid());
3364#else
3365 // FIXME: Windows seems to have an 'SID' that might work.
3366 std::string UID = "9999";
3367#endif
3368 Result.append(UID.begin(), UID.end());
3369}
3370
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003371VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC,
David Majnemere11d3732015-06-08 00:22:46 +00003372 const llvm::Triple &Triple,
3373 const llvm::opt::ArgList &Args,
3374 bool IsWindowsMSVC) {
3375 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3376 IsWindowsMSVC) ||
3377 Args.hasArg(options::OPT_fmsc_version) ||
3378 Args.hasArg(options::OPT_fms_compatibility_version)) {
3379 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3380 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003381 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003382
3383 if (MSCVersion && MSCompatibilityVersion) {
3384 if (D)
3385 D->Diag(diag::err_drv_argument_not_allowed_with)
3386 << MSCVersion->getAsString(Args)
3387 << MSCompatibilityVersion->getAsString(Args);
3388 return VersionTuple();
3389 }
3390
3391 if (MSCompatibilityVersion) {
3392 VersionTuple MSVT;
3393 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3394 D->Diag(diag::err_drv_invalid_value)
3395 << MSCompatibilityVersion->getAsString(Args)
3396 << MSCompatibilityVersion->getValue();
3397 return MSVT;
3398 }
3399
3400 if (MSCVersion) {
3401 unsigned Version = 0;
3402 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3403 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3404 << MSCVersion->getValue();
3405 return getMSCompatibilityVersion(Version);
3406 }
3407
3408 unsigned Major, Minor, Micro;
3409 Triple.getEnvironmentVersion(Major, Minor, Micro);
3410 if (Major || Minor || Micro)
3411 return VersionTuple(Major, Minor, Micro);
3412
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003413 if (IsWindowsMSVC) {
3414 VersionTuple MSVT = TC.getMSVCVersionFromExe();
3415 if (!MSVT.empty())
3416 return MSVT;
3417
3418 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
3419 return VersionTuple(18);
3420 }
David Majnemere11d3732015-06-08 00:22:46 +00003421 }
3422 return VersionTuple();
3423}
3424
Diego Novilloa0545962015-07-10 18:00:07 +00003425static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3426 const InputInfo &Output, const ArgList &Args,
3427 ArgStringList &CmdArgs) {
3428 auto *ProfileGenerateArg = Args.getLastArg(
3429 options::OPT_fprofile_instr_generate,
3430 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003431 options::OPT_fprofile_generate_EQ,
3432 options::OPT_fno_profile_instr_generate);
3433 if (ProfileGenerateArg &&
3434 ProfileGenerateArg->getOption().matches(
3435 options::OPT_fno_profile_instr_generate))
3436 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003437
3438 auto *ProfileUseArg = Args.getLastArg(
3439 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003440 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3441 options::OPT_fno_profile_instr_use);
3442 if (ProfileUseArg &&
3443 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3444 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003445
3446 if (ProfileGenerateArg && ProfileUseArg)
3447 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003448 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003449
Diego Novillo758f3f52015-08-05 21:49:51 +00003450 if (ProfileGenerateArg) {
3451 if (ProfileGenerateArg->getOption().matches(
3452 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003453 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3454 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003455 else if (ProfileGenerateArg->getOption().matches(
3456 options::OPT_fprofile_generate_EQ)) {
3457 SmallString<128> Path(ProfileGenerateArg->getValue());
3458 llvm::sys::path::append(Path, "default.profraw");
3459 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003460 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3461 }
3462 // The default is to use Clang Instrumentation.
3463 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003464 }
Diego Novilloa0545962015-07-10 18:00:07 +00003465
Diego Novillo758f3f52015-08-05 21:49:51 +00003466 if (ProfileUseArg) {
3467 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003468 CmdArgs.push_back(Args.MakeArgString(
3469 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003470 else if ((ProfileUseArg->getOption().matches(
3471 options::OPT_fprofile_use_EQ) ||
3472 ProfileUseArg->getOption().matches(
3473 options::OPT_fprofile_instr_use))) {
3474 SmallString<128> Path(
3475 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3476 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3477 llvm::sys::path::append(Path, "default.profdata");
3478 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003479 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003480 }
Diego Novilloa0545962015-07-10 18:00:07 +00003481 }
3482
3483 if (Args.hasArg(options::OPT_ftest_coverage) ||
3484 Args.hasArg(options::OPT_coverage))
3485 CmdArgs.push_back("-femit-coverage-notes");
3486 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3487 false) ||
3488 Args.hasArg(options::OPT_coverage))
3489 CmdArgs.push_back("-femit-coverage-data");
3490
Diego Novilloc4b94da2015-08-05 23:27:40 +00003491 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3492 options::OPT_fno_coverage_mapping, false) &&
3493 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003494 D.Diag(diag::err_drv_argument_only_allowed_with)
3495 << "-fcoverage-mapping"
3496 << "-fprofile-instr-generate";
3497
Diego Novilloc4b94da2015-08-05 23:27:40 +00003498 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3499 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003500 CmdArgs.push_back("-fcoverage-mapping");
3501
3502 if (C.getArgs().hasArg(options::OPT_c) ||
3503 C.getArgs().hasArg(options::OPT_S)) {
3504 if (Output.isFilename()) {
3505 CmdArgs.push_back("-coverage-file");
3506 SmallString<128> CoverageFilename;
3507 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3508 CoverageFilename = FinalOutput->getValue();
3509 } else {
3510 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3511 }
3512 if (llvm::sys::path::is_relative(CoverageFilename)) {
3513 SmallString<128> Pwd;
3514 if (!llvm::sys::fs::current_path(Pwd)) {
3515 llvm::sys::path::append(Pwd, CoverageFilename);
3516 CoverageFilename.swap(Pwd);
3517 }
3518 }
3519 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3520 }
3521 }
3522}
3523
Paul Robinsond083b9a2015-12-16 17:25:27 +00003524static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3525 ArgStringList &CmdArgs) {
3526 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3527 false) ||
3528 Args.hasFlag(options::OPT_fprofile_generate,
3529 options::OPT_fno_profile_instr_generate, false) ||
3530 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3531 options::OPT_fno_profile_instr_generate, false) ||
3532 Args.hasFlag(options::OPT_fprofile_instr_generate,
3533 options::OPT_fno_profile_instr_generate, false) ||
3534 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3535 options::OPT_fno_profile_instr_generate, false) ||
3536 Args.hasArg(options::OPT_fcreate_profile) ||
3537 Args.hasArg(options::OPT_coverage)))
3538 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3539}
3540
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003541/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3542/// smooshes them together with platform defaults, to decide whether
3543/// this compile should be using PIC mode or not. Returns a tuple of
3544/// (RelocationModel, PICLevel, IsPIE).
3545static std::tuple<llvm::Reloc::Model, unsigned, bool>
3546ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3547 const ArgList &Args) {
3548 // FIXME: why does this code...and so much everywhere else, use both
3549 // ToolChain.getTriple() and Triple?
3550 bool PIE = ToolChain.isPIEDefault();
3551 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003552 // The Darwin/MachO default to use PIC does not apply when using -static.
3553 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3554 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003555 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003556 bool IsPICLevelTwo = PIC;
3557
3558 bool KernelOrKext =
3559 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3560
3561 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003562 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003563 switch (ToolChain.getArch()) {
3564 case llvm::Triple::arm:
3565 case llvm::Triple::armeb:
3566 case llvm::Triple::thumb:
3567 case llvm::Triple::thumbeb:
3568 case llvm::Triple::aarch64:
3569 case llvm::Triple::mips:
3570 case llvm::Triple::mipsel:
3571 case llvm::Triple::mips64:
3572 case llvm::Triple::mips64el:
3573 PIC = true; // "-fpic"
3574 break;
3575
3576 case llvm::Triple::x86:
3577 case llvm::Triple::x86_64:
3578 PIC = true; // "-fPIC"
3579 IsPICLevelTwo = true;
3580 break;
3581
3582 default:
3583 break;
3584 }
3585 }
3586
3587 // OpenBSD-specific defaults for PIE
3588 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3589 switch (ToolChain.getArch()) {
3590 case llvm::Triple::mips64:
3591 case llvm::Triple::mips64el:
3592 case llvm::Triple::sparcel:
3593 case llvm::Triple::x86:
3594 case llvm::Triple::x86_64:
3595 IsPICLevelTwo = false; // "-fpie"
3596 break;
3597
3598 case llvm::Triple::ppc:
3599 case llvm::Triple::sparc:
3600 case llvm::Triple::sparcv9:
3601 IsPICLevelTwo = true; // "-fPIE"
3602 break;
3603
3604 default:
3605 break;
3606 }
3607 }
3608
3609 // The last argument relating to either PIC or PIE wins, and no
3610 // other argument is used. If the last argument is any flavor of the
3611 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3612 // option implicitly enables PIC at the same level.
3613 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3614 options::OPT_fpic, options::OPT_fno_pic,
3615 options::OPT_fPIE, options::OPT_fno_PIE,
3616 options::OPT_fpie, options::OPT_fno_pie);
3617 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3618 // is forced, then neither PIC nor PIE flags will have no effect.
3619 if (!ToolChain.isPICDefaultForced()) {
3620 if (LastPICArg) {
3621 Option O = LastPICArg->getOption();
3622 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3623 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3624 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3625 PIC =
3626 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3627 IsPICLevelTwo =
3628 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3629 } else {
3630 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003631 if (Triple.isPS4CPU()) {
3632 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3633 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3634 if (Model != "kernel") {
3635 PIC = true;
3636 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3637 << LastPICArg->getSpelling();
3638 }
3639 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003640 }
3641 }
3642 }
3643
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003644 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3645 // PIC level would've been set to level 1, force it back to level 2 PIC
3646 // instead.
3647 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003648 IsPICLevelTwo |= ToolChain.isPICDefault();
3649
James Y Knightc4015d32015-08-21 04:14:55 +00003650 // This kernel flags are a trump-card: they will disable PIC/PIE
3651 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003652 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3653 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003654 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003655
3656 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3657 // This is a very special mode. It trumps the other modes, almost no one
3658 // uses it, and it isn't even valid on any OS but Darwin.
3659 if (!ToolChain.getTriple().isOSDarwin())
3660 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3661 << A->getSpelling() << ToolChain.getTriple().str();
3662
3663 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3664
3665 // Only a forced PIC mode can cause the actual compile to have PIC defines
3666 // etc., no flags are sufficient. This behavior was selected to closely
3667 // match that of llvm-gcc and Apple GCC before that.
3668 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3669
3670 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3671 }
3672
3673 if (PIC)
3674 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3675
3676 return std::make_tuple(llvm::Reloc::Static, 0, false);
3677}
3678
3679static const char *RelocationModelName(llvm::Reloc::Model Model) {
3680 switch (Model) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003681 case llvm::Reloc::Static:
3682 return "static";
3683 case llvm::Reloc::PIC_:
3684 return "pic";
3685 case llvm::Reloc::DynamicNoPIC:
3686 return "dynamic-no-pic";
3687 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003688 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003689}
3690
3691static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3692 ArgStringList &CmdArgs) {
3693 llvm::Reloc::Model RelocationModel;
3694 unsigned PICLevel;
3695 bool IsPIE;
3696 std::tie(RelocationModel, PICLevel, IsPIE) =
3697 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3698
3699 if (RelocationModel != llvm::Reloc::Static)
3700 CmdArgs.push_back("-KPIC");
3701}
3702
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003703void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003704 const InputInfo &Output, const InputInfoList &Inputs,
3705 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003706 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3707 const llvm::Triple Triple(TripleStr);
3708
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003709 bool KernelOrKext =
3710 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003711 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003712 ArgStringList CmdArgs;
3713
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003714 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003715 bool IsWindowsCygnus =
3716 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003717 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003718 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003719
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003720 // Check number of inputs for sanity. We need at least one input.
3721 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003722 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003723 // CUDA compilation may have multiple inputs (source file + results of
3724 // device-side compilations). All other jobs are expected to have exactly one
3725 // input.
3726 bool IsCuda = types::isCuda(Input.getType());
3727 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003728
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003729 // Invoke ourselves in -cc1 mode.
3730 //
3731 // FIXME: Implement custom jobs for internal actions.
3732 CmdArgs.push_back("-cc1");
3733
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003734 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003735 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003736 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003737
Artem Belevichfa11ab52015-11-17 22:28:46 +00003738 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003739 if (IsCuda) {
3740 // FIXME: We need a (better) way to pass information about
3741 // particular compilation pass we're constructing here. For now we
3742 // can check which toolchain we're using and pick the other one to
3743 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003744 if (&getToolChain() == C.getCudaDeviceToolChain())
3745 AuxToolChain = C.getCudaHostToolChain();
3746 else if (&getToolChain() == C.getCudaHostToolChain())
3747 AuxToolChain = C.getCudaDeviceToolChain();
3748 else
3749 llvm_unreachable("Can't figure out CUDA compilation mode.");
3750 assert(AuxToolChain != nullptr && "No aux toolchain.");
3751 CmdArgs.push_back("-aux-triple");
3752 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3753 }
3754
James Y Knight2db38f32015-08-15 03:45:25 +00003755 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3756 Triple.getArch() == llvm::Triple::thumb)) {
3757 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003758 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003759 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003760 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003761 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003762 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003763 }
3764
Tim Northover336f1892014-03-29 13:16:12 +00003765 // Push all default warning arguments that are specific to
3766 // the given target. These come before user provided warning options
3767 // are provided.
3768 getToolChain().addClangWarningOptions(CmdArgs);
3769
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003770 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003771 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003772
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003773 if (isa<AnalyzeJobAction>(JA)) {
3774 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3775 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003776 } else if (isa<MigrateJobAction>(JA)) {
3777 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003778 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003779 if (Output.getType() == types::TY_Dependencies)
3780 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003781 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003782 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003783 if (Args.hasArg(options::OPT_rewrite_objc) &&
3784 !Args.hasArg(options::OPT_g_Group))
3785 CmdArgs.push_back("-P");
3786 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003787 } else if (isa<AssembleJobAction>(JA)) {
3788 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003789
David Blaikie9260ed62013-07-25 21:19:01 +00003790 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003791
3792 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003793 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003794 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003795 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003796 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003797
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003798 if (JA.getType() == types::TY_Nothing)
3799 CmdArgs.push_back("-fsyntax-only");
3800 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003801 CmdArgs.push_back("-emit-pch");
3802 else
3803 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003804 } else if (isa<VerifyPCHJobAction>(JA)) {
3805 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003806 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003807 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3808 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003809 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003810 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003811 } else if (JA.getType() == types::TY_LLVM_IR ||
3812 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003813 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003814 } else if (JA.getType() == types::TY_LLVM_BC ||
3815 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003816 CmdArgs.push_back("-emit-llvm-bc");
3817 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003818 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003819 } else if (JA.getType() == types::TY_AST) {
3820 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003821 } else if (JA.getType() == types::TY_ModuleFile) {
3822 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003823 } else if (JA.getType() == types::TY_RewrittenObjC) {
3824 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003825 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003826 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3827 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003828 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003829 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003830 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003831 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003832
3833 // Preserve use-list order by default when emitting bitcode, so that
3834 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3835 // same result as running passes here. For LTO, we don't need to preserve
3836 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003837 if (JA.getType() == types::TY_LLVM_BC)
3838 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003839
3840 if (D.isUsingLTO())
3841 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003842 }
3843
Teresa Johnsonaff22322015-12-07 19:21:34 +00003844 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3845 if (!types::isLLVMIR(Input.getType()))
3846 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3847 << "-x ir";
3848 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3849 }
3850
Steven Wu574b0f22016-03-01 01:07:58 +00003851 // Embed-bitcode option.
3852 if (C.getDriver().embedBitcodeEnabled() &&
3853 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3854 // Add flags implied by -fembed-bitcode.
Steven Wu27fb5222016-05-11 16:26:03 +00003855 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
Steven Wu574b0f22016-03-01 01:07:58 +00003856 // Disable all llvm IR level optimizations.
3857 CmdArgs.push_back("-disable-llvm-optzns");
3858 }
3859 if (C.getDriver().embedBitcodeMarkerOnly())
Steven Wu27fb5222016-05-11 16:26:03 +00003860 CmdArgs.push_back("-fembed-bitcode=marker");
Steven Wu574b0f22016-03-01 01:07:58 +00003861
Justin Bognera88f0122014-06-20 22:59:50 +00003862 // We normally speed up the clang process a bit by skipping destructors at
3863 // exit, but when we're generating diagnostics we can rely on some of the
3864 // cleanup.
3865 if (!C.isForDiagnostics())
3866 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003868// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003869#ifdef NDEBUG
3870 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003871 // Discard LLVM value names in -asserts builds.
3872 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003873#endif
3874
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003875 // Set the main file name, so that debug info works even with
3876 // -save-temps.
3877 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003878 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003879
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003880 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003881 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003882 if (Args.hasArg(options::OPT_static))
3883 CmdArgs.push_back("-static-define");
3884
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003885 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003886 // Enable region store model by default.
3887 CmdArgs.push_back("-analyzer-store=region");
3888
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003889 // Treat blocks as analysis entry points.
3890 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3891
Ted Kremenek49c79792011-03-24 00:28:47 +00003892 CmdArgs.push_back("-analyzer-eagerly-assume");
3893
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003894 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003895 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003896 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003897
Devin Coughlin65c77082016-01-21 20:09:49 +00003898 if (!IsWindowsMSVC) {
3899 CmdArgs.push_back("-analyzer-checker=unix");
3900 } else {
3901 // Enable "unix" checkers that also work on Windows.
3902 CmdArgs.push_back("-analyzer-checker=unix.API");
3903 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3904 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3905 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3906 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3907 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3908 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003909
Sean Evesonb38c32b2016-01-06 10:03:58 +00003910 // Disable some unix checkers for PS4.
3911 if (IsPS4CPU) {
3912 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3913 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3914 }
3915
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003916 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003917 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003918
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003919 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003920
Artem Belevichba558952015-05-06 18:20:23 +00003921 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003922 CmdArgs.push_back("-analyzer-checker=cplusplus");
3923
Sean Evesonb38c32b2016-01-06 10:03:58 +00003924 if (!IsPS4CPU) {
3925 CmdArgs.push_back(
3926 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3927 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3928 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3929 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3930 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3931 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3932 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003933
3934 // Default nullability checks.
3935 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3936 CmdArgs.push_back(
3937 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003938 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003939
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003940 // Set the output format. The default is plist, for (lame) historical
3941 // reasons.
3942 CmdArgs.push_back("-analyzer-output");
3943 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003944 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003945 else
3946 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003947
Ted Kremenekfe449a22010-03-22 22:32:05 +00003948 // Disable the presentation of standard compiler warnings when
3949 // using --analyze. We only want to show static analyzer diagnostics
3950 // or frontend errors.
3951 CmdArgs.push_back("-w");
3952
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003953 // Add -Xanalyzer arguments when running as analyzer.
3954 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003955 }
3956
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003957 CheckCodeGenerationOptions(D, Args);
3958
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003959 llvm::Reloc::Model RelocationModel;
3960 unsigned PICLevel;
3961 bool IsPIE;
3962 std::tie(RelocationModel, PICLevel, IsPIE) =
3963 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003964
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003965 const char *RMName = RelocationModelName(RelocationModel);
3966 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003967 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003968 CmdArgs.push_back(RMName);
3969 }
3970 if (PICLevel > 0) {
3971 CmdArgs.push_back("-pic-level");
3972 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3973 if (IsPIE) {
3974 CmdArgs.push_back("-pie-level");
3975 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003976 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003977 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003978
Renato Golin4854d802015-11-09 12:40:41 +00003979 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3980 CmdArgs.push_back("-meabi");
3981 CmdArgs.push_back(A->getValue());
3982 }
3983
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003984 CmdArgs.push_back("-mthread-model");
3985 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3986 CmdArgs.push_back(A->getValue());
3987 else
3988 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3989
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003990 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3991
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003992 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3993 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003994 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003995
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003996 // LLVM Code Generator Options.
3997
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003998 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3999 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00004000 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
4001 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004002 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00004003 CmdArgs.push_back(A->getValue());
4004 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00004005 }
4006 }
4007
Alp Tokerfb8d02b2014-06-05 22:10:59 +00004008 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
4009 StringRef v = A->getValue();
4010 CmdArgs.push_back("-mllvm");
4011 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
4012 A->claim();
4013 }
4014
Nirav Daved2f44d82016-04-05 17:50:43 +00004015 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
4016 true))
4017 CmdArgs.push_back("-fno-jump-tables");
4018
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004019 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
4020 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00004021 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00004022 }
4023
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004024 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
4025 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004026 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00004027 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004028 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00004029 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
4030 CmdArgs.push_back("-fpcc-struct-return");
4031 } else {
4032 assert(A->getOption().matches(options::OPT_freg_struct_return));
4033 CmdArgs.push_back("-freg-struct-return");
4034 }
4035 }
4036
Roman Divacky65b88cd2011-03-01 17:40:53 +00004037 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
Alexey Bataeva7547182016-05-18 09:06:38 +00004038 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
Roman Divacky65b88cd2011-03-01 17:40:53 +00004039
Rafael Espindola224dd632011-12-14 21:02:23 +00004040 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004041 CmdArgs.push_back("-mdisable-fp-elim");
4042 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
4043 options::OPT_fno_zero_initialized_in_bss))
4044 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004045
4046 bool OFastEnabled = isOptimizationLevelFast(Args);
4047 // If -Ofast is the optimization level, then -fstrict-aliasing should be
4048 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004049 OptSpecifier StrictAliasingAliasOption =
4050 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004051 // We turn strict aliasing off by default if we're in CL mode, since MSVC
4052 // doesn't do any TBAA.
4053 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004054 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004055 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00004056 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00004057 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
4058 options::OPT_fno_struct_path_tbaa))
4059 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00004060 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
4061 false))
4062 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00004063 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
4064 options::OPT_fno_strict_vtable_pointers,
4065 false))
4066 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00004067 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
4068 options::OPT_fno_optimize_sibling_calls))
4069 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004070
Eric Christopher006208c2013-04-04 06:29:47 +00004071 // Handle segmented stacks.
4072 if (Args.hasArg(options::OPT_fsplit_stack))
4073 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004074
4075 // If -Ofast is the optimization level, then -ffast-math should be enabled.
4076 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004077 OptSpecifier FastMathAliasOption =
4078 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4079
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004080 // Handle various floating point optimization flags, mapping them to the
4081 // appropriate LLVM code generation flags. The pattern for all of these is to
4082 // default off the codegen optimizations, and if any flag enables them and no
4083 // flag disables them after the flag enabling them, enable the codegen
4084 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004085 if (Arg *A = Args.getLastArg(
4086 options::OPT_ffast_math, FastMathAliasOption,
4087 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4088 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4089 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004090 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4091 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004092 A->getOption().getID() != options::OPT_fhonor_infinities)
4093 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004094 if (Arg *A = Args.getLastArg(
4095 options::OPT_ffast_math, FastMathAliasOption,
4096 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4097 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4098 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004099 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4100 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004101 A->getOption().getID() != options::OPT_fhonor_nans)
4102 CmdArgs.push_back("-menable-no-nans");
4103
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004104 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4105 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004106 if (Arg *A =
4107 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4108 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4109 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004110 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4111 // However, turning *off* -ffast_math merely restores the toolchain default
4112 // (which may be false).
4113 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4114 A->getOption().getID() == options::OPT_ffast_math ||
4115 A->getOption().getID() == options::OPT_Ofast)
4116 MathErrno = false;
4117 else if (A->getOption().getID() == options::OPT_fmath_errno)
4118 MathErrno = true;
4119 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004120 if (MathErrno)
4121 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004122
4123 // There are several flags which require disabling very specific
4124 // optimizations. Any of these being disabled forces us to turn off the
4125 // entire set of LLVM optimizations, so collect them through all the flag
4126 // madness.
4127 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004128 if (Arg *A = Args.getLastArg(
4129 options::OPT_ffast_math, FastMathAliasOption,
4130 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4131 options::OPT_fno_unsafe_math_optimizations,
4132 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004133 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4134 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004135 A->getOption().getID() != options::OPT_fno_associative_math)
4136 AssociativeMath = true;
4137 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004138 if (Arg *A = Args.getLastArg(
4139 options::OPT_ffast_math, FastMathAliasOption,
4140 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4141 options::OPT_fno_unsafe_math_optimizations,
4142 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004143 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4144 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004145 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4146 ReciprocalMath = true;
4147 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004148 if (Arg *A = Args.getLastArg(
4149 options::OPT_ffast_math, FastMathAliasOption,
4150 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4151 options::OPT_fno_unsafe_math_optimizations,
4152 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004153 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4154 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004155 A->getOption().getID() != options::OPT_fsigned_zeros)
4156 SignedZeros = false;
4157 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004158 if (Arg *A = Args.getLastArg(
4159 options::OPT_ffast_math, FastMathAliasOption,
4160 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4161 options::OPT_fno_unsafe_math_optimizations,
4162 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004163 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4164 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004165 A->getOption().getID() != options::OPT_ftrapping_math)
4166 TrappingMath = false;
4167 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4168 !TrappingMath)
4169 CmdArgs.push_back("-menable-unsafe-fp-math");
4170
Sanjay Patel76c9e092015-01-23 16:40:50 +00004171 if (!SignedZeros)
4172 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004173
Sanjay Patel359b1052015-04-09 15:03:23 +00004174 if (ReciprocalMath)
4175 CmdArgs.push_back("-freciprocal-math");
4176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004177 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004178 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004179 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004180 options::OPT_ffp_contract)) {
4181 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004182 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004183 if (Val == "fast" || Val == "on" || Val == "off") {
4184 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4185 } else {
4186 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004187 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004188 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004189 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4190 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004191 // If fast-math is set then set the fp-contract mode to fast.
4192 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4193 }
4194 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004195
Sanjay Patel2987c292015-06-11 14:53:41 +00004196 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004197
Bob Wilson6a039162012-07-19 03:52:53 +00004198 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4199 // and if we find them, tell the frontend to provide the appropriate
4200 // preprocessor macros. This is distinct from enabling any optimizations as
4201 // these options induce language changes which must survive serialization
4202 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004203 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4204 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004205 if (!A->getOption().matches(options::OPT_fno_fast_math))
4206 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004207 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4208 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004209 if (A->getOption().matches(options::OPT_ffinite_math_only))
4210 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004211
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004212 // Decide whether to use verbose asm. Verbose assembly is the default on
4213 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004214 bool IsIntegratedAssemblerDefault =
4215 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004216 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004217 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004218 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004219 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004220
Rafael Espindolab8a12932015-05-22 20:44:03 +00004221 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4222 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004223 CmdArgs.push_back("-no-integrated-as");
4224
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004225 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4226 CmdArgs.push_back("-mdebug-pass");
4227 CmdArgs.push_back("Structure");
4228 }
4229 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4230 CmdArgs.push_back("-mdebug-pass");
4231 CmdArgs.push_back("Arguments");
4232 }
4233
Justin Lebar710a35f2016-01-25 22:36:35 +00004234 // Enable -mconstructor-aliases except on darwin, where we have to work around
4235 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4236 // aliases aren't supported.
4237 if (!getToolChain().getTriple().isOSDarwin() &&
4238 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004239 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004240
John McCall7ef5cb32011-03-18 02:56:14 +00004241 // Darwin's kernel doesn't support guard variables; just die if we
4242 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004243 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004244 CmdArgs.push_back("-fforbid-guard-variables");
4245
Akira Hatanaka02028482015-11-12 17:21:22 +00004246 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4247 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004248 CmdArgs.push_back("-mms-bitfields");
4249 }
John McCall8517abc2010-02-19 02:45:38 +00004250
Daniel Dunbar306945d2009-09-16 06:17:29 +00004251 // This is a coarse approximation of what llvm-gcc actually does, both
4252 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4253 // complicated ways.
4254 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004255 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4256 options::OPT_fno_asynchronous_unwind_tables,
4257 (getToolChain().IsUnwindTablesDefault() ||
4258 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4259 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004260 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4261 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004262 CmdArgs.push_back("-munwind-tables");
4263
Chandler Carruth05fb5852012-11-21 23:40:23 +00004264 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004265
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004266 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4267 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004268 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004269 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004270
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004271 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004272 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004273
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004274 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004275 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004276 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004277 }
4278
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004279 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004280 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004281 if (!CPU.empty()) {
4282 CmdArgs.push_back("-target-cpu");
4283 CmdArgs.push_back(Args.MakeArgString(CPU));
4284 }
4285
Rafael Espindolaeb265472013-08-21 21:59:03 +00004286 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4287 CmdArgs.push_back("-mfpmath");
4288 CmdArgs.push_back(A->getValue());
4289 }
4290
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004291 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004292 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004293
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004294 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004295 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004296 default:
4297 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004298
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004299 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004300 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004301 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004302 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004303 // Use the effective triple, which takes into account the deployment target.
4304 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004305 break;
4306
Tim Northover573cbee2014-05-24 12:52:07 +00004307 case llvm::Triple::aarch64:
4308 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004309 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004310 break;
4311
Eric Christopher0b26a612010-03-02 02:41:08 +00004312 case llvm::Triple::mips:
4313 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004314 case llvm::Triple::mips64:
4315 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004316 AddMIPSTargetArgs(Args, CmdArgs);
4317 break;
4318
Ulrich Weigand8afad612014-07-28 13:17:52 +00004319 case llvm::Triple::ppc:
4320 case llvm::Triple::ppc64:
4321 case llvm::Triple::ppc64le:
4322 AddPPCTargetArgs(Args, CmdArgs);
4323 break;
4324
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004325 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004326 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004327 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004328 AddSparcTargetArgs(Args, CmdArgs);
4329 break;
4330
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00004331 case llvm::Triple::systemz:
4332 AddSystemZTargetArgs(Args, CmdArgs);
4333 break;
4334
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004335 case llvm::Triple::x86:
4336 case llvm::Triple::x86_64:
4337 AddX86TargetArgs(Args, CmdArgs);
4338 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004339
Jacques Pienaard964cc22016-03-28 21:02:54 +00004340 case llvm::Triple::lanai:
4341 AddLanaiTargetArgs(Args, CmdArgs);
4342 break;
4343
Tony Linthicum76329bf2011-12-12 21:14:55 +00004344 case llvm::Triple::hexagon:
4345 AddHexagonTargetArgs(Args, CmdArgs);
4346 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004347
4348 case llvm::Triple::wasm32:
4349 case llvm::Triple::wasm64:
4350 AddWebAssemblyTargetArgs(Args, CmdArgs);
4351 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004352 }
4353
Douglas Katzman3459ce22015-10-08 04:24:12 +00004354 // The 'g' groups options involve a somewhat intricate sequence of decisions
4355 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004356 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004357 // * what level of debug info to generate
4358 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004359 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004360 // This avoids having to monkey around further in cc1 other than to disable
4361 // codeview if not running in a Windows environment. Perhaps even that
4362 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004363 unsigned DwarfVersion = 0;
4364 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4365 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004366 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004367 bool EmitCodeView = false;
4368
Hans Wennborg75958c42013-08-08 00:17:41 +00004369 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004370 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004371 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004372 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004373
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004374 // Pass the linker version in use.
4375 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4376 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004377 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004378 }
4379
Eric Christopherb7d97e92013-04-03 01:58:53 +00004380 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004381 CmdArgs.push_back("-momit-leaf-frame-pointer");
4382
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004383 // Explicitly error on some things we know we don't support and can't just
4384 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004385 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4386 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004387 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004388 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004389 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4390 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004391 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004392 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004393 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004394 }
4395
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004396 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004397 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004398 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004399 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004400 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4401 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004402 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004403 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004404 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004405
Chad Rosierbe10f982011-08-02 17:58:04 +00004406 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004407 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004408 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4409 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004410 }
4411
Rafael Espindola08a692a2010-03-07 04:46:18 +00004412 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004413 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004414 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004415 // If the last option explicitly specified a debug-info level, use it.
4416 if (A->getOption().matches(options::OPT_gN_Group)) {
4417 DebugInfoKind = DebugLevelToInfoKind(*A);
4418 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4419 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4420 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004421 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004422 A->getIndex() > SplitDwarfArg->getIndex())
4423 SplitDwarfArg = nullptr;
4424 } else
4425 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004426 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004427 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004428
Paul Robinson0334a042015-12-19 19:41:48 +00004429 // If a debugger tuning argument appeared, remember it.
4430 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4431 options::OPT_ggdbN_Group)) {
4432 if (A->getOption().matches(options::OPT_glldb))
4433 DebuggerTuning = llvm::DebuggerKind::LLDB;
4434 else if (A->getOption().matches(options::OPT_gsce))
4435 DebuggerTuning = llvm::DebuggerKind::SCE;
4436 else
4437 DebuggerTuning = llvm::DebuggerKind::GDB;
4438 }
4439
4440 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004441 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004442 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004443 DwarfVersion = DwarfVersionNum(A->getSpelling());
4444
Reid Kleckner124955a2015-08-05 18:51:13 +00004445 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004446 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4447 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4448 // DwarfVersion remains at 0 if no explicit choice was made.
4449 CmdArgs.push_back("-gcodeview");
4450 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004451 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004452 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4453 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004454
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004455 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4456 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004457
4458 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004459 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004460 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004461 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004462
Eric Christopher138c32b2013-09-13 22:37:55 +00004463 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004464 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004465 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004466 CmdArgs.push_back("-dwarf-ext-refs");
4467 CmdArgs.push_back("-fmodule-format=obj");
4468 }
4469
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004470 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4471 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004472 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004473 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004474 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004475 CmdArgs.push_back("-backend-option");
4476 CmdArgs.push_back("-split-dwarf=Enable");
4477 }
4478
Douglas Katzman3459ce22015-10-08 04:24:12 +00004479 // After we've dealt with all combinations of things that could
4480 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4481 // figure out if we need to "upgrade" it to standalone debug info.
4482 // We parse these two '-f' options whether or not they will be used,
4483 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4484 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4485 options::OPT_fno_standalone_debug,
4486 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004487 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4488 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004489 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4490 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004491
Eric Christopher138c32b2013-09-13 22:37:55 +00004492 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4493 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4494 CmdArgs.push_back("-backend-option");
4495 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4496 }
Eric Christophereec89c22013-06-18 00:03:50 +00004497
Eric Christopher0d403d22014-02-14 01:27:03 +00004498 // -gdwarf-aranges turns on the emission of the aranges section in the
4499 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004500 // Always enabled on the PS4.
4501 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004502 CmdArgs.push_back("-backend-option");
4503 CmdArgs.push_back("-generate-arange-section");
4504 }
4505
David Blaikief36d9ba2014-01-27 18:52:43 +00004506 if (Args.hasFlag(options::OPT_fdebug_types_section,
4507 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004508 CmdArgs.push_back("-backend-option");
4509 CmdArgs.push_back("-generate-type-units");
4510 }
Eric Christophereec89c22013-06-18 00:03:50 +00004511
Dan Gohmana5b804b2016-01-07 00:50:27 +00004512 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4513 // default.
4514 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4515 Triple.getArch() == llvm::Triple::wasm32 ||
4516 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004517
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004518 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004519 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004520 CmdArgs.push_back("-ffunction-sections");
4521 }
4522
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004523 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4524 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004525 CmdArgs.push_back("-fdata-sections");
4526 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004527
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004528 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004529 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004530 CmdArgs.push_back("-fno-unique-section-names");
4531
Chris Lattner3c77a352010-06-22 00:03:40 +00004532 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4533
Diego Novilloa0545962015-07-10 18:00:07 +00004534 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004535
Paul Robinsond083b9a2015-12-16 17:25:27 +00004536 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4537 if (getToolChain().getTriple().isPS4CPU())
4538 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4539
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004540 // Pass options for controlling the default header search paths.
4541 if (Args.hasArg(options::OPT_nostdinc)) {
4542 CmdArgs.push_back("-nostdsysteminc");
4543 CmdArgs.push_back("-nobuiltininc");
4544 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004545 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004546 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004547 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4548 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4549 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004550
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004551 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004552 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004553 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004554
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004555 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4556
Ted Kremenekf7639e12012-03-06 20:06:33 +00004557 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004558 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004559 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004560 options::OPT_ccc_arcmt_modify,
4561 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004562 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004563 switch (A->getOption().getID()) {
4564 default:
4565 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004566 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004567 CmdArgs.push_back("-arcmt-check");
4568 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004569 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004570 CmdArgs.push_back("-arcmt-modify");
4571 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004572 case options::OPT_ccc_arcmt_migrate:
4573 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004574 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004575 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004576
4577 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4578 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004579 break;
John McCalld70fb982011-06-15 23:25:17 +00004580 }
4581 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004582 } else {
4583 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4584 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4585 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004586 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004587
Ted Kremenekf7639e12012-03-06 20:06:33 +00004588 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4589 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004590 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4591 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004592 }
4593 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004594 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004595
4596 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004597 options::OPT_objcmt_migrate_subscripting,
4598 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004599 // None specified, means enable them all.
4600 CmdArgs.push_back("-objcmt-migrate-literals");
4601 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004602 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004603 } else {
4604 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4605 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004606 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004607 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004608 } else {
4609 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4610 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4611 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4612 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4613 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4614 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004615 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004616 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4617 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4618 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4619 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4620 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4621 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4622 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004623 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004624 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004625 }
4626
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004627 // Add preprocessing options like -I, -D, etc. if we are using the
4628 // preprocessor.
4629 //
4630 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004631 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004632 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4633 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004634
Rafael Espindolaa7431922011-07-21 23:40:37 +00004635 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4636 // that "The compiler can only warn and ignore the option if not recognized".
4637 // When building with ccache, it will pass -D options to clang even on
4638 // preprocessed inputs and configure concludes that -fPIC is not supported.
4639 Args.ClaimAllArgs(options::OPT_D);
4640
Alp Toker7874bdc2013-11-15 20:40:58 +00004641 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004642 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4643 if (A->getOption().matches(options::OPT_O4)) {
4644 CmdArgs.push_back("-O3");
4645 D.Diag(diag::warn_O4_is_O3);
4646 } else {
4647 A->render(Args, CmdArgs);
4648 }
4649 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004650
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004651 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004652 for (const Arg *A :
4653 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4654 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004655 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004656 }
4657
Rafael Espindola577637a2015-01-03 00:06:04 +00004658 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004659
Richard Smith3be1cb22014-08-07 00:24:21 +00004660 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004661 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004662 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4663 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004664 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004665 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004666
4667 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004668 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004669 //
4670 // If a std is supplied, only add -trigraphs if it follows the
4671 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004672 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004673 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4674 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004675 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004676 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004677 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004678 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004679 else
4680 Std->render(Args, CmdArgs);
4681
Nico Weber00721502014-12-23 22:32:37 +00004682 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004683 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004684 options::OPT_ftrigraphs,
4685 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004686 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004687 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004688 } else {
4689 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004690 //
4691 // FIXME: Clang doesn't correctly handle -std= when the input language
4692 // doesn't match. For the time being just ignore this for C++ inputs;
4693 // eventually we want to do all the standard defaulting here instead of
4694 // splitting it between the driver and clang -cc1.
4695 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004696 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4697 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004698 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004699 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004700
Nico Weber00721502014-12-23 22:32:37 +00004701 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4702 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004703 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004704
Richard Smith282b4492013-09-04 22:50:31 +00004705 // GCC's behavior for -Wwrite-strings is a bit strange:
4706 // * In C, this "warning flag" changes the types of string literals from
4707 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4708 // for the discarded qualifier.
4709 // * In C++, this is just a normal warning flag.
4710 //
4711 // Implementing this warning correctly in C is hard, so we follow GCC's
4712 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4713 // a non-const char* in C, rather than using this crude hack.
4714 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004715 // FIXME: This should behave just like a warning flag, and thus should also
4716 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4717 Arg *WriteStrings =
4718 Args.getLastArg(options::OPT_Wwrite_strings,
4719 options::OPT_Wno_write_strings, options::OPT_w);
4720 if (WriteStrings &&
4721 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004722 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004723 }
4724
Chandler Carruth61fbf622011-04-23 09:27:53 +00004725 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004726 // during C++ compilation, which it is by default. GCC keeps this define even
4727 // in the presence of '-w', match this behavior bug-for-bug.
4728 if (types::isCXX(InputType) &&
4729 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4730 true)) {
4731 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004732 }
4733
Chandler Carruthe0391482010-05-22 02:21:53 +00004734 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4735 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4736 if (Asm->getOption().matches(options::OPT_fasm))
4737 CmdArgs.push_back("-fgnu-keywords");
4738 else
4739 CmdArgs.push_back("-fno-gnu-keywords");
4740 }
4741
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004742 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4743 CmdArgs.push_back("-fno-dwarf-directory-asm");
4744
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004745 if (ShouldDisableAutolink(Args, getToolChain()))
4746 CmdArgs.push_back("-fno-autolink");
4747
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004748 // Add in -fdebug-compilation-dir if necessary.
4749 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004750
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004751 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4752 StringRef Map = A->getValue();
4753 if (Map.find('=') == StringRef::npos)
4754 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4755 else
4756 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4757 A->claim();
4758 }
4759
Richard Smith9a568822011-11-21 19:36:32 +00004760 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4761 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004762 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004763 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004764 }
4765
Richard Smith79c927b2013-11-06 19:31:51 +00004766 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4767 CmdArgs.push_back("-foperator-arrow-depth");
4768 CmdArgs.push_back(A->getValue());
4769 }
4770
Richard Smith9a568822011-11-21 19:36:32 +00004771 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4772 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004773 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004774 }
4775
Richard Smitha3d3bd22013-05-08 02:12:03 +00004776 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4777 CmdArgs.push_back("-fconstexpr-steps");
4778 CmdArgs.push_back(A->getValue());
4779 }
4780
Richard Smithb3a14522013-02-22 01:59:51 +00004781 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4782 CmdArgs.push_back("-fbracket-depth");
4783 CmdArgs.push_back(A->getValue());
4784 }
4785
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004786 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4787 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004788 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004789 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004790 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4791 } else
4792 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004793 }
4794
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004795 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004796 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004797
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004798 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4799 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004800 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004801 }
David Chisnall5778fce2009-08-31 16:41:57 +00004802
Chris Lattnere23003d2010-01-09 21:54:33 +00004803 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4804 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004805 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004806 }
4807
Chris Lattnerb35583d2010-04-07 20:49:23 +00004808 CmdArgs.push_back("-ferror-limit");
4809 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004810 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004811 else
4812 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004813
Chandler Carrutha77a7272010-05-06 04:55:18 +00004814 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4815 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004816 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004817 }
4818
4819 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4820 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004821 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004822 }
4823
Richard Smithf6f003a2011-12-16 19:06:07 +00004824 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4825 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004826 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004827 }
4828
Nick Lewycky24653262014-12-16 21:39:02 +00004829 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4830 CmdArgs.push_back("-fspell-checking-limit");
4831 CmdArgs.push_back(A->getValue());
4832 }
4833
Daniel Dunbar2c978472009-11-04 06:24:47 +00004834 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004835 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004836 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004837 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004838 } else {
4839 // If -fmessage-length=N was not specified, determine whether this is a
4840 // terminal and, if so, implicitly define -fmessage-length appropriately.
4841 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004842 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004843 }
4844
John McCallb4a99d32013-02-19 01:57:35 +00004845 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4846 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4847 options::OPT_fvisibility_ms_compat)) {
4848 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4849 CmdArgs.push_back("-fvisibility");
4850 CmdArgs.push_back(A->getValue());
4851 } else {
4852 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4853 CmdArgs.push_back("-fvisibility");
4854 CmdArgs.push_back("hidden");
4855 CmdArgs.push_back("-ftype-visibility");
4856 CmdArgs.push_back("default");
4857 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004858 }
4859
Douglas Gregor08329632010-06-15 17:05:35 +00004860 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004861
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004862 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4863
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004864 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004865 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4866 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004867 CmdArgs.push_back("-ffreestanding");
4868
Daniel Dunbare357d562009-12-03 18:42:11 +00004869 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004870 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004871 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004872 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004873 // Emulated TLS is enabled by default on Android, and can be enabled manually
4874 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004875 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004876 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4877 EmulatedTLSDefault))
4878 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004879 // AltiVec-like language extensions aren't relevant for assembling.
4880 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004881 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004882 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4883 }
Richard Trieu91844232012-06-26 18:18:47 +00004884 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4885 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004886
Alexey Bataevdb390212015-05-20 04:24:19 +00004887 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004888 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004889 options::OPT_fno_openmp, false)) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004890 switch (getOpenMPRuntime(getToolChain(), Args)) {
4891 case OMPRT_OMP:
4892 case OMPRT_IOMP5:
4893 // Clang can generate useful OpenMP code for these two runtime libraries.
4894 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004895
4896 // If no option regarding the use of TLS in OpenMP codegeneration is
4897 // given, decide a default based on the target. Otherwise rely on the
4898 // options and pass the right information to the frontend.
4899 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004900 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004901 CmdArgs.push_back("-fnoopenmp-use-tls");
Alexey Bataev18c48522016-05-27 04:13:39 +00004902 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004903 break;
4904 default:
4905 // By default, if Clang doesn't know how to generate useful OpenMP code
4906 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4907 // down to the actual compilation.
4908 // FIXME: It would be better to have a mode which *only* omits IR
4909 // generation based on the OpenMP support so that we get consistent
4910 // semantic analysis, etc.
4911 break;
4912 }
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004913 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004914
Peter Collingbourne32701642013-11-01 18:16:25 +00004915 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004916 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004917
Eric Christopher459d2712013-02-19 06:16:53 +00004918 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004919 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4920 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4921 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4922 Arch == llvm::Triple::ppc64le))
4923 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4924 << "ppc/ppc64/ppc64le";
4925 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004926
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004927 // -fzvector is incompatible with -faltivec.
4928 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4929 if (Args.hasArg(options::OPT_faltivec))
4930 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4931 << "-faltivec";
4932
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004933 if (getToolChain().SupportsProfiling())
4934 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004935
4936 // -flax-vector-conversions is default.
4937 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4938 options::OPT_fno_lax_vector_conversions))
4939 CmdArgs.push_back("-fno-lax-vector-conversions");
4940
John Brawna7b4ec02015-08-10 11:11:28 +00004941 if (Args.getLastArg(options::OPT_fapple_kext) ||
4942 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004943 CmdArgs.push_back("-fapple-kext");
4944
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004945 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004946 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004947 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004948 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4949 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004950
4951 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4952 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004953 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004954 }
4955
Bob Wilson14adb362012-02-03 06:27:22 +00004956 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004957
Chandler Carruth6e501032011-03-27 00:04:55 +00004958 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4959 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004960 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004961 if (A->getOption().matches(options::OPT_fwrapv))
4962 CmdArgs.push_back("-fwrapv");
4963 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4964 options::OPT_fno_strict_overflow)) {
4965 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4966 CmdArgs.push_back("-fwrapv");
4967 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004968
4969 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4970 options::OPT_fno_reroll_loops))
4971 if (A->getOption().matches(options::OPT_freroll_loops))
4972 CmdArgs.push_back("-freroll-loops");
4973
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004974 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004975 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4976 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004977
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004978 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4979
Daniel Dunbar4930e332009-11-17 08:07:36 +00004980 // -stack-protector=0 is default.
4981 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004982 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4983 options::OPT_fstack_protector_all,
4984 options::OPT_fstack_protector_strong,
4985 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004986 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004987 StackProtectorLevel = std::max<unsigned>(
4988 LangOptions::SSPOn,
4989 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004990 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004991 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004992 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004993 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004994 } else {
4995 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004996 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004997 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004998 if (StackProtectorLevel) {
4999 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005000 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005001 }
Chad Rosierdb3da832012-08-21 16:16:06 +00005002
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005003 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00005004 for (const Arg *A : Args.filtered(options::OPT__param)) {
5005 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00005006 if (Str.startswith("ssp-buffer-size=")) {
5007 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00005008 CmdArgs.push_back("-stack-protector-buffer-size");
5009 // FIXME: Verify the argument is a valid integer.
5010 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00005011 }
Sean Silva14facf32015-06-09 01:57:17 +00005012 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00005013 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00005014 }
5015
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005016 // Translate -mstackrealign
5017 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00005018 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005019 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00005020
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00005021 if (Args.hasArg(options::OPT_mstack_alignment)) {
5022 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
5023 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00005024 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00005025
Hans Wennborg77dc2362015-01-20 19:45:50 +00005026 if (Args.hasArg(options::OPT_mstack_probe_size)) {
5027 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
5028
5029 if (!Size.empty())
5030 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
5031 else
5032 CmdArgs.push_back("-mstack-probe-size=0");
5033 }
5034
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005035 switch (getToolChain().getArch()) {
5036 case llvm::Triple::aarch64:
5037 case llvm::Triple::aarch64_be:
5038 case llvm::Triple::arm:
5039 case llvm::Triple::armeb:
5040 case llvm::Triple::thumb:
5041 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005042 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005043 break;
5044
5045 default:
5046 break;
5047 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005048
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005049 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
5050 options::OPT_mno_restrict_it)) {
5051 if (A->getOption().matches(options::OPT_mrestrict_it)) {
5052 CmdArgs.push_back("-backend-option");
5053 CmdArgs.push_back("-arm-restrict-it");
5054 } else {
5055 CmdArgs.push_back("-backend-option");
5056 CmdArgs.push_back("-arm-no-restrict-it");
5057 }
James Y Knight2db38f32015-08-15 03:45:25 +00005058 } else if (Triple.isOSWindows() &&
5059 (Triple.getArch() == llvm::Triple::arm ||
5060 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00005061 // Windows on ARM expects restricted IT blocks
5062 CmdArgs.push_back("-backend-option");
5063 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005064 }
5065
Daniel Dunbard18049a2009-04-07 21:16:11 +00005066 // Forward -f options with positive and negative forms; we translate
5067 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00005068 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5069 StringRef fname = A->getValue();
5070 if (!llvm::sys::fs::exists(fname))
5071 D.Diag(diag::err_drv_no_such_file) << fname;
5072 else
5073 A->render(Args, CmdArgs);
5074 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005075
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005076 // -fbuiltin is default unless -mkernel is used.
5077 bool UseBuiltins =
5078 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5079 !Args.hasArg(options::OPT_mkernel));
5080 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005081 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005082
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005083 // -ffreestanding implies -fno-builtin.
5084 if (Args.hasArg(options::OPT_ffreestanding))
5085 UseBuiltins = false;
5086
5087 // Process the -fno-builtin-* options.
5088 for (const auto &Arg : Args) {
5089 const Option &O = Arg->getOption();
5090 if (!O.matches(options::OPT_fno_builtin_))
5091 continue;
5092
5093 Arg->claim();
5094 // If -fno-builtin is specified, then there's no need to pass the option to
5095 // the frontend.
5096 if (!UseBuiltins)
5097 continue;
5098
5099 StringRef FuncName = Arg->getValue();
5100 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5101 }
5102
Nuno Lopes13c88c72009-12-16 16:59:22 +00005103 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5104 options::OPT_fno_assume_sane_operator_new))
5105 CmdArgs.push_back("-fno-assume-sane-operator-new");
5106
Daniel Dunbar4930e332009-11-17 08:07:36 +00005107 // -fblocks=0 is default.
5108 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005109 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005110 (Args.hasArg(options::OPT_fgnu_runtime) &&
5111 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5112 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005113 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005115 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005116 !getToolChain().hasBlocksRuntime())
5117 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005118 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005119
Richard Smith47972af2015-06-16 00:08:24 +00005120 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005121 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005122 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005123 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005124 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005125 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5126 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005127 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005128 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005129 HaveModules = true;
5130 }
5131 }
5132
Richard Smith47972af2015-06-16 00:08:24 +00005133 // -fmodule-maps enables implicit reading of module map files. By default,
5134 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005135 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5136 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005137 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005138 }
5139
Daniel Jasperac42b752013-10-21 06:34:34 +00005140 // -fmodules-decluse checks that modules used are declared so (off by
5141 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005142 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005143 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005144 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005145 }
5146
Daniel Jasper962b38e2014-04-11 11:47:45 +00005147 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5148 // all #included headers are part of modules.
5149 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005150 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005151 CmdArgs.push_back("-fmodules-strict-decluse");
5152 }
5153
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005154 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5155 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5156 options::OPT_fno_implicit_modules)) {
5157 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005158 } else if (HaveModules) {
5159 // -fmodule-cache-path specifies where our implicitly-built module files
5160 // should be written.
5161 SmallString<128> Path;
5162 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5163 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005164 if (C.isForDiagnostics()) {
5165 // When generating crash reports, we want to emit the modules along with
5166 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005167 Path = Output.getFilename();
5168 llvm::sys::path::replace_extension(Path, ".cache");
5169 llvm::sys::path::append(Path, "modules");
5170 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005171 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005172 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005173 llvm::sys::path::append(Path, "org.llvm.clang.");
5174 appendUserToPath(Path);
5175 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005176 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005177 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005178 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5179 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005180 }
5181
Richard Smith8d83d6d2016-03-21 19:06:06 +00005182 // -fmodule-name specifies the module that is currently being built (or
5183 // used for header checking by -fmodule-maps).
5184 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5185
5186 // -fmodule-map-file can be used to specify files containing module
5187 // definitions.
5188 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5189
5190 // -fmodule-file can be used to specify files containing precompiled modules.
5191 if (HaveModules)
5192 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5193 else
5194 Args.ClaimAllArgs(options::OPT_fmodule_file);
5195
Justin Bognera88f0122014-06-20 22:59:50 +00005196 // When building modules and generating crashdumps, we need to dump a module
5197 // dependency VFS alongside the output.
5198 if (HaveModules && C.isForDiagnostics()) {
5199 SmallString<128> VFSDir(Output.getFilename());
5200 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005201 // Add the cache directory as a temp so the crash diagnostics pick it up.
5202 C.addTempFile(Args.MakeArgString(VFSDir));
5203
Justin Bognera88f0122014-06-20 22:59:50 +00005204 llvm::sys::path::append(VFSDir, "vfs");
5205 CmdArgs.push_back("-module-dependency-dir");
5206 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005207 }
5208
Richard Smith9887d792014-10-17 01:42:53 +00005209 if (HaveModules)
5210 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005211
Douglas Gregor35b04d62013-02-07 19:01:24 +00005212 // Pass through all -fmodules-ignore-macro arguments.
5213 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005214 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5215 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005216
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005217 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5218
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005219 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5220 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5221 D.Diag(diag::err_drv_argument_not_allowed_with)
5222 << A->getAsString(Args) << "-fbuild-session-timestamp";
5223
5224 llvm::sys::fs::file_status Status;
5225 if (llvm::sys::fs::status(A->getValue(), Status))
5226 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005227 CmdArgs.push_back(Args.MakeArgString(
5228 "-fbuild-session-timestamp=" +
5229 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005230 }
5231
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005232 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005233 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5234 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005235 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5236
5237 Args.AddLastArg(CmdArgs,
5238 options::OPT_fmodules_validate_once_per_build_session);
5239 }
5240
Ben Langmuirdcf73862014-03-12 00:06:17 +00005241 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5242
John McCalldfea9982010-04-09 19:12:06 +00005243 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005244 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005245 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005246 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005247
Anders Carlssond470fef2010-11-21 00:09:52 +00005248 // -felide-constructors is the default.
5249 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005250 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005251 CmdArgs.push_back("-fno-elide-constructors");
5252
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005253 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005254
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005255 if (KernelOrKext || (types::isCXX(InputType) &&
5256 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5257 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005258 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005259
Tony Linthicum76329bf2011-12-12 21:14:55 +00005260 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005261 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5262 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005263 CmdArgs.push_back("-fshort-enums");
5264
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005265 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005266 if (Arg *A = Args.getLastArg(
5267 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5268 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5269 if (A->getOption().matches(options::OPT_funsigned_char) ||
5270 A->getOption().matches(options::OPT_fno_signed_char)) {
5271 CmdArgs.push_back("-fno-signed-char");
5272 }
5273 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005274 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005275 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005276
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005277 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005278 if (!Args.hasFlag(
5279 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5280 !IsWindowsCygnus && !IsWindowsGNU &&
5281 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5282 getToolChain().getArch() != llvm::Triple::hexagon &&
5283 getToolChain().getArch() != llvm::Triple::xcore &&
5284 ((getToolChain().getTriple().getVendor() !=
5285 llvm::Triple::MipsTechnologies) ||
5286 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005287 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005288 CmdArgs.push_back("-fno-use-cxa-atexit");
5289
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005290 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005291 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005292 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005293 CmdArgs.push_back("-fms-extensions");
5294
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005295 // -fno-use-line-directives is default.
5296 if (Args.hasFlag(options::OPT_fuse_line_directives,
5297 options::OPT_fno_use_line_directives, false))
5298 CmdArgs.push_back("-fuse-line-directives");
5299
Francois Pichet1b4f1632011-09-17 04:32:15 +00005300 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005301 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005302 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005303 (IsWindowsMSVC &&
5304 Args.hasFlag(options::OPT_fms_extensions,
5305 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005306 CmdArgs.push_back("-fms-compatibility");
5307
David Majnemerc371ff02015-03-22 08:39:22 +00005308 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005309 VersionTuple MSVT = visualstudio::getMSVCVersion(
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00005310 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +00005311 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005312 CmdArgs.push_back(
5313 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005314
David Majnemer8db91762015-05-18 04:49:30 +00005315 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5316 if (ImplyVCPPCXXVer) {
5317 if (IsMSVC2015Compatible)
5318 CmdArgs.push_back("-std=c++14");
5319 else
5320 CmdArgs.push_back("-std=c++11");
5321 }
5322
Eric Christopher5ecce122013-02-18 00:38:31 +00005323 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005324 if (Args.hasFlag(options::OPT_fborland_extensions,
5325 options::OPT_fno_borland_extensions, false))
5326 CmdArgs.push_back("-fborland-extensions");
5327
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005328 // -fno-declspec is default, except for PS4.
5329 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5330 getToolChain().getTriple().isPS4()))
5331 CmdArgs.push_back("-fdeclspec");
5332 else if (Args.hasArg(options::OPT_fno_declspec))
5333 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5334
David Majnemerc371ff02015-03-22 08:39:22 +00005335 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5336 // than 19.
5337 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5338 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005339 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005340 CmdArgs.push_back("-fno-threadsafe-statics");
5341
Francois Pichet02744872011-09-01 16:38:08 +00005342 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5343 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005344 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005345 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005346 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005347
Chandler Carruthe03aa552010-04-17 20:17:31 +00005348 // -fgnu-keywords default varies depending on language; only pass if
5349 // specified.
5350 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005351 options::OPT_fno_gnu_keywords))
5352 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005354 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005355 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005356 CmdArgs.push_back("-fgnu89-inline");
5357
Chad Rosier9c76d242012-03-15 22:31:42 +00005358 if (Args.hasArg(options::OPT_fno_inline))
5359 CmdArgs.push_back("-fno-inline");
5360
Hans Wennborg7a008882016-05-24 20:40:51 +00005361 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
5362 options::OPT_fno_inline_functions))
5363 InlineArg->render(Args, CmdArgs);
Chad Rosier80603182012-03-06 18:49:20 +00005364
John McCall5fb5df92012-06-20 06:18:46 +00005365 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005366
John McCall5fb5df92012-06-20 06:18:46 +00005367 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005368 // legacy is the default. Except for deployment taget of 10.5,
5369 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5370 // gets ignored silently.
5371 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005372 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5373 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005374 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005375 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005376 if (getToolChain().UseObjCMixedDispatch())
5377 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5378 else
5379 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5380 }
5381 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005382
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005383 // When ObjectiveC legacy runtime is in effect on MacOSX,
5384 // turn on the option to do Array/Dictionary subscripting
5385 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005386 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005387 getToolChain().getTriple().isMacOSX() &&
5388 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5389 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005390 objcRuntime.isNeXTFamily())
5391 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005392
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005393 // -fencode-extended-block-signature=1 is default.
5394 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5395 CmdArgs.push_back("-fencode-extended-block-signature");
5396 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005397
John McCall24fc0de2011-07-06 00:26:06 +00005398 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5399 // NOTE: This logic is duplicated in ToolChains.cpp.
5400 bool ARC = isObjCAutoRefCount(Args);
5401 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005402 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005403
John McCall24fc0de2011-07-06 00:26:06 +00005404 CmdArgs.push_back("-fobjc-arc");
5405
Chandler Carruth491db322011-11-04 07:34:47 +00005406 // FIXME: It seems like this entire block, and several around it should be
5407 // wrapped in isObjC, but for now we just use it here as this is where it
5408 // was being used previously.
5409 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5410 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5411 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5412 else
5413 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5414 }
5415
John McCall24fc0de2011-07-06 00:26:06 +00005416 // Allow the user to enable full exceptions code emission.
5417 // We define off for Objective-CC, on for Objective-C++.
5418 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5419 options::OPT_fno_objc_arc_exceptions,
5420 /*default*/ types::isCXX(InputType)))
5421 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005422
John McCall24fc0de2011-07-06 00:26:06 +00005423 }
5424
5425 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5426 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005427 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005428 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005429
John McCall24fc0de2011-07-06 00:26:06 +00005430 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5431 // takes precedence.
5432 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5433 if (!GCArg)
5434 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5435 if (GCArg) {
5436 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005437 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005438 } else if (getToolChain().SupportsObjCGC()) {
5439 GCArg->render(Args, CmdArgs);
5440 } else {
5441 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005442 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005443 }
5444 }
5445
John McCallfbe5ed72015-11-05 19:19:56 +00005446 // Pass down -fobjc-weak or -fno-objc-weak if present.
5447 if (types::isObjC(InputType)) {
5448 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5449 options::OPT_fno_objc_weak);
5450 if (!WeakArg) {
5451 // nothing to do
5452 } else if (GCArg) {
5453 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5454 D.Diag(diag::err_objc_weak_with_gc);
5455 } else if (!objcRuntime.allowsWeak()) {
5456 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5457 D.Diag(diag::err_objc_weak_unsupported);
5458 } else {
5459 WeakArg->render(Args, CmdArgs);
5460 }
5461 }
5462
Bob Wilsonb111ec92015-03-02 19:01:14 +00005463 if (Args.hasFlag(options::OPT_fapplication_extension,
5464 options::OPT_fno_application_extension, false))
5465 CmdArgs.push_back("-fapplication-extension");
5466
Reid Klecknerc542d372014-06-27 17:02:02 +00005467 // Handle GCC-style exception args.
5468 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5470 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005471
Tim Northovere931f9f2015-10-30 16:30:41 +00005472 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005473 CmdArgs.push_back("-fsjlj-exceptions");
5474
5475 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005476 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5477 options::OPT_fno_assume_sane_operator_new))
5478 CmdArgs.push_back("-fno-assume-sane-operator-new");
5479
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005480 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5481 // most platforms.
5482 if (Args.hasFlag(options::OPT_fsized_deallocation,
5483 options::OPT_fno_sized_deallocation, false))
5484 CmdArgs.push_back("-fsized-deallocation");
5485
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005486 // -fconstant-cfstrings is default, and may be subject to argument translation
5487 // on Darwin.
5488 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5489 options::OPT_fno_constant_cfstrings) ||
5490 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5491 options::OPT_mno_constant_cfstrings))
5492 CmdArgs.push_back("-fno-constant-cfstrings");
5493
John Thompsoned4e2952009-11-05 20:14:16 +00005494 // -fshort-wchar default varies depending on platform; only
5495 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005496 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5497 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005498 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005499
Hans Wennborg28c96312013-07-31 23:39:13 +00005500 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005501 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005502 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005503 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005504
Daniel Dunbar096ed292011-10-05 21:04:55 +00005505 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5506 // -fno-pack-struct doesn't apply to -fpack-struct=.
5507 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005508 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005509 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005510 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005511 } else if (Args.hasFlag(options::OPT_fpack_struct,
5512 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005513 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005514 }
5515
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005516 // Handle -fmax-type-align=N and -fno-type-align
5517 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5518 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5519 if (!SkipMaxTypeAlign) {
5520 std::string MaxTypeAlignStr = "-fmax-type-align=";
5521 MaxTypeAlignStr += A->getValue();
5522 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5523 }
5524 } else if (getToolChain().getTriple().isOSDarwin()) {
5525 if (!SkipMaxTypeAlign) {
5526 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5527 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5528 }
5529 }
5530
John Brawna7b4ec02015-08-10 11:11:28 +00005531 // -fcommon is the default unless compiling kernel code or the target says so
5532 bool NoCommonDefault =
5533 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5534 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5535 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005536 CmdArgs.push_back("-fno-common");
5537
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005538 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005539 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005540 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005541 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005542 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005543 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005544
Daniel Dunbar6358d682010-10-15 22:30:42 +00005545 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005546 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005547 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005548 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005549
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005550 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005551 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5552 StringRef value = inputCharset->getValue();
5553 if (value != "UTF-8")
5554 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5555 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005556 }
5557
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005558 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005559 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5560 StringRef value = execCharset->getValue();
5561 if (value != "UTF-8")
5562 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5563 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005564 }
5565
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005566 // -fcaret-diagnostics is default.
5567 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5568 options::OPT_fno_caret_diagnostics, true))
5569 CmdArgs.push_back("-fno-caret-diagnostics");
5570
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005571 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005572 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005573 options::OPT_fno_diagnostics_fixit_info))
5574 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005575
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005576 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005577 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005578 options::OPT_fno_diagnostics_show_option))
5579 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005580
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005581 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005582 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005583 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005584 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005585 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005587 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005588 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005589 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005590 }
5591
Chandler Carruthb6766f02011-03-27 01:50:55 +00005592 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 options::OPT_fdiagnostics_show_note_include_stack,
5594 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005595 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005596 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005597 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5598 else
5599 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5600 }
5601
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005602 // Color diagnostics are parsed by the driver directly from argv
5603 // and later re-parsed to construct this job; claim any possible
5604 // color diagnostic here to avoid warn_drv_unused_argument and
5605 // diagnose bad OPT_fdiagnostics_color_EQ values.
5606 for (Arg *A : Args) {
5607 const Option &O = A->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005608 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5609 !O.matches(options::OPT_fdiagnostics_color) &&
5610 !O.matches(options::OPT_fno_color_diagnostics) &&
5611 !O.matches(options::OPT_fno_diagnostics_color) &&
5612 !O.matches(options::OPT_fdiagnostics_color_EQ))
5613 continue;
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005614 if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
5615 StringRef Value(A->getValue());
5616 if (Value != "always" && Value != "never" && Value != "auto")
Nico Weber7e2da792013-04-17 21:52:44 +00005617 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005618 << ("-fdiagnostics-color=" + Value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005619 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005620 A->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005621 }
Bruno Cardoso Lopes681d7172016-05-27 20:43:00 +00005622 if (D.getDiags().getDiagnosticOptions().ShowColors)
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005623 CmdArgs.push_back("-fcolor-diagnostics");
5624
Nico Rieck7857d462013-09-11 00:38:02 +00005625 if (Args.hasArg(options::OPT_fansi_escape_codes))
5626 CmdArgs.push_back("-fansi-escape-codes");
5627
Daniel Dunbardb097022009-06-08 21:13:54 +00005628 if (!Args.hasFlag(options::OPT_fshow_source_location,
5629 options::OPT_fno_show_source_location))
5630 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005632 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005633 true))
5634 CmdArgs.push_back("-fno-show-column");
5635
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005636 if (!Args.hasFlag(options::OPT_fspell_checking,
5637 options::OPT_fno_spell_checking))
5638 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005639
Chad Rosierc8e56e82012-12-05 21:08:21 +00005640 // -fno-asm-blocks is default.
5641 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5642 false))
5643 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005644
Steven Wucb0d13f2015-01-16 23:05:28 +00005645 // -fgnu-inline-asm is default.
5646 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5647 options::OPT_fno_gnu_inline_asm, true))
5648 CmdArgs.push_back("-fno-gnu-inline-asm");
5649
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005650 // Enable vectorization per default according to the optimization level
5651 // selected. For optimization levels that want vectorization we use the alias
5652 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005653 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005654 OptSpecifier VectorizeAliasOption =
5655 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005656 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005657 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005658 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005659
Chad Rosier136d67d2014-04-28 19:30:57 +00005660 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005661 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005662 OptSpecifier SLPVectAliasOption =
5663 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005664 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005665 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005666 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005667
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005668 // -fno-slp-vectorize-aggressive is default.
5669 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005670 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005671 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005672
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005673 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5674 A->render(Args, CmdArgs);
5675
Filipe Cabecinhasab731f72016-05-12 16:51:36 +00005676 if (Arg *A = Args.getLastArg(
5677 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5678 A->render(Args, CmdArgs);
5679
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005680 // -fdollars-in-identifiers default varies depending on platform and
5681 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005682 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005683 options::OPT_fno_dollars_in_identifiers)) {
5684 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005685 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005686 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005687 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005688 }
5689
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005690 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5691 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005692 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005693 options::OPT_fno_unit_at_a_time)) {
5694 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005695 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005696 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005697
Eli Friedman055c9702011-11-02 01:53:16 +00005698 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5699 options::OPT_fno_apple_pragma_pack, false))
5700 CmdArgs.push_back("-fapple-pragma-pack");
5701
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005702 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005703 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5704 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005705 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005706 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005707 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005708
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005709// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5710//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005711// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005712#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005713 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005714 (getToolChain().getArch() == llvm::Triple::arm ||
5715 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005716 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5717 CmdArgs.push_back("-fno-builtin-strcat");
5718 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5719 CmdArgs.push_back("-fno-builtin-strcpy");
5720 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005721#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005722
Justin Bognera88f0122014-06-20 22:59:50 +00005723 // Enable rewrite includes if the user's asked for it or if we're generating
5724 // diagnostics.
5725 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5726 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005727 if (Args.hasFlag(options::OPT_frewrite_includes,
5728 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005729 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005730 CmdArgs.push_back("-frewrite-includes");
5731
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005732 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005733 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005734 options::OPT_traditional_cpp)) {
5735 if (isa<PreprocessJobAction>(JA))
5736 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005737 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005738 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005739 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005740
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005741 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005742 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005743
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005744 // Handle serialized diagnostics.
5745 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5746 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005747 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005748 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005749
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005750 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5751 CmdArgs.push_back("-fretain-comments-from-system-headers");
5752
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005753 // Forward -fcomment-block-commands to -cc1.
5754 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005755 // Forward -fparse-all-comments to -cc1.
5756 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005757
John Brawnad31ace2015-09-23 13:55:40 +00005758 // Turn -fplugin=name.so into -load name.so
5759 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5760 CmdArgs.push_back("-load");
5761 CmdArgs.push_back(A->getValue());
5762 A->claim();
5763 }
5764
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005765 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5766 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005767 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005768 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5769 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005770
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005771 // We translate this by hand to the -cc1 argument, since nightly test uses
5772 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005773 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005774 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005775 } else
Sean Silva14facf32015-06-09 01:57:17 +00005776 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005777 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005778
Bob Wilson23a55f12014-12-21 07:00:00 +00005779 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005780 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5781 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00005782 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5783 // has slightly different breakdown between stages.
5784 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5785 // pristine IR generated by the frontend. Ideally, a new compile action should
5786 // be added so both IR can be captured.
5787 if (C.getDriver().isSaveTempsEnabled() &&
5788 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00005789 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005790
Daniel Dunbard67a3222009-03-30 06:36:42 +00005791 if (Output.getType() == types::TY_Dependencies) {
5792 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005793 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005794 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005795 CmdArgs.push_back(Output.getFilename());
5796 } else {
5797 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005798 }
5799
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005800 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005801
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005802 if (Input.isFilename())
5803 CmdArgs.push_back(Input.getFilename());
5804 else
5805 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005806
Chris Lattnere9d7d782009-11-03 19:50:27 +00005807 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5808
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005809 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005810
5811 // Optionally embed the -cc1 level arguments into the debug info, for build
5812 // analysis.
5813 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005814 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005815 for (const auto &Arg : Args)
5816 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005817
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005818 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005819 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005820 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005821 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005822 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005823 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005824 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005825 }
5826 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005827 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005828 }
5829
Eric Christopherd3804002013-02-22 20:12:52 +00005830 // Add the split debug info name to the command lines here so we
5831 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005832 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005833 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5834 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005835 const char *SplitDwarfOut;
5836 if (SplitDwarf) {
5837 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005838 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005839 CmdArgs.push_back(SplitDwarfOut);
5840 }
5841
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005842 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5843 // Include them with -fcuda-include-gpubinary.
5844 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005845 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005846 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005847 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005848 }
5849
Peter Collingbourne3afb2662016-04-28 17:09:37 +00005850 bool WholeProgramVTables =
5851 Args.hasFlag(options::OPT_fwhole_program_vtables,
5852 options::OPT_fno_whole_program_vtables, false);
5853 if (WholeProgramVTables) {
5854 if (!D.isUsingLTO())
5855 D.Diag(diag::err_drv_argument_only_allowed_with)
5856 << "-fwhole-program-vtables"
5857 << "-flto";
5858 CmdArgs.push_back("-fwhole-program-vtables");
5859 }
5860
Eric Christopherd3804002013-02-22 20:12:52 +00005861 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005862 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005863 Output.getType() == types::TY_Object &&
5864 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005865 auto CLCommand =
5866 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005867 C.addCommand(llvm::make_unique<FallbackCommand>(
5868 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005869 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5870 isa<PrecompileJobAction>(JA)) {
5871 // In /fallback builds, run the main compilation even if the pch generation
5872 // fails, so that the main compilation's fallback to cl.exe runs.
5873 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5874 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005875 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005876 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005877 }
5878
Eric Christopherf1545832013-02-22 23:50:16 +00005879 // Handle the debug info splitting at object creation time if we're
5880 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005881 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005882 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005883 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005884
Roman Divacky178e01602011-02-10 16:52:03 +00005885 if (Arg *A = Args.getLastArg(options::OPT_pg))
5886 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005887 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5888 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005889
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005890 // Claim some arguments which clang supports automatically.
5891
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005892 // -fpch-preprocess is used with gcc to add a special marker in the output to
5893 // include the PCH file. Clang's PTH solution is completely transparent, so we
5894 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005895 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005896
Daniel Dunbar17731772009-03-23 19:03:36 +00005897 // Claim some arguments which clang doesn't support, but we don't
5898 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005899 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5900 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005901
Rafael Espindolab0092d72013-09-04 19:37:35 +00005902 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005903 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005904}
5905
John McCall5fb5df92012-06-20 06:18:46 +00005906/// Add options related to the Objective-C runtime/ABI.
5907///
5908/// Returns true if the runtime is non-fragile.
5909ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5910 ArgStringList &cmdArgs,
5911 RewriteKind rewriteKind) const {
5912 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005913 Arg *runtimeArg =
5914 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5915 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005916
5917 // Just forward -fobjc-runtime= to the frontend. This supercedes
5918 // options about fragility.
5919 if (runtimeArg &&
5920 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5921 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005922 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005923 if (runtime.tryParse(value)) {
5924 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005925 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005926 }
5927
5928 runtimeArg->render(args, cmdArgs);
5929 return runtime;
5930 }
5931
5932 // Otherwise, we'll need the ABI "version". Version numbers are
5933 // slightly confusing for historical reasons:
5934 // 1 - Traditional "fragile" ABI
5935 // 2 - Non-fragile ABI, version 1
5936 // 3 - Non-fragile ABI, version 2
5937 unsigned objcABIVersion = 1;
5938 // If -fobjc-abi-version= is present, use that to set the version.
5939 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005940 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005941 if (value == "1")
5942 objcABIVersion = 1;
5943 else if (value == "2")
5944 objcABIVersion = 2;
5945 else if (value == "3")
5946 objcABIVersion = 3;
5947 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005948 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005949 } else {
5950 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005951 bool nonFragileABIIsDefault =
5952 (rewriteKind == RK_NonFragile ||
5953 (rewriteKind == RK_None &&
5954 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005955 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5956 options::OPT_fno_objc_nonfragile_abi,
5957 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005958// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005959#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5960 unsigned nonFragileABIVersion = 1;
5961#else
5962 unsigned nonFragileABIVersion = 2;
5963#endif
5964
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005965 if (Arg *abiArg =
5966 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005967 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005968 if (value == "1")
5969 nonFragileABIVersion = 1;
5970 else if (value == "2")
5971 nonFragileABIVersion = 2;
5972 else
5973 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005975 }
5976
5977 objcABIVersion = 1 + nonFragileABIVersion;
5978 } else {
5979 objcABIVersion = 1;
5980 }
5981 }
5982
5983 // We don't actually care about the ABI version other than whether
5984 // it's non-fragile.
5985 bool isNonFragile = objcABIVersion != 1;
5986
5987 // If we have no runtime argument, ask the toolchain for its default runtime.
5988 // However, the rewriter only really supports the Mac runtime, so assume that.
5989 ObjCRuntime runtime;
5990 if (!runtimeArg) {
5991 switch (rewriteKind) {
5992 case RK_None:
5993 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5994 break;
5995 case RK_Fragile:
5996 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5997 break;
5998 case RK_NonFragile:
5999 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6000 break;
6001 }
6002
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006003 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006004 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
6005 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006006 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00006007 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6008
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006009 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00006010 } else {
6011 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6012 }
6013
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006014 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006015 } else {
6016 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00006017 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00006018 // non-fragile mode or the GCC runtime in fragile mode.
6019 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006020 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00006021 else
6022 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00006023 }
6024
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006025 cmdArgs.push_back(
6026 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00006027 return runtime;
6028}
6029
Reid Klecknerc542d372014-06-27 17:02:02 +00006030static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6031 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6032 I += HaveDash;
6033 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00006034}
Reid Klecknerc542d372014-06-27 17:02:02 +00006035
Benjamin Kramere003ca22015-10-28 13:54:16 +00006036namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00006037struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00006038 bool Synch = false;
6039 bool Asynch = false;
6040 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00006041};
Benjamin Kramere003ca22015-10-28 13:54:16 +00006042} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00006043
6044/// /EH controls whether to run destructor cleanups when exceptions are
6045/// thrown. There are three modifiers:
6046/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6047/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6048/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00006049/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00006050/// The default is /EHs-c-, meaning cleanups are disabled.
6051static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6052 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006053
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006054 std::vector<std::string> EHArgs =
6055 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00006056 for (auto EHVal : EHArgs) {
6057 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6058 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006059 case 'a':
6060 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006061 if (EH.Asynch)
6062 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006063 continue;
6064 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00006065 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006066 continue;
6067 case 's':
6068 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006069 if (EH.Synch)
6070 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006071 continue;
6072 default:
6073 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006074 }
6075 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6076 break;
6077 }
6078 }
David Majnemerb8809092016-02-20 09:23:44 +00006079 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006080 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006081 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006082 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6083 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006084 EH.Synch = true;
6085 EH.NoUnwindC = true;
6086 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006087
Reid Klecknerc542d372014-06-27 17:02:02 +00006088 return EH;
6089}
6090
David Majnemercd5855e2016-02-29 01:40:36 +00006091void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6092 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006093 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006094 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006095 unsigned RTOptionID = options::OPT__SLASH_MT;
6096
Hans Wennborgf1a74252013-09-10 20:18:04 +00006097 if (Args.hasArg(options::OPT__SLASH_LDd))
6098 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6099 // but defining _DEBUG is sticky.
6100 RTOptionID = options::OPT__SLASH_MTd;
6101
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006102 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006103 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006104
David Majnemere2afb472015-07-24 06:49:13 +00006105 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 switch (RTOptionID) {
6107 case options::OPT__SLASH_MD:
6108 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006109 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006110 CmdArgs.push_back("-D_MT");
6111 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006112 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006113 break;
6114 case options::OPT__SLASH_MDd:
6115 CmdArgs.push_back("-D_DEBUG");
6116 CmdArgs.push_back("-D_MT");
6117 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006118 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006119 break;
6120 case options::OPT__SLASH_MT:
6121 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006122 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006123 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006124 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006125 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006126 break;
6127 case options::OPT__SLASH_MTd:
6128 CmdArgs.push_back("-D_DEBUG");
6129 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006130 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006131 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006132 break;
6133 default:
6134 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006135 }
6136
David Majnemere2afb472015-07-24 06:49:13 +00006137 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6138 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6139 } else {
6140 CmdArgs.push_back(FlagForCRT.data());
6141
6142 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6143 // users want. The /Za flag to cl.exe turns this off, but it's not
6144 // implemented in clang.
6145 CmdArgs.push_back("--dependent-lib=oldnames");
6146 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006147
Hans Wennborg8858a032014-07-21 23:42:07 +00006148 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6149 // would produce interleaved output, so ignore /showIncludes in such cases.
6150 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6151 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6152 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006153
David Majnemerf6072342014-07-01 22:24:56 +00006154 // This controls whether or not we emit RTTI data for polymorphic types.
6155 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6156 /*default=*/false))
6157 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006158
Reid Kleckner124955a2015-08-05 18:51:13 +00006159 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006160 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006161 if (*EmitCodeView)
6162 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006163 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006164 CmdArgs.push_back("-gcodeview");
6165
Reid Klecknerc542d372014-06-27 17:02:02 +00006166 const Driver &D = getToolChain().getDriver();
6167 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006168 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006169 if (types::isCXX(InputType))
6170 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006171 CmdArgs.push_back("-fexceptions");
6172 }
David Majnemercd5855e2016-02-29 01:40:36 +00006173 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6174 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006175
Hans Wennborge50cec32014-06-13 20:59:54 +00006176 // /EP should expand to -E -P.
6177 if (Args.hasArg(options::OPT__SLASH_EP)) {
6178 CmdArgs.push_back("-E");
6179 CmdArgs.push_back("-P");
6180 }
6181
David Majnemera5b195a2015-02-14 01:35:12 +00006182 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006183 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6184 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006185 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6186 else
6187 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6188
6189 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6190 VolatileOptionID = A->getOption().getID();
6191
6192 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6193 CmdArgs.push_back("-fms-volatile");
6194
David Majnemer86c318f2014-02-11 21:05:00 +00006195 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6196 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6197 if (MostGeneralArg && BestCaseArg)
6198 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6199 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6200
6201 if (MostGeneralArg) {
6202 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6203 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6204 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6205
6206 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6207 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6208 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6209 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6210 << FirstConflict->getAsString(Args)
6211 << SecondConflict->getAsString(Args);
6212
6213 if (SingleArg)
6214 CmdArgs.push_back("-fms-memptr-rep=single");
6215 else if (MultipleArg)
6216 CmdArgs.push_back("-fms-memptr-rep=multiple");
6217 else
6218 CmdArgs.push_back("-fms-memptr-rep=virtual");
6219 }
6220
Alexey Bataeva7547182016-05-18 09:06:38 +00006221 if (Args.getLastArg(options::OPT__SLASH_Gd))
6222 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6223 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6224 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6225 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6226 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6227 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6228 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6229
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006230 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6231 A->render(Args, CmdArgs);
6232
Hans Wennborg81f74482013-09-10 01:07:07 +00006233 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6234 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006235 if (Args.hasArg(options::OPT__SLASH_fallback))
6236 CmdArgs.push_back("msvc-fallback");
6237 else
6238 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006239 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006240}
6241
Douglas Katzman95354292015-06-23 20:42:09 +00006242visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006243 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006244 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006245 return CLFallback.get();
6246}
6247
Daniel Sanders7f933f42015-01-30 17:35:23 +00006248void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6249 ArgStringList &CmdArgs) const {
6250 StringRef CPUName;
6251 StringRef ABIName;
6252 const llvm::Triple &Triple = getToolChain().getTriple();
6253 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6254
6255 CmdArgs.push_back("-target-abi");
6256 CmdArgs.push_back(ABIName.data());
6257}
6258
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006259void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006260 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006261 const ArgList &Args,
6262 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006263 ArgStringList CmdArgs;
6264
6265 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6266 const InputInfo &Input = Inputs[0];
6267
James Y Knight2db38f32015-08-15 03:45:25 +00006268 std::string TripleStr =
6269 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6270 const llvm::Triple Triple(TripleStr);
6271
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006272 // Don't warn about "clang -w -c foo.s"
6273 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006274 // and "clang -emit-llvm -c foo.s"
6275 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006276
Rafael Espindola577637a2015-01-03 00:06:04 +00006277 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006278
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006279 // Invoke ourselves in -cc1as mode.
6280 //
6281 // FIXME: Implement custom jobs for internal actions.
6282 CmdArgs.push_back("-cc1as");
6283
6284 // Add the "effective" target triple.
6285 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006286 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6287
6288 // Set the output mode, we currently only expect to be used as a real
6289 // assembler.
6290 CmdArgs.push_back("-filetype");
6291 CmdArgs.push_back("obj");
6292
Eric Christopher45f2e712012-12-18 00:31:10 +00006293 // Set the main file name, so that debug info works even with
6294 // -save-temps or preprocessed assembly.
6295 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006296 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006297
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006298 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006299 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006300 if (!CPU.empty()) {
6301 CmdArgs.push_back("-target-cpu");
6302 CmdArgs.push_back(Args.MakeArgString(CPU));
6303 }
6304
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006305 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006306 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006307
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006308 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006309 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006310
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006311 // Pass along any -I options so we get proper .include search paths.
6312 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6313
Eric Christopherfc3ee562012-01-10 00:38:01 +00006314 // Determine the original source input.
6315 const Action *SourceAction = &JA;
6316 while (SourceAction->getKind() != Action::InputClass) {
6317 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6318 SourceAction = SourceAction->getInputs()[0];
6319 }
6320
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006321 // Forward -g and handle debug info related flags, assuming we are dealing
6322 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006323 bool WantDebug = false;
6324 unsigned DwarfVersion = 0;
6325 Args.ClaimAllArgs(options::OPT_g_Group);
6326 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6327 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6328 !A->getOption().matches(options::OPT_ggdb0);
6329 if (WantDebug)
6330 DwarfVersion = DwarfVersionNum(A->getSpelling());
6331 }
6332 if (DwarfVersion == 0)
6333 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6334
6335 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6336
Eric Christopherfc3ee562012-01-10 00:38:01 +00006337 if (SourceAction->getType() == types::TY_Asm ||
6338 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006339 // You might think that it would be ok to set DebugInfoKind outside of
6340 // the guard for source type, however there is a test which asserts
6341 // that some assembler invocation receives no -debug-info-kind,
6342 // and it's not clear whether that test is just overly restrictive.
6343 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6344 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006345 // Add the -fdebug-compilation-dir flag if needed.
6346 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006347
6348 // Set the AT_producer to the clang version when using the integrated
6349 // assembler on assembly source files.
6350 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006351 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006352
6353 // And pass along -I options
6354 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006355 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006356 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6357 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006358
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006359 // Handle -fPIC et al -- the relocation-model affects the assembler
6360 // for some targets.
6361 llvm::Reloc::Model RelocationModel;
6362 unsigned PICLevel;
6363 bool IsPIE;
6364 std::tie(RelocationModel, PICLevel, IsPIE) =
6365 ParsePICArgs(getToolChain(), Triple, Args);
6366
6367 const char *RMName = RelocationModelName(RelocationModel);
6368 if (RMName) {
6369 CmdArgs.push_back("-mrelocation-model");
6370 CmdArgs.push_back(RMName);
6371 }
6372
Kevin Enderby292dc082011-12-22 19:31:58 +00006373 // Optionally embed the -cc1as level arguments into the debug info, for build
6374 // analysis.
6375 if (getToolChain().UseDwarfDebugFlags()) {
6376 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006377 for (const auto &Arg : Args)
6378 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006379
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006380 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006381 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6382 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006383 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006384 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006385 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006386 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006387 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006388 }
6389 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006390 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006391 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006392
6393 // FIXME: Add -static support, once we have it.
6394
Daniel Sanders7f933f42015-01-30 17:35:23 +00006395 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006396 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006397 default:
6398 break;
6399
6400 case llvm::Triple::mips:
6401 case llvm::Triple::mipsel:
6402 case llvm::Triple::mips64:
6403 case llvm::Triple::mips64el:
6404 AddMIPSTargetArgs(Args, CmdArgs);
6405 break;
6406 }
6407
David Blaikie372d9502014-01-17 03:17:40 +00006408 // Consume all the warning flags. Usually this would be handled more
6409 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6410 // doesn't handle that so rather than warning about unused flags that are
6411 // actually used, we'll lie by omission instead.
6412 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006413 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006414
David Blaikie9260ed62013-07-25 21:19:01 +00006415 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6416 getToolChain().getDriver());
6417
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006418 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006419
6420 assert(Output.isFilename() && "Unexpected lipo output.");
6421 CmdArgs.push_back("-o");
6422 CmdArgs.push_back(Output.getFilename());
6423
Daniel Dunbarb440f562010-08-02 02:38:21 +00006424 assert(Input.isFilename() && "Invalid input.");
6425 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006426
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006427 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006428 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006429
6430 // Handle the debug info splitting at object creation time if we're
6431 // creating an object.
6432 // TODO: Currently only works on linux with newer objcopy.
6433 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006434 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006435 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006436 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006437}
6438
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006439void GnuTool::anchor() {}
6440
Daniel Dunbara3246a02009-03-18 08:07:30 +00006441void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006442 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006443 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006444 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006445 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006446 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006447
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006448 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006449 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006450 // It is unfortunate that we have to claim here, as this means
6451 // we will basically never report anything interesting for
6452 // platforms using a generic gcc, even if we are just using gcc
6453 // to get to the assembler.
6454 A->claim();
6455
Daniel Dunbar939c1212010-08-03 16:14:14 +00006456 // Don't forward any -g arguments to assembly steps.
6457 if (isa<AssembleJobAction>(JA) &&
6458 A->getOption().matches(options::OPT_g_Group))
6459 continue;
6460
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006461 // Don't forward any -W arguments to assembly and link steps.
6462 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6463 A->getOption().matches(options::OPT_W_Group))
6464 continue;
6465
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006466 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006467 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006468 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006469
Daniel Dunbar4e295052010-01-25 22:35:08 +00006470 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006471
6472 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006473 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006474 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006475 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006476 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006477 }
6478
Daniel Dunbar5716d872009-05-02 21:41:52 +00006479 // Try to force gcc to match the tool chain we want, if we recognize
6480 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006481 //
6482 // FIXME: The triple class should directly provide the information we want
6483 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006484 switch (getToolChain().getArch()) {
6485 default:
6486 break;
6487 case llvm::Triple::x86:
6488 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006489 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006490 break;
6491 case llvm::Triple::x86_64:
6492 case llvm::Triple::ppc64:
6493 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006494 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006495 break;
6496 case llvm::Triple::sparcel:
6497 CmdArgs.push_back("-EL");
6498 break;
6499 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006500
Daniel Dunbarb440f562010-08-02 02:38:21 +00006501 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006502 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006503 CmdArgs.push_back(Output.getFilename());
6504 } else {
6505 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006506 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006507 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006508
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006509 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006510
6511 // Only pass -x if gcc will understand it; otherwise hope gcc
6512 // understands the suffix correctly. The main use case this would go
6513 // wrong in is for linker inputs if they happened to have an odd
6514 // suffix; really the only way to get this to happen is a command
6515 // like '-x foobar a.c' which will treat a.c like a linker input.
6516 //
6517 // FIXME: For the linker case specifically, can we safely convert
6518 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006519 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006520 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006521 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006522 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006523 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006524 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006525 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006526 else if (II.getType() == types::TY_ModuleFile)
6527 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006528 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006529
Daniel Dunbara3246a02009-03-18 08:07:30 +00006530 if (types::canTypeBeUserSpecified(II.getType())) {
6531 CmdArgs.push_back("-x");
6532 CmdArgs.push_back(types::getTypeName(II.getType()));
6533 }
6534
Daniel Dunbarb440f562010-08-02 02:38:21 +00006535 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006536 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006537 else {
6538 const Arg &A = II.getInputArg();
6539
6540 // Reverse translate some rewritten options.
6541 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6542 CmdArgs.push_back("-lstdc++");
6543 continue;
6544 }
6545
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006546 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006547 A.render(Args, CmdArgs);
6548 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006549 }
6550
Benjamin Kramer2e018ef2016-05-27 13:36:58 +00006551 const std::string &customGCCName = D.getCCCGenericGCCName();
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006552 const char *GCCName;
6553 if (!customGCCName.empty())
6554 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006555 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006556 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006557 } else
6558 GCCName = "gcc";
6559
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006560 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006561 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006562}
6563
Douglas Katzman95354292015-06-23 20:42:09 +00006564void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6565 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006566 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006567}
6568
Douglas Katzman95354292015-06-23 20:42:09 +00006569void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6570 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006571 const Driver &D = getToolChain().getDriver();
6572
Eric Christophercc7ff502015-01-29 00:56:17 +00006573 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006574 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006575 case types::TY_LLVM_IR:
6576 case types::TY_LTO_IR:
6577 case types::TY_LLVM_BC:
6578 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006579 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006580 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006581 // We assume we've got an "integrated" assembler in that gcc will produce an
6582 // object file itself.
6583 case types::TY_Object:
6584 CmdArgs.push_back("-c");
6585 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006586 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006587 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006588 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006589 case types::TY_Nothing:
6590 CmdArgs.push_back("-fsyntax-only");
6591 break;
6592 default:
6593 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006594 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006595}
6596
Douglas Katzman95354292015-06-23 20:42:09 +00006597void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6598 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006599 // The types are (hopefully) good enough.
6600}
6601
Tony Linthicum76329bf2011-12-12 21:14:55 +00006602// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006603void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006604 ArgStringList &CmdArgs) const {
6605}
6606
Douglas Katzman95354292015-06-23 20:42:09 +00006607void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6608 const InputInfo &Output,
6609 const InputInfoList &Inputs,
6610 const ArgList &Args,
6611 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006612 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006613
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006614 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6615 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006616 ArgStringList CmdArgs;
6617
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006618 std::string MArchString = "-march=hexagon";
6619 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006620
6621 RenderExtraToolArgs(JA, CmdArgs);
6622
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006623 std::string AsName = "hexagon-llvm-mc";
6624 std::string MCpuString = "-mcpu=hexagon" +
6625 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6626 CmdArgs.push_back("-filetype=obj");
6627 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6628
Tony Linthicum76329bf2011-12-12 21:14:55 +00006629 if (Output.isFilename()) {
6630 CmdArgs.push_back("-o");
6631 CmdArgs.push_back(Output.getFilename());
6632 } else {
6633 assert(Output.isNothing() && "Unexpected output");
6634 CmdArgs.push_back("-fsyntax-only");
6635 }
6636
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6638 std::string N = llvm::utostr(G.getValue());
6639 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6640 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006642 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006643
Tony Linthicum76329bf2011-12-12 21:14:55 +00006644 // Only pass -x if gcc will understand it; otherwise hope gcc
6645 // understands the suffix correctly. The main use case this would go
6646 // wrong in is for linker inputs if they happened to have an odd
6647 // suffix; really the only way to get this to happen is a command
6648 // like '-x foobar a.c' which will treat a.c like a linker input.
6649 //
6650 // FIXME: For the linker case specifically, can we safely convert
6651 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006652 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006653 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006654 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006655 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006656 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006657 else if (II.getType() == types::TY_AST)
6658 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006659 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006660 else if (II.getType() == types::TY_ModuleFile)
6661 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006662 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006663
6664 if (II.isFilename())
6665 CmdArgs.push_back(II.getFilename());
6666 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006667 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006668 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006669 II.getInputArg().render(Args, CmdArgs);
6670 }
6671
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006672 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006673 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006674}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006675
Douglas Katzman95354292015-06-23 20:42:09 +00006676void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6677 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006678}
6679
Douglas Katzman54366072015-07-27 16:53:08 +00006680static void
6681constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006682 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006683 const InputInfo &Output, const InputInfoList &Inputs,
6684 const ArgList &Args, ArgStringList &CmdArgs,
6685 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006686
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006687 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006688
Matthew Curtise689b052012-12-06 15:46:07 +00006689 //----------------------------------------------------------------------------
6690 //
6691 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006692 bool IsStatic = Args.hasArg(options::OPT_static);
6693 bool IsShared = Args.hasArg(options::OPT_shared);
6694 bool IsPIE = Args.hasArg(options::OPT_pie);
6695 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6696 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6697 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6698 bool UseG0 = false;
6699 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006700
Matthew Curtise689b052012-12-06 15:46:07 +00006701 //----------------------------------------------------------------------------
6702 // Silence warnings for various options
6703 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006704 Args.ClaimAllArgs(options::OPT_g_Group);
6705 Args.ClaimAllArgs(options::OPT_emit_llvm);
6706 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6707 // handled somewhere else.
6708 Args.ClaimAllArgs(options::OPT_static_libgcc);
6709
6710 //----------------------------------------------------------------------------
6711 //
6712 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006713 if (Args.hasArg(options::OPT_s))
6714 CmdArgs.push_back("-s");
6715
6716 if (Args.hasArg(options::OPT_r))
6717 CmdArgs.push_back("-r");
6718
6719 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006720 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006721
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006722 CmdArgs.push_back("-march=hexagon");
6723 std::string CpuVer =
6724 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6725 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6726 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006727
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006728 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006729 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006730 // The following should be the default, but doing as hexagon-gcc does.
6731 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006732 }
6733
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006734 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006735 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006736
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006737 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006738 CmdArgs.push_back("-pie");
6739
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006740 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6741 std::string N = llvm::utostr(G.getValue());
6742 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6743 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006744 }
6745
Matthew Curtise689b052012-12-06 15:46:07 +00006746 //----------------------------------------------------------------------------
6747 //
6748 //----------------------------------------------------------------------------
6749 CmdArgs.push_back("-o");
6750 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006751
Matthew Curtise689b052012-12-06 15:46:07 +00006752 //----------------------------------------------------------------------------
6753 // moslib
6754 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006755 std::vector<std::string> OsLibs;
6756 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006757
Sean Silva14facf32015-06-09 01:57:17 +00006758 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6759 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006760 OsLibs.emplace_back(A->getValue());
6761 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006762 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006763 if (OsLibs.empty()) {
6764 OsLibs.push_back("standalone");
6765 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006766 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006767
Matthew Curtise689b052012-12-06 15:46:07 +00006768 //----------------------------------------------------------------------------
6769 // Start Files
6770 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006771 const std::string MCpuSuffix = "/" + CpuVer;
6772 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6773 const std::string RootDir =
6774 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6775 const std::string StartSubDir =
6776 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006777
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006778 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6779 const char *Name) -> std::string {
6780 std::string RelName = SubDir + Name;
6781 std::string P = HTC.GetFilePath(RelName.c_str());
6782 if (llvm::sys::fs::exists(P))
6783 return P;
6784 return RootDir + RelName;
6785 };
6786
6787 if (IncStdLib && IncStartFiles) {
6788 if (!IsShared) {
6789 if (HasStandalone) {
6790 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6791 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006792 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006793 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6794 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006795 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006796 std::string Init = UseShared
6797 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6798 : Find(RootDir, StartSubDir, "/init.o");
6799 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006800 }
6801
6802 //----------------------------------------------------------------------------
6803 // Library Search Paths
6804 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006805 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6806 for (const auto &LibPath : LibPaths)
6807 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006808
6809 //----------------------------------------------------------------------------
6810 //
6811 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006812 Args.AddAllArgs(CmdArgs,
6813 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6814 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006815
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006816 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006817
6818 //----------------------------------------------------------------------------
6819 // Libraries
6820 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006821 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006822 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006823 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006824 CmdArgs.push_back("-lm");
6825 }
6826
6827 CmdArgs.push_back("--start-group");
6828
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006829 if (!IsShared) {
6830 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006831 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006832 CmdArgs.push_back("-lc");
6833 }
6834 CmdArgs.push_back("-lgcc");
6835
6836 CmdArgs.push_back("--end-group");
6837 }
6838
6839 //----------------------------------------------------------------------------
6840 // End files
6841 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006842 if (IncStdLib && IncStartFiles) {
6843 std::string Fini = UseShared
6844 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6845 : Find(RootDir, StartSubDir, "/fini.o");
6846 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006847 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006848}
6849
Douglas Katzman95354292015-06-23 20:42:09 +00006850void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6851 const InputInfo &Output,
6852 const InputInfoList &Inputs,
6853 const ArgList &Args,
6854 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006855 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006856
6857 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006858 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006859 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006860
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006861 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006862 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006863 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006864}
6865// Hexagon tools end.
6866
Tom Stellard8fa33092015-07-18 01:49:05 +00006867void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6868 const InputInfo &Output,
6869 const InputInfoList &Inputs,
6870 const ArgList &Args,
6871 const char *LinkingOutput) const {
6872
6873 std::string Linker = getToolChain().GetProgramPath(getShortName());
6874 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006875 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00006876 CmdArgs.push_back("-shared");
6877 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00006878 CmdArgs.push_back(Output.getFilename());
6879 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6880 CmdArgs, Inputs));
6881}
6882// AMDGPU tools end.
6883
Dan Gohman52816862015-12-16 23:30:41 +00006884wasm::Linker::Linker(const ToolChain &TC)
6885 : GnuTool("wasm::Linker", "lld", TC) {}
6886
6887bool wasm::Linker::isLinkJob() const {
6888 return true;
6889}
6890
6891bool wasm::Linker::hasIntegratedCPP() const {
6892 return false;
6893}
6894
6895void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6896 const InputInfo &Output,
6897 const InputInfoList &Inputs,
6898 const ArgList &Args,
6899 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006900
6901 const ToolChain &ToolChain = getToolChain();
6902 const Driver &D = ToolChain.getDriver();
6903 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006904 ArgStringList CmdArgs;
6905 CmdArgs.push_back("-flavor");
6906 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006907
6908 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006909 // size is of particular importance. This is significantly facilitated by
6910 // the enabling of -ffunction-sections and -fdata-sections in
6911 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006912 if (areOptimizationsEnabled(Args))
6913 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006914
Dan Gohman57b62c52016-02-22 19:26:15 +00006915 if (Args.hasArg(options::OPT_rdynamic))
6916 CmdArgs.push_back("-export-dynamic");
6917 if (Args.hasArg(options::OPT_s))
6918 CmdArgs.push_back("--strip-all");
6919 if (Args.hasArg(options::OPT_shared))
6920 CmdArgs.push_back("-shared");
6921 if (Args.hasArg(options::OPT_static))
6922 CmdArgs.push_back("-Bstatic");
6923
6924 Args.AddAllArgs(CmdArgs, options::OPT_L);
6925 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6926
6927 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6928 if (Args.hasArg(options::OPT_shared))
6929 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6930 else if (Args.hasArg(options::OPT_pie))
6931 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6932 else
6933 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6934
6935 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6936 }
6937
6938 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6939
6940 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6941 if (D.CCCIsCXX())
6942 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6943
6944 if (Args.hasArg(options::OPT_pthread))
6945 CmdArgs.push_back("-lpthread");
6946
6947 CmdArgs.push_back("-lc");
6948 CmdArgs.push_back("-lcompiler_rt");
6949 }
6950
6951 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6952 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6953
Dan Gohman52816862015-12-16 23:30:41 +00006954 CmdArgs.push_back("-o");
6955 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006956
Dan Gohman52816862015-12-16 23:30:41 +00006957 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6958}
6959
Renato Golin7c542b42015-07-27 23:44:45 +00006960const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006961 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006962 if (!Arch.empty())
6963 MArch = Arch;
6964 else
Bernard Ogden31561762013-12-12 13:27:11 +00006965 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006966 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006967
6968 // Handle -march=native.
6969 if (MArch == "native") {
6970 std::string CPU = llvm::sys::getHostCPUName();
6971 if (CPU != "generic") {
6972 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006973 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006974 // If there is no valid architecture suffix for this CPU we don't know how
6975 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006976 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006977 MArch = "";
6978 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006979 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006980 }
6981 }
6982
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006983 return MArch;
6984}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006985
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006986/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006987StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006988 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006989 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6990 // here means an -march=native that we can't handle, so instead return no CPU.
6991 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006992 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006993
John Brawna95c1a82015-05-08 12:52:18 +00006994 // We need to return an empty string here on invalid MArch values as the
6995 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006996 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006997}
6998
6999/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00007000std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007001 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00007002 // FIXME: Warn on inconsistent use of -mcpu and -march.
7003 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00007004 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00007005 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00007006 // Handle -mcpu=native.
7007 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00007008 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00007009 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00007010 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00007011 }
7012
Renato Goline17c5802015-07-27 23:44:42 +00007013 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00007014}
7015
7016/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007017/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00007018// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007019StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7020 const llvm::Triple &Triple) {
7021 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007022 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00007023 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007024 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007025 if (ArchKind == llvm::ARM::AK_INVALID)
7026 // In case of generic Arch, i.e. "arm",
7027 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007028 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007029 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00007030 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7031 // armv7k triple if it's actually been specified via "-arch armv7k".
7032 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00007033 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00007034 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007035 }
Renato Golin3c007252015-05-28 15:05:53 +00007036 if (ArchKind == llvm::ARM::AK_INVALID)
7037 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00007038 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00007039}
7040
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007041void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007042 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007043 if (Args.hasArg(options::OPT_r))
7044 return;
7045
John Brawn94fd9632015-05-21 12:19:49 +00007046 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7047 // to generate BE-8 executables.
7048 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7049 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007050}
7051
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007052mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00007053 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7054 // was first introduced in Release 3. However, other compilers have
7055 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007056 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7057 .Case("mips1", NanLegacy)
7058 .Case("mips2", NanLegacy)
7059 .Case("mips3", NanLegacy)
7060 .Case("mips4", NanLegacy)
7061 .Case("mips5", NanLegacy)
7062 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007063 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007064 .Case("mips32r3", NanLegacy | Nan2008)
7065 .Case("mips32r5", NanLegacy | Nan2008)
7066 .Case("mips32r6", Nan2008)
7067 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007068 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007069 .Case("mips64r3", NanLegacy | Nan2008)
7070 .Case("mips64r5", NanLegacy | Nan2008)
7071 .Case("mips64r6", Nan2008)
7072 .Default(NanLegacy);
7073}
7074
Simon Dardisd0e83ba2016-05-27 15:13:31 +00007075bool mips::hasCompactBranches(StringRef &CPU) {
7076 // mips32r6 and mips64r6 have compact branches.
7077 return llvm::StringSwitch<bool>(CPU)
7078 .Case("mips32r6", true)
7079 .Case("mips64r6", true)
7080 .Default(false);
7081}
7082
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007083bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7084 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7085 return A && (A->getValue() == StringRef(Value));
7086}
7087
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007088bool mips::isUCLibc(const ArgList &Args) {
7089 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007090 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007091}
7092
Daniel Sanders2bf13662014-07-10 14:40:57 +00007093bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007094 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7095 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007096 .Case("2008", true)
7097 .Case("legacy", false)
7098 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007099
7100 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007101 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007102 .Cases("mips32r6", "mips64r6", true)
7103 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007104
7105 return false;
7106}
7107
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007108bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7109 if (!Triple.isAndroid())
7110 return false;
7111
7112 // Android MIPS32R6 defaults to FP64A.
7113 return llvm::StringSwitch<bool>(CPUName)
7114 .Case("mips32r6", true)
7115 .Default(false);
7116}
7117
Daniel Sanders379d44b2014-07-16 11:52:23 +00007118bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007119 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007120 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007121 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7122 !Triple.isAndroid())
Daniel Sanders379d44b2014-07-16 11:52:23 +00007123 return false;
7124
7125 if (ABIName != "32")
7126 return false;
7127
Toma Tabacu94ea6862015-06-16 13:54:13 +00007128 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7129 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007130 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007131 return false;
7132
Daniel Sanders379d44b2014-07-16 11:52:23 +00007133 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007134 .Cases("mips2", "mips3", "mips4", "mips5", true)
7135 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7136 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7137 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007138}
7139
Toma Tabacu94ea6862015-06-16 13:54:13 +00007140bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7141 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007142 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007143 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7144
7145 // FPXX shouldn't be used if -msingle-float is present.
7146 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7147 options::OPT_mdouble_float))
7148 if (A->getOption().matches(options::OPT_msingle_float))
7149 UseFPXX = false;
7150
7151 return UseFPXX;
7152}
7153
Tim Northover157d9112014-01-16 08:48:16 +00007154llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007155 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7156 // archs which Darwin doesn't use.
7157
7158 // The matching this routine does is fairly pointless, since it is neither the
7159 // complete architecture list, nor a reasonable subset. The problem is that
7160 // historically the driver driver accepts this and also ties its -march=
7161 // handling to the architecture name, so we need to be careful before removing
7162 // support for it.
7163
7164 // This code must be kept in sync with Clang's Darwin specific argument
7165 // translation.
7166
7167 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007168 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7169 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7170 .Case("ppc64", llvm::Triple::ppc64)
7171 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7172 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7173 llvm::Triple::x86)
7174 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7175 // This is derived from the driver driver.
7176 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7177 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7178 .Cases("armv7s", "xscale", llvm::Triple::arm)
7179 .Case("arm64", llvm::Triple::aarch64)
7180 .Case("r600", llvm::Triple::r600)
7181 .Case("amdgcn", llvm::Triple::amdgcn)
7182 .Case("nvptx", llvm::Triple::nvptx)
7183 .Case("nvptx64", llvm::Triple::nvptx64)
7184 .Case("amdil", llvm::Triple::amdil)
7185 .Case("spir", llvm::Triple::spir)
7186 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007187}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007188
Tim Northover157d9112014-01-16 08:48:16 +00007189void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007190 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007191 T.setArch(Arch);
7192
7193 if (Str == "x86_64h")
7194 T.setArchName(Str);
7195 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7196 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007197 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007198 }
7199}
7200
Bob Wilsondecc03e2012-11-23 06:14:39 +00007201const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007202 const InputInfo &Input) {
7203 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007204}
7205
Bob Wilsondecc03e2012-11-23 06:14:39 +00007206const char *Clang::getBaseInputStem(const ArgList &Args,
7207 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007208 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007209
Chris Lattner906bb902011-01-16 08:14:11 +00007210 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007211 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007212
7213 return Str;
7214}
7215
Bob Wilsondecc03e2012-11-23 06:14:39 +00007216const char *Clang::getDependencyFileName(const ArgList &Args,
7217 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007218 // FIXME: Think about this more.
7219 std::string Res;
7220
7221 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007222 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007223 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007224 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007225 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007226 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007227 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007228}
7229
Douglas Katzman95354292015-06-23 20:42:09 +00007230void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7231 const InputInfo &Output,
7232 const InputInfoList &Inputs,
7233 const ArgList &Args,
7234 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007235 const ToolChain &ToolChain = getToolChain();
7236 const Driver &D = ToolChain.getDriver();
7237 ArgStringList CmdArgs;
7238
7239 // Silence warning for "clang -g foo.o -o foo"
7240 Args.ClaimAllArgs(options::OPT_g_Group);
7241 // and "clang -emit-llvm foo.o -o foo"
7242 Args.ClaimAllArgs(options::OPT_emit_llvm);
7243 // and for "clang -w foo.o -o foo". Other warning options are already
7244 // handled somewhere else.
7245 Args.ClaimAllArgs(options::OPT_w);
7246
7247 if (!D.SysRoot.empty())
7248 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7249
7250 // CloudABI only supports static linkage.
7251 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007252
7253 // CloudABI uses Position Independent Executables exclusively.
7254 CmdArgs.push_back("-pie");
7255 CmdArgs.push_back("--no-dynamic-linker");
7256 CmdArgs.push_back("-zrelro");
7257
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007258 CmdArgs.push_back("--eh-frame-hdr");
7259 CmdArgs.push_back("--gc-sections");
7260
7261 if (Output.isFilename()) {
7262 CmdArgs.push_back("-o");
7263 CmdArgs.push_back(Output.getFilename());
7264 } else {
7265 assert(Output.isNothing() && "Invalid output.");
7266 }
7267
Douglas Katzman78b37b02015-11-17 20:28:07 +00007268 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007269 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7270 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7271 }
7272
7273 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007274 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007275 Args.AddAllArgs(CmdArgs,
7276 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7277 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007278
Teresa Johnson945bc502015-10-15 20:35:53 +00007279 if (D.isUsingLTO())
7280 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007281
7282 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7283
Douglas Katzman78b37b02015-11-17 20:28:07 +00007284 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007285 if (D.CCCIsCXX())
7286 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7287 CmdArgs.push_back("-lc");
7288 CmdArgs.push_back("-lcompiler_rt");
7289 }
7290
Douglas Katzman78b37b02015-11-17 20:28:07 +00007291 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007292 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7293
7294 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007296}
7297
Douglas Katzman95354292015-06-23 20:42:09 +00007298void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7299 const InputInfo &Output,
7300 const InputInfoList &Inputs,
7301 const ArgList &Args,
7302 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007303 ArgStringList CmdArgs;
7304
7305 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7306 const InputInfo &Input = Inputs[0];
7307
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007308 // Determine the original source input.
7309 const Action *SourceAction = &JA;
7310 while (SourceAction->getKind() != Action::InputClass) {
7311 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7312 SourceAction = SourceAction->getInputs()[0];
7313 }
7314
Eric Christopherf5a8f492015-12-08 00:10:10 +00007315 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007316 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007317 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7318 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007319 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007320 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007321 const llvm::Triple &T(getToolChain().getTriple());
7322 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007323 CmdArgs.push_back("-Q");
7324 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007325
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007326 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007327 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007328 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007329 if (Args.hasArg(options::OPT_gstabs))
7330 CmdArgs.push_back("--gstabs");
7331 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007332 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007333 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007334
Daniel Dunbarbe220842009-03-20 16:06:39 +00007335 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007336 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007337
Daniel Dunbar6d484762010-07-22 01:47:22 +00007338 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007339 if (getToolChain().getArch() == llvm::Triple::x86 ||
7340 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007341 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7342 CmdArgs.push_back("-force_cpusubtype_ALL");
7343
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007344 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007345 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007346 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007347 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007348 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007349 CmdArgs.push_back("-static");
7350
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007351 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007352
7353 assert(Output.isFilename() && "Unexpected lipo output.");
7354 CmdArgs.push_back("-o");
7355 CmdArgs.push_back(Output.getFilename());
7356
Daniel Dunbarb440f562010-08-02 02:38:21 +00007357 assert(Input.isFilename() && "Invalid input.");
7358 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007359
7360 // asm_final spec is empty.
7361
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007362 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007363 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007364}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007365
Tim Northover157d9112014-01-16 08:48:16 +00007366void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007367
Tim Northover157d9112014-01-16 08:48:16 +00007368void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7369 ArgStringList &CmdArgs) const {
7370 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007371
Daniel Dunbarc1964212009-03-26 16:23:12 +00007372 // Derived from darwin_arch spec.
7373 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007374 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007375
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007376 // FIXME: Is this needed anymore?
7377 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007378 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007379}
7380
Douglas Katzman95354292015-06-23 20:42:09 +00007381bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007382 // We only need to generate a temp path for LTO if we aren't compiling object
7383 // files. When compiling source files, we run 'dsymutil' after linking. We
7384 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007385 for (const auto &Input : Inputs)
7386 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007387 return true;
7388
7389 return false;
7390}
7391
Douglas Katzman95354292015-06-23 20:42:09 +00007392void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7393 ArgStringList &CmdArgs,
7394 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007395 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007396 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007397
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007398 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007399 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007400 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007401 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007402 }
7403
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007404 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007405 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007406 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7407 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007408
Bob Wilson3d27dad2013-08-02 22:25:34 +00007409 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7410 CmdArgs.push_back("-export_dynamic");
7411
Bob Wilsonb111ec92015-03-02 19:01:14 +00007412 // If we are using App Extension restrictions, pass a flag to the linker
7413 // telling it that the compiled code has been audited.
7414 if (Args.hasFlag(options::OPT_fapplication_extension,
7415 options::OPT_fno_application_extension, false))
7416 CmdArgs.push_back("-application_extension");
7417
Teresa Johnson945bc502015-10-15 20:35:53 +00007418 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007419 // If we are using LTO, then automatically create a temporary file path for
7420 // the linker to use, so that it's lifetime will extend past a possible
7421 // dsymutil step.
7422 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7423 const char *TmpPath = C.getArgs().MakeArgString(
7424 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7425 C.addTempFile(TmpPath);
7426 CmdArgs.push_back("-object_path_lto");
7427 CmdArgs.push_back(TmpPath);
7428 }
7429
7430 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7431 // it in clang installed libraries. If not found, the option is not used
7432 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7433 if (Version[0] >= 133) {
7434 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7435 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7436 SmallString<128> LibLTOPath(P);
7437 llvm::sys::path::append(LibLTOPath, "lib");
7438 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7439 if (llvm::sys::fs::exists(LibLTOPath)) {
7440 CmdArgs.push_back("-lto_library");
7441 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7442 } else {
7443 D.Diag(diag::warn_drv_lto_libpath);
7444 }
7445 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007446 }
7447
Daniel Dunbarc1964212009-03-26 16:23:12 +00007448 // Derived from the "link" spec.
7449 Args.AddAllArgs(CmdArgs, options::OPT_static);
7450 if (!Args.hasArg(options::OPT_static))
7451 CmdArgs.push_back("-dynamic");
7452 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7453 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7454 // here. How do we wish to handle such things?
7455 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007456
Daniel Dunbarc1964212009-03-26 16:23:12 +00007457 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007458 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007459 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007460 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007461
7462 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7463 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7464 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7465
7466 Arg *A;
7467 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7468 (A = Args.getLastArg(options::OPT_current__version)) ||
7469 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007470 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7471 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007472
7473 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7474 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7475 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7476 } else {
7477 CmdArgs.push_back("-dylib");
7478
7479 Arg *A;
7480 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7481 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7482 (A = Args.getLastArg(options::OPT_client__name)) ||
7483 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7484 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7485 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007486 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7487 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007488
Daniel Dunbarc1964212009-03-26 16:23:12 +00007489 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7490 "-dylib_compatibility_version");
7491 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7492 "-dylib_current_version");
7493
Tim Northover157d9112014-01-16 08:48:16 +00007494 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007495
7496 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7497 "-dylib_install_name");
7498 }
7499
7500 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7501 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7502 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007503 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007504 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007505 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7506 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7507 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7508 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7509 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7510 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007511 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007512 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7513 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7514 Args.AddAllArgs(CmdArgs, options::OPT_init);
7515
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007516 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007517 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007518
Daniel Dunbarc1964212009-03-26 16:23:12 +00007519 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7520 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7521 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7522 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7523 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007524
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007525 if (const Arg *A =
7526 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7527 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007528 if (A->getOption().matches(options::OPT_fpie) ||
7529 A->getOption().matches(options::OPT_fPIE))
7530 CmdArgs.push_back("-pie");
7531 else
7532 CmdArgs.push_back("-no_pie");
7533 }
Steven Wu574b0f22016-03-01 01:07:58 +00007534 // for embed-bitcode, use -bitcode_bundle in linker command
7535 if (C.getDriver().embedBitcodeEnabled() ||
7536 C.getDriver().embedBitcodeMarkerOnly()) {
7537 // Check if the toolchain supports bitcode build flow.
7538 if (MachOTC.SupportsEmbeddedBitcode())
7539 CmdArgs.push_back("-bitcode_bundle");
7540 else
7541 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7542 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007543
7544 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7545 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7546 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7547 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7548 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7549 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7550 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7551 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7552 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7553 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7554 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7555 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7556 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7557 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7558 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7559 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007560
Daniel Dunbar84384642011-05-02 21:03:47 +00007561 // Give --sysroot= preference, over the Apple specific behavior to also use
7562 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007563 StringRef sysroot = C.getSysRoot();
7564 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007565 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007566 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007567 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7568 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007569 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007570 }
7571
Daniel Dunbarc1964212009-03-26 16:23:12 +00007572 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7573 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7574 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7575 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7576 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007577 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007578 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7579 Args.AddAllArgs(CmdArgs, options::OPT_y);
7580 Args.AddLastArg(CmdArgs, options::OPT_w);
7581 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7582 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7583 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7584 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7585 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7586 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7587 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7588 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7589 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7590 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7591 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7592 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7593}
7594
Douglas Katzman95354292015-06-23 20:42:09 +00007595void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7596 const InputInfo &Output,
7597 const InputInfoList &Inputs,
7598 const ArgList &Args,
7599 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007600 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007601
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007602 // If the number of arguments surpasses the system limits, we will encode the
7603 // input files in a separate file, shortening the command line. To this end,
7604 // build a list of input file names that can be passed via a file with the
7605 // -filelist linker option.
7606 llvm::opt::ArgStringList InputFileList;
7607
Daniel Dunbarc1964212009-03-26 16:23:12 +00007608 // The logic here is derived from gcc's behavior; most of which
7609 // comes from specs (starting with link_command). Consult gcc for
7610 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007611 ArgStringList CmdArgs;
7612
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007613 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7614 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7615 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007616 for (const auto &Arg : Args)
7617 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007618 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007619 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007620 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007621 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007622 return;
7623 }
7624
Daniel Dunbarc1964212009-03-26 16:23:12 +00007625 // I'm not sure why this particular decomposition exists in gcc, but
7626 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007627 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007628
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007629 // It seems that the 'e' option is completely ignored for dynamic executables
7630 // (the default), and with static executables, the last one wins, as expected.
7631 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7632 options::OPT_Z_Flag, options::OPT_u_Group,
7633 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007634
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007635 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7636 // members of static archive libraries which implement Objective-C classes or
7637 // categories.
7638 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7639 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007640
Daniel Dunbarc1964212009-03-26 16:23:12 +00007641 CmdArgs.push_back("-o");
7642 CmdArgs.push_back(Output.getFilename());
7643
Douglas Katzman78b37b02015-11-17 20:28:07 +00007644 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007645 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007646
Peter Collingbournec4122c12015-06-15 21:08:13 +00007647 // SafeStack requires its own runtime libraries
7648 // These libraries should be linked first, to make sure the
7649 // __safestack_init constructor executes before everything else
7650 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7651 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7652 "libclang_rt.safestack_osx.a",
7653 /*AlwaysLink=*/true);
7654 }
7655
Daniel Dunbarc1964212009-03-26 16:23:12 +00007656 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007657
Douglas Gregor9295df02012-05-15 21:00:27 +00007658 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007659 // Build the input file for -filelist (list of linker input files) in case we
7660 // need it later
7661 for (const auto &II : Inputs) {
7662 if (!II.isFilename()) {
7663 // This is a linker input argument.
7664 // We cannot mix input arguments and file names in a -filelist input, thus
7665 // we prematurely stop our list (remaining files shall be passed as
7666 // arguments).
7667 if (InputFileList.size() > 0)
7668 break;
7669
7670 continue;
7671 }
7672
7673 InputFileList.push_back(II.getFilename());
7674 }
7675
Douglas Katzman78b37b02015-11-17 20:28:07 +00007676 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007677 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7678
Douglas Katzman78b37b02015-11-17 20:28:07 +00007679 if (isObjCRuntimeLinked(Args) &&
7680 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007681 // We use arclite library for both ARC and subscripting support.
7682 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7683
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007684 CmdArgs.push_back("-framework");
7685 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007686 // Link libobj.
7687 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007688 }
John McCall31168b02011-06-15 23:02:42 +00007689
Daniel Dunbarc1964212009-03-26 16:23:12 +00007690 if (LinkingOutput) {
7691 CmdArgs.push_back("-arch_multiple");
7692 CmdArgs.push_back("-final_output");
7693 CmdArgs.push_back(LinkingOutput);
7694 }
7695
Daniel Dunbarc1964212009-03-26 16:23:12 +00007696 if (Args.hasArg(options::OPT_fnested_functions))
7697 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007698
Justin Bognerc7701242015-05-12 05:44:36 +00007699 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7700
Douglas Katzman78b37b02015-11-17 20:28:07 +00007701 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007702 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007703 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007704
Daniel Dunbarc1964212009-03-26 16:23:12 +00007705 // link_ssp spec is empty.
7706
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007707 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007708 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007709 }
7710
Douglas Katzman78b37b02015-11-17 20:28:07 +00007711 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007712 // endfile_spec is empty.
7713 }
7714
7715 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7716 Args.AddAllArgs(CmdArgs, options::OPT_F);
7717
Steven Wu3ffb61b2015-02-06 18:08:29 +00007718 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007719 for (const Arg *A : Args.filtered(options::OPT_iframework))
7720 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007721
Douglas Katzman78b37b02015-11-17 20:28:07 +00007722 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007723 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7724 if (A->getValue() == StringRef("Accelerate")) {
7725 CmdArgs.push_back("-framework");
7726 CmdArgs.push_back("Accelerate");
7727 }
7728 }
7729 }
7730
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007731 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007732 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007733 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007734 Cmd->setInputFileList(std::move(InputFileList));
7735 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007736}
7737
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007738void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007739 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007740 const InputInfoList &Inputs,
7741 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007742 const char *LinkingOutput) const {
7743 ArgStringList CmdArgs;
7744
7745 CmdArgs.push_back("-create");
7746 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007747
7748 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007749 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007750
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007751 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007752 assert(II.isFilename() && "Unexpected lipo input.");
7753 CmdArgs.push_back(II.getFilename());
7754 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007755
7756 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007757 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007758}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007759
Daniel Dunbar88299622010-06-04 18:28:36 +00007760void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007761 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007762 const InputInfoList &Inputs,
7763 const ArgList &Args,
7764 const char *LinkingOutput) const {
7765 ArgStringList CmdArgs;
7766
Daniel Dunbareb86b042011-05-09 17:23:16 +00007767 CmdArgs.push_back("-o");
7768 CmdArgs.push_back(Output.getFilename());
7769
Daniel Dunbar88299622010-06-04 18:28:36 +00007770 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7771 const InputInfo &Input = Inputs[0];
7772 assert(Input.isFilename() && "Unexpected dsymutil input.");
7773 CmdArgs.push_back(Input.getFilename());
7774
Daniel Dunbar88299622010-06-04 18:28:36 +00007775 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007776 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007777 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007778}
7779
Eric Christopher551ef452011-08-23 17:56:55 +00007780void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007781 const InputInfo &Output,
7782 const InputInfoList &Inputs,
7783 const ArgList &Args,
7784 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007785 ArgStringList CmdArgs;
7786 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007787 CmdArgs.push_back("--debug-info");
7788 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007789 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007790
7791 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7792 const InputInfo &Input = Inputs[0];
7793 assert(Input.isFilename() && "Unexpected verify input");
7794
7795 // Grabbing the output of the earlier dsymutil run.
7796 CmdArgs.push_back(Input.getFilename());
7797
7798 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007799 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007800 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007801}
7802
Douglas Katzman95354292015-06-23 20:42:09 +00007803void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007804 const InputInfo &Output,
7805 const InputInfoList &Inputs,
7806 const ArgList &Args,
7807 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007808 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007809 ArgStringList CmdArgs;
7810
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007811 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007812
7813 CmdArgs.push_back("-o");
7814 CmdArgs.push_back(Output.getFilename());
7815
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007816 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007817 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007818
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007819 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007820 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007821}
7822
Douglas Katzman95354292015-06-23 20:42:09 +00007823void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7824 const InputInfo &Output,
7825 const InputInfoList &Inputs,
7826 const ArgList &Args,
7827 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007828 ArgStringList CmdArgs;
7829
David Chisnall272a0712012-02-29 15:06:12 +00007830 // Demangle C++ names in errors
7831 CmdArgs.push_back("-C");
7832
Douglas Katzman78b37b02015-11-17 20:28:07 +00007833 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007834 CmdArgs.push_back("-e");
7835 CmdArgs.push_back("_start");
7836 }
7837
7838 if (Args.hasArg(options::OPT_static)) {
7839 CmdArgs.push_back("-Bstatic");
7840 CmdArgs.push_back("-dn");
7841 } else {
7842 CmdArgs.push_back("-Bdynamic");
7843 if (Args.hasArg(options::OPT_shared)) {
7844 CmdArgs.push_back("-shared");
7845 } else {
7846 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007847 CmdArgs.push_back(
7848 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007849 }
7850 }
7851
7852 if (Output.isFilename()) {
7853 CmdArgs.push_back("-o");
7854 CmdArgs.push_back(Output.getFilename());
7855 } else {
7856 assert(Output.isNothing() && "Invalid output.");
7857 }
7858
Douglas Katzman78b37b02015-11-17 20:28:07 +00007859 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007860 if (!Args.hasArg(options::OPT_shared))
7861 CmdArgs.push_back(
7862 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7863
7864 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7865 CmdArgs.push_back(
7866 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7867 CmdArgs.push_back(
7868 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007869 }
7870
Douglas Katzman6059ef92015-11-17 17:41:23 +00007871 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007872
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007873 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7874 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007875
7876 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7877
Douglas Katzman78b37b02015-11-17 20:28:07 +00007878 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007879 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007880 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007881 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007882 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007883 if (!Args.hasArg(options::OPT_shared)) {
7884 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007885 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007886 }
David Chisnallf571cde2012-02-15 13:39:01 +00007887 }
7888
Douglas Katzman78b37b02015-11-17 20:28:07 +00007889 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007890 CmdArgs.push_back(
7891 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007892 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007893 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007894
Xinliang David Li69306c02015-10-22 06:15:31 +00007895 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007896
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007897 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007898 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007899}
7900
Douglas Katzman95354292015-06-23 20:42:09 +00007901void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7902 const InputInfo &Output,
7903 const InputInfoList &Inputs,
7904 const ArgList &Args,
7905 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007906 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007907 ArgStringList CmdArgs;
7908
Rafael Espindolacc126272014-02-28 01:55:21 +00007909 switch (getToolChain().getArch()) {
7910 case llvm::Triple::x86:
7911 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7912 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007913 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007914 break;
7915
7916 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007917 CmdArgs.push_back("-mppc");
7918 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007919 break;
7920
7921 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007922 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007923 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007924 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7925 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7926 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007927 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007928 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007929
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007930 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007931 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007932 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7933 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7934 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007935 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007936 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007937
7938 case llvm::Triple::mips64:
7939 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007940 StringRef CPUName;
7941 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007942 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007943
7944 CmdArgs.push_back("-mabi");
7945 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7946
7947 if (getToolChain().getArch() == llvm::Triple::mips64)
7948 CmdArgs.push_back("-EB");
7949 else
7950 CmdArgs.push_back("-EL");
7951
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007952 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007953 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007954 }
7955
Rafael Espindolacc126272014-02-28 01:55:21 +00007956 default:
7957 break;
7958 }
7959
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007960 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007961
7962 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007963 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007964
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007965 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007966 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007967
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007968 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007969 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007970}
7971
Douglas Katzman95354292015-06-23 20:42:09 +00007972void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7973 const InputInfo &Output,
7974 const InputInfoList &Inputs,
7975 const ArgList &Args,
7976 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007977 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007978 ArgStringList CmdArgs;
7979
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007980 // Silence warning for "clang -g foo.o -o foo"
7981 Args.ClaimAllArgs(options::OPT_g_Group);
7982 // and "clang -emit-llvm foo.o -o foo"
7983 Args.ClaimAllArgs(options::OPT_emit_llvm);
7984 // and for "clang -w foo.o -o foo". Other warning options are already
7985 // handled somewhere else.
7986 Args.ClaimAllArgs(options::OPT_w);
7987
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007988 if (getToolChain().getArch() == llvm::Triple::mips64)
7989 CmdArgs.push_back("-EB");
7990 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7991 CmdArgs.push_back("-EL");
7992
Douglas Katzman78b37b02015-11-17 20:28:07 +00007993 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007994 CmdArgs.push_back("-e");
7995 CmdArgs.push_back("__start");
7996 }
7997
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007998 if (Args.hasArg(options::OPT_static)) {
7999 CmdArgs.push_back("-Bstatic");
8000 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008001 if (Args.hasArg(options::OPT_rdynamic))
8002 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008003 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008004 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008005 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008006 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008007 } else {
8008 CmdArgs.push_back("-dynamic-linker");
8009 CmdArgs.push_back("/usr/libexec/ld.so");
8010 }
8011 }
8012
Rafael Espindola044f7832013-06-05 04:28:55 +00008013 if (Args.hasArg(options::OPT_nopie))
8014 CmdArgs.push_back("-nopie");
8015
Daniel Dunbarb440f562010-08-02 02:38:21 +00008016 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008017 CmdArgs.push_back("-o");
8018 CmdArgs.push_back(Output.getFilename());
8019 } else {
8020 assert(Output.isNothing() && "Invalid output.");
8021 }
8022
Douglas Katzman78b37b02015-11-17 20:28:07 +00008023 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008024 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008025 if (Args.hasArg(options::OPT_pg))
8026 CmdArgs.push_back(
8027 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00008028 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008029 CmdArgs.push_back(
8030 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8031 CmdArgs.push_back(
8032 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008033 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008034 CmdArgs.push_back(
8035 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008036 }
8037 }
8038
Edward O'Callaghan5c521462009-10-28 15:13:08 +00008039 std::string Triple = getToolChain().getTripleString();
8040 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008041 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008042 CmdArgs.push_back(
8043 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008044
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008045 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8046 options::OPT_e, options::OPT_s, options::OPT_t,
8047 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008048
Daniel Dunbar54423b22010-09-17 00:24:54 +00008049 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008050
Douglas Katzman78b37b02015-11-17 20:28:07 +00008051 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008052 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008053 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008054 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00008055 CmdArgs.push_back("-lm_p");
8056 else
8057 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00008058 }
8059
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008060 // FIXME: For some reason GCC passes -lgcc before adding
8061 // the default system libraries. Just mimic this for now.
8062 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008063
Eric Christopher17674ec2012-09-13 06:32:34 +00008064 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008065 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8066 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00008067 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008068 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00008069 }
8070
Chandler Carruth45661652011-12-17 22:32:42 +00008071 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00008072 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008073 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00008074 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008075 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00008076 }
Eric Christopher17674ec2012-09-13 06:32:34 +00008077
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008078 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008079 }
8080
Douglas Katzman78b37b02015-11-17 20:28:07 +00008081 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008082 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008083 CmdArgs.push_back(
8084 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008085 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008086 CmdArgs.push_back(
8087 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008088 }
8089
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008090 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008092}
Ed Schoutene33194b2009-04-02 19:13:12 +00008093
Douglas Katzman95354292015-06-23 20:42:09 +00008094void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8095 const InputInfo &Output,
8096 const InputInfoList &Inputs,
8097 const ArgList &Args,
8098 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008099 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008100 ArgStringList CmdArgs;
8101
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008102 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008103
8104 CmdArgs.push_back("-o");
8105 CmdArgs.push_back(Output.getFilename());
8106
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008107 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008108 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008109
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008110 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008111 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008112}
8113
Douglas Katzman95354292015-06-23 20:42:09 +00008114void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8115 const InputInfo &Output,
8116 const InputInfoList &Inputs,
8117 const ArgList &Args,
8118 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008119 const Driver &D = getToolChain().getDriver();
8120 ArgStringList CmdArgs;
8121
Douglas Katzman78b37b02015-11-17 20:28:07 +00008122 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008123 CmdArgs.push_back("-e");
8124 CmdArgs.push_back("__start");
8125 }
8126
8127 if (Args.hasArg(options::OPT_static)) {
8128 CmdArgs.push_back("-Bstatic");
8129 } else {
8130 if (Args.hasArg(options::OPT_rdynamic))
8131 CmdArgs.push_back("-export-dynamic");
8132 CmdArgs.push_back("--eh-frame-hdr");
8133 CmdArgs.push_back("-Bdynamic");
8134 if (Args.hasArg(options::OPT_shared)) {
8135 CmdArgs.push_back("-shared");
8136 } else {
8137 CmdArgs.push_back("-dynamic-linker");
8138 CmdArgs.push_back("/usr/libexec/ld.so");
8139 }
8140 }
8141
8142 if (Output.isFilename()) {
8143 CmdArgs.push_back("-o");
8144 CmdArgs.push_back(Output.getFilename());
8145 } else {
8146 assert(Output.isNothing() && "Invalid output.");
8147 }
8148
Douglas Katzman78b37b02015-11-17 20:28:07 +00008149 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008150 if (!Args.hasArg(options::OPT_shared)) {
8151 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008152 CmdArgs.push_back(
8153 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008154 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008155 CmdArgs.push_back(
8156 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8157 CmdArgs.push_back(
8158 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008159 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008160 CmdArgs.push_back(
8161 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008162 }
8163 }
8164
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008165 Args.AddAllArgs(CmdArgs,
8166 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008167
8168 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8169
Douglas Katzman78b37b02015-11-17 20:28:07 +00008170 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008171 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008172 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8173 if (Args.hasArg(options::OPT_pg))
8174 CmdArgs.push_back("-lm_p");
8175 else
8176 CmdArgs.push_back("-lm");
8177 }
8178
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008179 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008180 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008181 CmdArgs.push_back("-lpthread_p");
8182 else
8183 CmdArgs.push_back("-lpthread");
8184 }
8185
Eli Friedman9fa28852012-08-08 23:57:20 +00008186 if (!Args.hasArg(options::OPT_shared)) {
8187 if (Args.hasArg(options::OPT_pg))
8188 CmdArgs.push_back("-lc_p");
8189 else
8190 CmdArgs.push_back("-lc");
8191 }
8192
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008193 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008194 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008195 case llvm::Triple::arm:
8196 MyArch = "arm";
8197 break;
8198 case llvm::Triple::x86:
8199 MyArch = "i386";
8200 break;
8201 case llvm::Triple::x86_64:
8202 MyArch = "amd64";
8203 break;
8204 default:
8205 llvm_unreachable("Unsupported architecture");
8206 }
8207 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008208 }
8209
Douglas Katzman78b37b02015-11-17 20:28:07 +00008210 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008211 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008212 CmdArgs.push_back(
8213 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008214 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008215 CmdArgs.push_back(
8216 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008217 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008218
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008219 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008221}
8222
Douglas Katzman95354292015-06-23 20:42:09 +00008223void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8224 const InputInfo &Output,
8225 const InputInfoList &Inputs,
8226 const ArgList &Args,
8227 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008228 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008229 ArgStringList CmdArgs;
8230
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008231 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8232 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008233 switch (getToolChain().getArch()) {
8234 default:
8235 break;
8236 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008237 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008238 break;
8239 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008240 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008241 break;
8242 case llvm::Triple::mips:
8243 case llvm::Triple::mipsel:
8244 case llvm::Triple::mips64:
8245 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008246 StringRef CPUName;
8247 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008248 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008249
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008250 CmdArgs.push_back("-march");
8251 CmdArgs.push_back(CPUName.data());
8252
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008253 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008254 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008255
8256 if (getToolChain().getArch() == llvm::Triple::mips ||
8257 getToolChain().getArch() == llvm::Triple::mips64)
8258 CmdArgs.push_back("-EB");
8259 else
8260 CmdArgs.push_back("-EL");
8261
Dimitry Andric46f338c2015-12-27 10:36:44 +00008262 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8263 StringRef v = A->getValue();
8264 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8265 A->claim();
8266 }
8267
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008268 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008269 break;
8270 }
8271 case llvm::Triple::arm:
8272 case llvm::Triple::armeb:
8273 case llvm::Triple::thumb:
8274 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008275 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008276
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008277 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008278 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008279 else
Renato Golinf4421f72014-02-19 10:44:07 +00008280 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008281
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008282 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008283 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008284 case llvm::Triple::GNUEABI:
8285 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008286 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008287 break;
8288
8289 default:
8290 CmdArgs.push_back("-matpcs");
8291 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008292 break;
8293 }
8294 case llvm::Triple::sparc:
8295 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008296 case llvm::Triple::sparcv9: {
8297 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8298 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008299 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008300 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008301 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008302 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008303
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008304 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008305
8306 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008307 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008308
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008309 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008310 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008311
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008312 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008314}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008315
Douglas Katzman95354292015-06-23 20:42:09 +00008316void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8317 const InputInfo &Output,
8318 const InputInfoList &Inputs,
8319 const ArgList &Args,
8320 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008321 const toolchains::FreeBSD &ToolChain =
8322 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008323 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008324 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008325 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008326 !Args.hasArg(options::OPT_shared) &&
8327 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008328 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008329
8330 // Silence warning for "clang -g foo.o -o foo"
8331 Args.ClaimAllArgs(options::OPT_g_Group);
8332 // and "clang -emit-llvm foo.o -o foo"
8333 Args.ClaimAllArgs(options::OPT_emit_llvm);
8334 // and for "clang -w foo.o -o foo". Other warning options are already
8335 // handled somewhere else.
8336 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008337
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008338 if (!D.SysRoot.empty())
8339 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8340
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008341 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008342 CmdArgs.push_back("-pie");
8343
Ed Maste1bc232d2016-04-12 21:11:46 +00008344 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008345 if (Args.hasArg(options::OPT_static)) {
8346 CmdArgs.push_back("-Bstatic");
8347 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008348 if (Args.hasArg(options::OPT_rdynamic))
8349 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008350 if (Args.hasArg(options::OPT_shared)) {
8351 CmdArgs.push_back("-Bshareable");
8352 } else {
8353 CmdArgs.push_back("-dynamic-linker");
8354 CmdArgs.push_back("/libexec/ld-elf.so.1");
8355 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008356 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008357 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8358 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8359 CmdArgs.push_back("--hash-style=both");
8360 }
8361 }
8362 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008363 }
8364
8365 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8366 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008367 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008368 CmdArgs.push_back("-m");
8369 CmdArgs.push_back("elf_i386_fbsd");
8370 }
8371
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008372 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008373 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008374 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008375 }
8376
Dimitry Andric904895f2015-12-27 06:47:09 +00008377 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8378 if (ToolChain.getArch() == llvm::Triple::mips ||
8379 ToolChain.getArch() == llvm::Triple::mipsel ||
8380 ToolChain.getArch() == llvm::Triple::mips64 ||
8381 ToolChain.getArch() == llvm::Triple::mips64el) {
8382 StringRef v = A->getValue();
8383 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8384 A->claim();
8385 }
8386 }
8387
Daniel Dunbarb440f562010-08-02 02:38:21 +00008388 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008389 CmdArgs.push_back("-o");
8390 CmdArgs.push_back(Output.getFilename());
8391 } else {
8392 assert(Output.isNothing() && "Invalid output.");
8393 }
8394
Douglas Katzman78b37b02015-11-17 20:28:07 +00008395 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008396 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008397 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008398 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008399 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008400 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008401 crt1 = "Scrt1.o";
8402 else
8403 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008404 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008405 if (crt1)
8406 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8407
8408 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8409
Craig Topper92fc2df2014-05-17 16:56:41 +00008410 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008411 if (Args.hasArg(options::OPT_static))
8412 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008413 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008414 crtbegin = "crtbeginS.o";
8415 else
8416 crtbegin = "crtbegin.o";
8417
8418 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008419 }
8420
8421 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008422 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008423 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8424 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008425 Args.AddAllArgs(CmdArgs, options::OPT_s);
8426 Args.AddAllArgs(CmdArgs, options::OPT_t);
8427 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8428 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008429
Teresa Johnson945bc502015-10-15 20:35:53 +00008430 if (D.isUsingLTO())
8431 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008432
Alexey Samsonov52550342014-09-15 19:58:40 +00008433 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008434 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008435
Douglas Katzman78b37b02015-11-17 20:28:07 +00008436 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008437 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008438 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008439 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008440 if (Args.hasArg(options::OPT_pg))
8441 CmdArgs.push_back("-lm_p");
8442 else
8443 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008444 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008445 if (NeedsSanitizerDeps)
8446 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008447 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8448 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008449 if (Args.hasArg(options::OPT_pg))
8450 CmdArgs.push_back("-lgcc_p");
8451 else
8452 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008453 if (Args.hasArg(options::OPT_static)) {
8454 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008455 } else if (Args.hasArg(options::OPT_pg)) {
8456 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008457 } else {
8458 CmdArgs.push_back("--as-needed");
8459 CmdArgs.push_back("-lgcc_s");
8460 CmdArgs.push_back("--no-as-needed");
8461 }
8462
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008463 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008464 if (Args.hasArg(options::OPT_pg))
8465 CmdArgs.push_back("-lpthread_p");
8466 else
8467 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008468 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008469
Roman Divacky66f22762011-02-10 16:59:40 +00008470 if (Args.hasArg(options::OPT_pg)) {
8471 if (Args.hasArg(options::OPT_shared))
8472 CmdArgs.push_back("-lc");
8473 else
8474 CmdArgs.push_back("-lc_p");
8475 CmdArgs.push_back("-lgcc_p");
8476 } else {
8477 CmdArgs.push_back("-lc");
8478 CmdArgs.push_back("-lgcc");
8479 }
8480
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008481 if (Args.hasArg(options::OPT_static)) {
8482 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008483 } else if (Args.hasArg(options::OPT_pg)) {
8484 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008485 } else {
8486 CmdArgs.push_back("--as-needed");
8487 CmdArgs.push_back("-lgcc_s");
8488 CmdArgs.push_back("--no-as-needed");
8489 }
8490 }
8491
Douglas Katzman78b37b02015-11-17 20:28:07 +00008492 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008493 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008494 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008495 else
8496 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008497 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008498 }
8499
Xinliang David Li69306c02015-10-22 06:15:31 +00008500 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008502 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008503 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008504}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008505
Douglas Katzman95354292015-06-23 20:42:09 +00008506void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008507 const InputInfo &Output,
8508 const InputInfoList &Inputs,
8509 const ArgList &Args,
8510 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008511 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008512 ArgStringList CmdArgs;
8513
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008514 // GNU as needs different flags for creating the correct output format
8515 // on architectures with different ABIs or optional feature sets.
8516 switch (getToolChain().getArch()) {
8517 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008518 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008519 break;
8520 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008521 case llvm::Triple::armeb:
8522 case llvm::Triple::thumb:
8523 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008524 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008525 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8526 std::string Arch =
8527 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008528 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008529 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008530 }
8531
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008532 case llvm::Triple::mips:
8533 case llvm::Triple::mipsel:
8534 case llvm::Triple::mips64:
8535 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008536 StringRef CPUName;
8537 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008538 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008539
8540 CmdArgs.push_back("-march");
8541 CmdArgs.push_back(CPUName.data());
8542
8543 CmdArgs.push_back("-mabi");
8544 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8545
8546 if (getToolChain().getArch() == llvm::Triple::mips ||
8547 getToolChain().getArch() == llvm::Triple::mips64)
8548 CmdArgs.push_back("-EB");
8549 else
8550 CmdArgs.push_back("-EL");
8551
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008552 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008553 break;
8554 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008555
8556 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008557 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008558 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008559 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8560 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008561 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008562 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008563 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008564
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008565 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008566 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008567 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8568 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008569 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008570 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008571 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008572
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008573 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008574 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008575 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008576
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008577 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008578
8579 CmdArgs.push_back("-o");
8580 CmdArgs.push_back(Output.getFilename());
8581
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008582 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008583 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008584
David Chisnallddbd68f2011-09-27 22:03:18 +00008585 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008586 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008587}
8588
Douglas Katzman95354292015-06-23 20:42:09 +00008589void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8590 const InputInfo &Output,
8591 const InputInfoList &Inputs,
8592 const ArgList &Args,
8593 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008594 const Driver &D = getToolChain().getDriver();
8595 ArgStringList CmdArgs;
8596
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008597 if (!D.SysRoot.empty())
8598 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8599
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008600 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008601 if (Args.hasArg(options::OPT_static)) {
8602 CmdArgs.push_back("-Bstatic");
8603 } else {
8604 if (Args.hasArg(options::OPT_rdynamic))
8605 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008606 if (Args.hasArg(options::OPT_shared)) {
8607 CmdArgs.push_back("-Bshareable");
8608 } else {
8609 CmdArgs.push_back("-dynamic-linker");
8610 CmdArgs.push_back("/libexec/ld.elf_so");
8611 }
8612 }
8613
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008614 // Many NetBSD architectures support more than one ABI.
8615 // Determine the correct emulation for ld.
8616 switch (getToolChain().getArch()) {
8617 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008618 CmdArgs.push_back("-m");
8619 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008620 break;
8621 case llvm::Triple::arm:
8622 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008623 CmdArgs.push_back("-m");
8624 switch (getToolChain().getTriple().getEnvironment()) {
8625 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008626 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008627 CmdArgs.push_back("armelf_nbsd_eabi");
8628 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008629 case llvm::Triple::EABIHF:
8630 case llvm::Triple::GNUEABIHF:
8631 CmdArgs.push_back("armelf_nbsd_eabihf");
8632 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008633 default:
8634 CmdArgs.push_back("armelf_nbsd");
8635 break;
8636 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008637 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008638 case llvm::Triple::armeb:
8639 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008640 arm::appendEBLinkFlags(
8641 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008642 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008643 CmdArgs.push_back("-m");
8644 switch (getToolChain().getTriple().getEnvironment()) {
8645 case llvm::Triple::EABI:
8646 case llvm::Triple::GNUEABI:
8647 CmdArgs.push_back("armelfb_nbsd_eabi");
8648 break;
8649 case llvm::Triple::EABIHF:
8650 case llvm::Triple::GNUEABIHF:
8651 CmdArgs.push_back("armelfb_nbsd_eabihf");
8652 break;
8653 default:
8654 CmdArgs.push_back("armelfb_nbsd");
8655 break;
8656 }
8657 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008658 case llvm::Triple::mips64:
8659 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008660 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008661 CmdArgs.push_back("-m");
8662 if (getToolChain().getArch() == llvm::Triple::mips64)
8663 CmdArgs.push_back("elf32btsmip");
8664 else
8665 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008666 } else if (mips::hasMipsAbiArg(Args, "64")) {
8667 CmdArgs.push_back("-m");
8668 if (getToolChain().getArch() == llvm::Triple::mips64)
8669 CmdArgs.push_back("elf64btsmip");
8670 else
8671 CmdArgs.push_back("elf64ltsmip");
8672 }
8673 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008674 case llvm::Triple::ppc:
8675 CmdArgs.push_back("-m");
8676 CmdArgs.push_back("elf32ppc_nbsd");
8677 break;
8678
8679 case llvm::Triple::ppc64:
8680 case llvm::Triple::ppc64le:
8681 CmdArgs.push_back("-m");
8682 CmdArgs.push_back("elf64ppc");
8683 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008684
8685 case llvm::Triple::sparc:
8686 CmdArgs.push_back("-m");
8687 CmdArgs.push_back("elf32_sparc");
8688 break;
8689
8690 case llvm::Triple::sparcv9:
8691 CmdArgs.push_back("-m");
8692 CmdArgs.push_back("elf64_sparc");
8693 break;
8694
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008695 default:
8696 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008697 }
8698
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008699 if (Output.isFilename()) {
8700 CmdArgs.push_back("-o");
8701 CmdArgs.push_back(Output.getFilename());
8702 } else {
8703 assert(Output.isNothing() && "Invalid output.");
8704 }
8705
Douglas Katzman78b37b02015-11-17 20:28:07 +00008706 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008707 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008708 CmdArgs.push_back(
8709 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8710 CmdArgs.push_back(
8711 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8712 CmdArgs.push_back(
8713 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008714 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008715 CmdArgs.push_back(
8716 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8717 CmdArgs.push_back(
8718 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008719 }
8720 }
8721
8722 Args.AddAllArgs(CmdArgs, options::OPT_L);
8723 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8724 Args.AddAllArgs(CmdArgs, options::OPT_e);
8725 Args.AddAllArgs(CmdArgs, options::OPT_s);
8726 Args.AddAllArgs(CmdArgs, options::OPT_t);
8727 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8728 Args.AddAllArgs(CmdArgs, options::OPT_r);
8729
8730 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8731
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008732 unsigned Major, Minor, Micro;
8733 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8734 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008735 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008736 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008737 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008738 case llvm::Triple::arm:
8739 case llvm::Triple::armeb:
8740 case llvm::Triple::thumb:
8741 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008742 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008743 case llvm::Triple::ppc64:
8744 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008745 case llvm::Triple::sparc:
8746 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008747 case llvm::Triple::x86:
8748 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008749 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008750 break;
8751 default:
8752 break;
8753 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008754 }
8755
Douglas Katzman78b37b02015-11-17 20:28:07 +00008756 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008757 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008758 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008759 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8760 CmdArgs.push_back("-lm");
8761 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008762 if (Args.hasArg(options::OPT_pthread))
8763 CmdArgs.push_back("-lpthread");
8764 CmdArgs.push_back("-lc");
8765
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008766 if (useLibgcc) {
8767 if (Args.hasArg(options::OPT_static)) {
8768 // libgcc_eh depends on libc, so resolve as much as possible,
8769 // pull in any new requirements from libc and then get the rest
8770 // of libgcc.
8771 CmdArgs.push_back("-lgcc_eh");
8772 CmdArgs.push_back("-lc");
8773 CmdArgs.push_back("-lgcc");
8774 } else {
8775 CmdArgs.push_back("-lgcc");
8776 CmdArgs.push_back("--as-needed");
8777 CmdArgs.push_back("-lgcc_s");
8778 CmdArgs.push_back("--no-as-needed");
8779 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008780 }
8781 }
8782
Douglas Katzman78b37b02015-11-17 20:28:07 +00008783 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008784 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008785 CmdArgs.push_back(
8786 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008787 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008788 CmdArgs.push_back(
8789 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8790 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008791 }
8792
Xinliang David Li69306c02015-10-22 06:15:31 +00008793 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008794
Logan Chieneb9162f2014-06-26 14:23:45 +00008795 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008796 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008797}
8798
Douglas Katzman95354292015-06-23 20:42:09 +00008799void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8800 const InputInfo &Output,
8801 const InputInfoList &Inputs,
8802 const ArgList &Args,
8803 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008804 claimNoWarnArgs(Args);
8805
James Y Knight2db38f32015-08-15 03:45:25 +00008806 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8807 llvm::Triple Triple = llvm::Triple(TripleStr);
8808
Rafael Espindola92b00932010-08-10 00:25:48 +00008809 ArgStringList CmdArgs;
8810
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008811 llvm::Reloc::Model RelocationModel;
8812 unsigned PICLevel;
8813 bool IsPIE;
8814 std::tie(RelocationModel, PICLevel, IsPIE) =
8815 ParsePICArgs(getToolChain(), Triple, Args);
8816
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008817 switch (getToolChain().getArch()) {
8818 default:
8819 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008820 // Add --32/--64 to make sure we get the format we want.
8821 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008822 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008823 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008824 break;
8825 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008826 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8827 CmdArgs.push_back("--x32");
8828 else
8829 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008830 break;
8831 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008832 CmdArgs.push_back("-a32");
8833 CmdArgs.push_back("-mppc");
8834 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008835 break;
8836 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008837 CmdArgs.push_back("-a64");
8838 CmdArgs.push_back("-mppc64");
8839 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008840 break;
8841 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008842 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008843 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008844 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008845 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008846 break;
8847 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008848 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008849 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008850 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8851 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8852 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008853 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008854 }
8855 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008856 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008857 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8858 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8859 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008860 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008861 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008862 case llvm::Triple::arm:
8863 case llvm::Triple::armeb:
8864 case llvm::Triple::thumb:
8865 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008866 const llvm::Triple &Triple2 = getToolChain().getTriple();
8867 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008868 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008869 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008870 break;
8871 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008872 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008873 break;
8874 default:
8875 break;
8876 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008877
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008878 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008879 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8880 case arm::FloatABI::Soft:
8881 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8882 break;
8883 case arm::FloatABI::SoftFP:
8884 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8885 break;
8886 case arm::FloatABI::Hard:
8887 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8888 break;
8889 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008890
8891 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008892
8893 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008894 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008895 // march from being picked in the absence of a cpu flag.
8896 Arg *A;
8897 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008898 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008899 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008900 else
8901 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008902 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008903 break;
8904 }
8905 case llvm::Triple::mips:
8906 case llvm::Triple::mipsel:
8907 case llvm::Triple::mips64:
8908 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008909 StringRef CPUName;
8910 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008911 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008912 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008913
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008914 CmdArgs.push_back("-march");
8915 CmdArgs.push_back(CPUName.data());
8916
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008917 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008918 CmdArgs.push_back(ABIName.data());
8919
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008920 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8921 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008922 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008923 CmdArgs.push_back("-mno-shared");
8924
Daniel Sanders379d44b2014-07-16 11:52:23 +00008925 // LLVM doesn't support -mplt yet and acts as if it is always given.
8926 // However, -mplt has no effect with the N64 ABI.
8927 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008928
8929 if (getToolChain().getArch() == llvm::Triple::mips ||
8930 getToolChain().getArch() == llvm::Triple::mips64)
8931 CmdArgs.push_back("-EB");
8932 else
8933 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008934
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008935 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8936 if (StringRef(A->getValue()) == "2008")
8937 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8938 }
8939
Daniel Sanders379d44b2014-07-16 11:52:23 +00008940 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8941 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8942 options::OPT_mfp64)) {
8943 A->claim();
8944 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008945 } else if (mips::shouldUseFPXX(
8946 Args, getToolChain().getTriple(), CPUName, ABIName,
8947 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008948 CmdArgs.push_back("-mfpxx");
8949
8950 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8951 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008952 if (Arg *A =
8953 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008954 if (A->getOption().matches(options::OPT_mips16)) {
8955 A->claim();
8956 A->render(Args, CmdArgs);
8957 } else {
8958 A->claim();
8959 CmdArgs.push_back("-no-mips16");
8960 }
8961 }
8962
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008963 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8964 options::OPT_mno_micromips);
8965 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8966 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8967
Simon Atanasyanbd986632013-11-26 11:58:04 +00008968 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8969 // Do not use AddLastArg because not all versions of MIPS assembler
8970 // support -mmsa / -mno-msa options.
8971 if (A->getOption().matches(options::OPT_mmsa))
8972 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8973 }
8974
Daniel Sanders379d44b2014-07-16 11:52:23 +00008975 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8976 options::OPT_msoft_float);
8977
Toma Tabacub36d6102015-06-11 12:13:18 +00008978 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8979 options::OPT_msingle_float);
8980
Daniel Sanders379d44b2014-07-16 11:52:23 +00008981 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8982 options::OPT_mno_odd_spreg);
8983
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008984 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008985 break;
8986 }
8987 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008988 // Always pass an -march option, since our default of z10 is later
8989 // than the GNU assembler's default.
8990 StringRef CPUName = getSystemZTargetCPU(Args);
8991 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008992 break;
8993 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008994 }
8995
Renato Golina74bbc72015-07-22 15:32:36 +00008996 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008997 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008998
8999 CmdArgs.push_back("-o");
9000 CmdArgs.push_back(Output.getFilename());
9001
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009002 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00009003 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00009004
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009005 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009006 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00009007
9008 // Handle the debug info splitting at object creation time if we're
9009 // creating an object.
9010 // TODO: Currently only works on linux with newer objcopy.
9011 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00009012 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00009013 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00009014 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00009015}
9016
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00009017static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009018 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009019 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00009020 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00009021 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9022 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00009023 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009024 CmdArgs.push_back("-lgcc");
9025
Logan Chien3d3373c2012-11-19 12:04:11 +00009026 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009027 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009028 CmdArgs.push_back("-lgcc");
9029 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00009030 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009031 CmdArgs.push_back("--as-needed");
9032 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00009033 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009034 CmdArgs.push_back("--no-as-needed");
9035 }
9036
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009037 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00009038 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00009039 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009040 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00009041
9042 // According to Android ABI, we have to link with libdl if we are
9043 // linking with non-static libgcc.
9044 //
9045 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9046 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9047 if (isAndroid && !StaticLibgcc)
9048 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00009049}
9050
Renato Golinc4b49242014-02-13 10:01:16 +00009051static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009052 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009053 // Make use of compiler-rt if --rtlib option is used
9054 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9055
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009056 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009057 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009058 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009059 default:
9060 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009061 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009062 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009063 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009064 break;
9065 }
Renato Golinc4b49242014-02-13 10:01:16 +00009066 break;
9067 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009068 // Make sure libgcc is not used under MSVC environment by default
9069 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9070 // Issue error diagnostic if libgcc is explicitly specified
9071 // through command line as --rtlib option argument.
9072 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9073 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9074 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9075 }
9076 } else
9077 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009078 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009079 }
9080}
9081
Rafael Espindola1e085772014-08-15 17:14:35 +00009082static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9083 switch (T.getArch()) {
9084 case llvm::Triple::x86:
9085 return "elf_i386";
9086 case llvm::Triple::aarch64:
9087 return "aarch64linux";
9088 case llvm::Triple::aarch64_be:
9089 return "aarch64_be_linux";
9090 case llvm::Triple::arm:
9091 case llvm::Triple::thumb:
9092 return "armelf_linux_eabi";
9093 case llvm::Triple::armeb:
9094 case llvm::Triple::thumbeb:
9095 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9096 case llvm::Triple::ppc:
9097 return "elf32ppclinux";
9098 case llvm::Triple::ppc64:
9099 return "elf64ppc";
9100 case llvm::Triple::ppc64le:
9101 return "elf64lppc";
9102 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009103 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009104 return "elf32_sparc";
9105 case llvm::Triple::sparcv9:
9106 return "elf64_sparc";
9107 case llvm::Triple::mips:
9108 return "elf32btsmip";
9109 case llvm::Triple::mipsel:
9110 return "elf32ltsmip";
9111 case llvm::Triple::mips64:
9112 if (mips::hasMipsAbiArg(Args, "n32"))
9113 return "elf32btsmipn32";
9114 return "elf64btsmip";
9115 case llvm::Triple::mips64el:
9116 if (mips::hasMipsAbiArg(Args, "n32"))
9117 return "elf32ltsmipn32";
9118 return "elf64ltsmip";
9119 case llvm::Triple::systemz:
9120 return "elf64_s390";
9121 case llvm::Triple::x86_64:
9122 if (T.getEnvironment() == llvm::Triple::GNUX32)
9123 return "elf32_x86_64";
9124 return "elf_x86_64";
9125 default:
9126 llvm_unreachable("Unexpected arch");
9127 }
9128}
9129
Douglas Katzman95354292015-06-23 20:42:09 +00009130void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9131 const InputInfo &Output,
9132 const InputInfoList &Inputs,
9133 const ArgList &Args,
9134 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009135 const toolchains::Linux &ToolChain =
9136 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009137 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009138
9139 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9140 llvm::Triple Triple = llvm::Triple(TripleStr);
9141
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009142 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009143 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009144 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009145 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9146 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009147 const bool HasCRTBeginEndFiles =
9148 ToolChain.getTriple().hasEnvironment() ||
9149 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009150
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009151 ArgStringList CmdArgs;
9152
Rafael Espindolad1002f62010-11-15 18:28:16 +00009153 // Silence warning for "clang -g foo.o -o foo"
9154 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009155 // and "clang -emit-llvm foo.o -o foo"
9156 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009157 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009158 // handled somewhere else.
9159 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009160
Peter Collingbourne39719a72015-11-20 20:49:39 +00009161 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9162 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009163 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009164 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009165 CmdArgs.push_back("-target");
9166 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9167 }
9168
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009169 if (!D.SysRoot.empty())
9170 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009171
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009172 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009173 CmdArgs.push_back("-pie");
9174
Rafael Espindola1c76c592010-11-07 22:57:16 +00009175 if (Args.hasArg(options::OPT_rdynamic))
9176 CmdArgs.push_back("-export-dynamic");
9177
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009178 if (Args.hasArg(options::OPT_s))
9179 CmdArgs.push_back("-s");
9180
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009181 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009182 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009183
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009184 for (const auto &Opt : ToolChain.ExtraOpts)
9185 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009186
9187 if (!Args.hasArg(options::OPT_static)) {
9188 CmdArgs.push_back("--eh-frame-hdr");
9189 }
9190
9191 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009192 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009193
9194 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009195 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9196 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009197 CmdArgs.push_back("-Bstatic");
9198 else
9199 CmdArgs.push_back("-static");
9200 } else if (Args.hasArg(options::OPT_shared)) {
9201 CmdArgs.push_back("-shared");
9202 }
9203
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009204 if (!Args.hasArg(options::OPT_static)) {
9205 if (Args.hasArg(options::OPT_rdynamic))
9206 CmdArgs.push_back("-export-dynamic");
9207
9208 if (!Args.hasArg(options::OPT_shared)) {
9209 const std::string Loader =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00009210 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009211 CmdArgs.push_back("-dynamic-linker");
9212 CmdArgs.push_back(Args.MakeArgString(Loader));
9213 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009214 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009215
9216 CmdArgs.push_back("-o");
9217 CmdArgs.push_back(Output.getFilename());
9218
Douglas Katzman78b37b02015-11-17 20:28:07 +00009219 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009220 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009221 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009222 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009223 if (Args.hasArg(options::OPT_pg))
9224 crt1 = "gcrt1.o";
9225 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009226 crt1 = "Scrt1.o";
9227 else
9228 crt1 = "crt1.o";
9229 }
9230 if (crt1)
9231 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009232
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9234 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009235
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009236 const char *crtbegin;
9237 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009238 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009239 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009240 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009241 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009242 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009243 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009244 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009245
9246 if (HasCRTBeginEndFiles)
9247 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009248
9249 // Add crtfastmath.o if available and fast math is enabled.
9250 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009251 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009252
9253 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009254 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009255
Douglas Katzman6059ef92015-11-17 17:41:23 +00009256 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009257
Teresa Johnson945bc502015-10-15 20:35:53 +00009258 if (D.isUsingLTO())
9259 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009260
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009261 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9262 CmdArgs.push_back("--no-demangle");
9263
Alexey Samsonov52550342014-09-15 19:58:40 +00009264 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009265 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009266 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009267 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009268
Douglas Katzman78b37b02015-11-17 20:28:07 +00009269 if (D.CCCIsCXX() &&
9270 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009271 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009272 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009273 if (OnlyLibstdcxxStatic)
9274 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009275 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009276 if (OnlyLibstdcxxStatic)
9277 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009278 CmdArgs.push_back("-lm");
9279 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009280 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9281 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009282
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009283 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009284 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9285 if (Args.hasArg(options::OPT_static))
9286 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009287
Alexey Samsonov52550342014-09-15 19:58:40 +00009288 if (NeedsSanitizerDeps)
9289 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9290
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009291 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9292 Args.hasArg(options::OPT_pthreads);
9293
9294 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9295 options::OPT_fno_openmp, false)) {
9296 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9297 // FIXME: Does this really make sense for all GNU toolchains?
9298 WantPthread = true;
9299
9300 // Also link the particular OpenMP runtimes.
9301 switch (getOpenMPRuntime(ToolChain, Args)) {
9302 case OMPRT_OMP:
9303 CmdArgs.push_back("-lomp");
9304 break;
9305 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009306 CmdArgs.push_back("-lgomp");
9307
9308 // FIXME: Exclude this for platforms with libgomp that don't require
9309 // librt. Most modern Linux platforms require it, but some may not.
9310 CmdArgs.push_back("-lrt");
9311 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009312 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009313 CmdArgs.push_back("-liomp5");
9314 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009315 case OMPRT_Unknown:
9316 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009317 break;
9318 }
Chandler Carruth01538002013-01-17 13:19:29 +00009319 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009320
Renato Golinc4b49242014-02-13 10:01:16 +00009321 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009322
Richard Smith31d1de22015-05-20 22:48:44 +00009323 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009324 CmdArgs.push_back("-lpthread");
9325
Rafael Espindolab17bc532016-01-25 18:29:16 +00009326 if (Args.hasArg(options::OPT_fsplit_stack))
9327 CmdArgs.push_back("--wrap=pthread_create");
9328
Chandler Carruth94a32012012-05-14 18:31:18 +00009329 CmdArgs.push_back("-lc");
9330
9331 if (Args.hasArg(options::OPT_static))
9332 CmdArgs.push_back("--end-group");
9333 else
Renato Golinc4b49242014-02-13 10:01:16 +00009334 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009335 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009336
Rafael Espindola81937ec2010-12-01 01:52:43 +00009337 if (!Args.hasArg(options::OPT_nostartfiles)) {
9338 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009339 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009340 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009341 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009342 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009343 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009344 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009345
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009346 if (HasCRTBeginEndFiles)
9347 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009348 if (!isAndroid)
9349 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009350 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009351 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009352
Peter Collingbourne39719a72015-11-20 20:49:39 +00009353 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009354}
9355
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009356// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9357// for the various SFI requirements like register masking. The assembly tool
9358// inserts the file containing the macros as an input into all the assembly
9359// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009360void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9361 const InputInfo &Output,
9362 const InputInfoList &Inputs,
9363 const ArgList &Args,
9364 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009365 const toolchains::NaClToolChain &ToolChain =
9366 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009367 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009368 "nacl-arm-macros.s");
9369 InputInfoList NewInputs;
9370 NewInputs.push_back(NaClMacros);
9371 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009372 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9373 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009374}
9375
Douglas Katzman750cfc52015-06-29 18:42:16 +00009376// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009377// we use static by default, do not yet support sanitizers or LTO, and a few
9378// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009379// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009380void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9381 const InputInfo &Output,
9382 const InputInfoList &Inputs,
9383 const ArgList &Args,
9384 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009385
Douglas Katzman54366072015-07-27 16:53:08 +00009386 const toolchains::NaClToolChain &ToolChain =
9387 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009388 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009389 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009390 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009391 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009392
9393 ArgStringList CmdArgs;
9394
9395 // Silence warning for "clang -g foo.o -o foo"
9396 Args.ClaimAllArgs(options::OPT_g_Group);
9397 // and "clang -emit-llvm foo.o -o foo"
9398 Args.ClaimAllArgs(options::OPT_emit_llvm);
9399 // and for "clang -w foo.o -o foo". Other warning options are already
9400 // handled somewhere else.
9401 Args.ClaimAllArgs(options::OPT_w);
9402
9403 if (!D.SysRoot.empty())
9404 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9405
9406 if (Args.hasArg(options::OPT_rdynamic))
9407 CmdArgs.push_back("-export-dynamic");
9408
9409 if (Args.hasArg(options::OPT_s))
9410 CmdArgs.push_back("-s");
9411
Douglas Katzman54366072015-07-27 16:53:08 +00009412 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9413 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009414 CmdArgs.push_back("--build-id");
9415
9416 if (!IsStatic)
9417 CmdArgs.push_back("--eh-frame-hdr");
9418
9419 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009420 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009421 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009422 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009423 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009424 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009425 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009426 else if (Arch == llvm::Triple::mipsel)
9427 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009428 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009429 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9430 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009431
9432 if (IsStatic)
9433 CmdArgs.push_back("-static");
9434 else if (Args.hasArg(options::OPT_shared))
9435 CmdArgs.push_back("-shared");
9436
9437 CmdArgs.push_back("-o");
9438 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009439 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009440 if (!Args.hasArg(options::OPT_shared))
9441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9442 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9443
9444 const char *crtbegin;
9445 if (IsStatic)
9446 crtbegin = "crtbeginT.o";
9447 else if (Args.hasArg(options::OPT_shared))
9448 crtbegin = "crtbeginS.o";
9449 else
9450 crtbegin = "crtbegin.o";
9451 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9452 }
9453
9454 Args.AddAllArgs(CmdArgs, options::OPT_L);
9455 Args.AddAllArgs(CmdArgs, options::OPT_u);
9456
Douglas Katzman6059ef92015-11-17 17:41:23 +00009457 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009458
9459 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9460 CmdArgs.push_back("--no-demangle");
9461
9462 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9463
Douglas Katzman78b37b02015-11-17 20:28:07 +00009464 if (D.CCCIsCXX() &&
9465 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009466 bool OnlyLibstdcxxStatic =
9467 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009468 if (OnlyLibstdcxxStatic)
9469 CmdArgs.push_back("-Bstatic");
9470 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9471 if (OnlyLibstdcxxStatic)
9472 CmdArgs.push_back("-Bdynamic");
9473 CmdArgs.push_back("-lm");
9474 }
9475
9476 if (!Args.hasArg(options::OPT_nostdlib)) {
9477 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9478 // Always use groups, since it has no effect on dynamic libraries.
9479 CmdArgs.push_back("--start-group");
9480 CmdArgs.push_back("-lc");
9481 // NaCl's libc++ currently requires libpthread, so just always include it
9482 // in the group for C++.
9483 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009484 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009485 // Gold, used by Mips, handles nested groups differently than ld, and
9486 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9487 // which is not a desired behaviour here.
9488 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9489 if (getToolChain().getArch() == llvm::Triple::mipsel)
9490 CmdArgs.push_back("-lnacl");
9491
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009492 CmdArgs.push_back("-lpthread");
9493 }
9494
9495 CmdArgs.push_back("-lgcc");
9496 CmdArgs.push_back("--as-needed");
9497 if (IsStatic)
9498 CmdArgs.push_back("-lgcc_eh");
9499 else
9500 CmdArgs.push_back("-lgcc_s");
9501 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009502
9503 // Mips needs to create and use pnacl_legacy library that contains
9504 // definitions from bitcode/pnaclmm.c and definitions for
9505 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9506 if (getToolChain().getArch() == llvm::Triple::mipsel)
9507 CmdArgs.push_back("-lpnacl_legacy");
9508
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009509 CmdArgs.push_back("--end-group");
9510 }
9511
9512 if (!Args.hasArg(options::OPT_nostartfiles)) {
9513 const char *crtend;
9514 if (Args.hasArg(options::OPT_shared))
9515 crtend = "crtendS.o";
9516 else
9517 crtend = "crtend.o";
9518
9519 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9520 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9521 }
9522 }
9523
Peter Collingbourne39719a72015-11-20 20:49:39 +00009524 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9525 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009526}
9527
Douglas Katzman95354292015-06-23 20:42:09 +00009528void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9529 const InputInfo &Output,
9530 const InputInfoList &Inputs,
9531 const ArgList &Args,
9532 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009533 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009534 ArgStringList CmdArgs;
9535
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009536 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009537
9538 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009539 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009540
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009541 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009542 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009543
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009544 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009545 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009546}
9547
Douglas Katzman95354292015-06-23 20:42:09 +00009548void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9549 const InputInfo &Output,
9550 const InputInfoList &Inputs,
9551 const ArgList &Args,
9552 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009553 const Driver &D = getToolChain().getDriver();
9554 ArgStringList CmdArgs;
9555
Daniel Dunbarb440f562010-08-02 02:38:21 +00009556 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009557 CmdArgs.push_back("-o");
9558 CmdArgs.push_back(Output.getFilename());
9559 } else {
9560 assert(Output.isNothing() && "Invalid output.");
9561 }
9562
Douglas Katzman78b37b02015-11-17 20:28:07 +00009563 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009564 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9565 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9566 CmdArgs.push_back(
9567 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9568 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009569 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009570
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009571 Args.AddAllArgs(CmdArgs,
9572 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009573
Daniel Dunbar54423b22010-09-17 00:24:54 +00009574 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009575
Xinliang David Li69306c02015-10-22 06:15:31 +00009576 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009577
Douglas Katzman78b37b02015-11-17 20:28:07 +00009578 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009579 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009580 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009581 CmdArgs.push_back("-lm");
9582 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009583 }
9584
Douglas Katzman78b37b02015-11-17 20:28:07 +00009585 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009586 if (Args.hasArg(options::OPT_pthread))
9587 CmdArgs.push_back("-lpthread");
9588 CmdArgs.push_back("-lc");
9589 CmdArgs.push_back("-lCompilerRT-Generic");
9590 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9591 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009592 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009593 }
9594
Logan Chieneb9162f2014-06-26 14:23:45 +00009595 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009596 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009597}
9598
Daniel Dunbarcc912342009-05-02 18:28:39 +00009599/// DragonFly Tools
9600
9601// For now, DragonFly Assemble does just about the same as for
9602// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009603void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9604 const InputInfo &Output,
9605 const InputInfoList &Inputs,
9606 const ArgList &Args,
9607 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009608 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009609 ArgStringList CmdArgs;
9610
9611 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9612 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009613 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009614 CmdArgs.push_back("--32");
9615
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009616 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009617
9618 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009619 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009620
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009621 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009622 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009623
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009624 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009625 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009626}
9627
Douglas Katzman95354292015-06-23 20:42:09 +00009628void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9629 const InputInfo &Output,
9630 const InputInfoList &Inputs,
9631 const ArgList &Args,
9632 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009633 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009634 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009635
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009636 if (!D.SysRoot.empty())
9637 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9638
John McCall65b8da02013-04-11 22:55:55 +00009639 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009640 if (Args.hasArg(options::OPT_static)) {
9641 CmdArgs.push_back("-Bstatic");
9642 } else {
John McCall65b8da02013-04-11 22:55:55 +00009643 if (Args.hasArg(options::OPT_rdynamic))
9644 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009645 if (Args.hasArg(options::OPT_shared))
9646 CmdArgs.push_back("-Bshareable");
9647 else {
9648 CmdArgs.push_back("-dynamic-linker");
9649 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9650 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009651 CmdArgs.push_back("--hash-style=gnu");
9652 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009653 }
9654
9655 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9656 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009657 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009658 CmdArgs.push_back("-m");
9659 CmdArgs.push_back("elf_i386");
9660 }
9661
Daniel Dunbarb440f562010-08-02 02:38:21 +00009662 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009663 CmdArgs.push_back("-o");
9664 CmdArgs.push_back(Output.getFilename());
9665 } else {
9666 assert(Output.isNothing() && "Invalid output.");
9667 }
9668
Douglas Katzman78b37b02015-11-17 20:28:07 +00009669 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009670 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009671 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009672 CmdArgs.push_back(
9673 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009674 else {
9675 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009676 CmdArgs.push_back(
9677 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009678 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009679 CmdArgs.push_back(
9680 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009681 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009682 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009683 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009684 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009685 CmdArgs.push_back(
9686 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009687 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009688 CmdArgs.push_back(
9689 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009690 }
9691
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009692 Args.AddAllArgs(CmdArgs,
9693 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009694
Daniel Dunbar54423b22010-09-17 00:24:54 +00009695 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009696
Douglas Katzman78b37b02015-11-17 20:28:07 +00009697 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009698 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009699
9700 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009701 CmdArgs.push_back("-rpath");
9702 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009703 }
9704
Hans Wennborg70850d82013-07-18 20:29:38 +00009705 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009706 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009707 CmdArgs.push_back("-lm");
9708 }
9709
Daniel Dunbarcc912342009-05-02 18:28:39 +00009710 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009711 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009712
9713 if (!Args.hasArg(options::OPT_nolibc)) {
9714 CmdArgs.push_back("-lc");
9715 }
9716
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009717 if (Args.hasArg(options::OPT_static) ||
9718 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009719 CmdArgs.push_back("-lgcc");
9720 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009721 } else {
9722 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009723 CmdArgs.push_back("-lgcc_pic");
9724 if (!Args.hasArg(options::OPT_shared))
9725 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009726 } else {
John McCall65b8da02013-04-11 22:55:55 +00009727 CmdArgs.push_back("-lgcc");
9728 CmdArgs.push_back("--as-needed");
9729 CmdArgs.push_back("-lgcc_pic");
9730 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009731 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009732 }
9733 }
9734
Douglas Katzman78b37b02015-11-17 20:28:07 +00009735 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009736 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009737 CmdArgs.push_back(
9738 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009739 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009740 CmdArgs.push_back(
9741 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9742 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009743 }
9744
Xinliang David Li69306c02015-10-22 06:15:31 +00009745 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009746
Logan Chieneb9162f2014-06-26 14:23:45 +00009747 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009748 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009749}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009750
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009751// Try to find Exe from a Visual Studio distribution. This first tries to find
9752// an installed copy of Visual Studio and, failing that, looks in the PATH,
9753// making sure that whatever executable that's found is not a same-named exe
9754// from clang itself to prevent clang from falling back to itself.
9755static std::string FindVisualStudioExecutable(const ToolChain &TC,
9756 const char *Exe,
9757 const char *ClangProgramPath) {
9758 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9759 std::string visualStudioBinDir;
9760 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9761 visualStudioBinDir)) {
9762 SmallString<128> FilePath(visualStudioBinDir);
9763 llvm::sys::path::append(FilePath, Exe);
9764 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9765 return FilePath.str();
9766 }
9767
9768 return Exe;
9769}
9770
Douglas Katzman95354292015-06-23 20:42:09 +00009771void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9772 const InputInfo &Output,
9773 const InputInfoList &Inputs,
9774 const ArgList &Args,
9775 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009776 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009777 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009778
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009779 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9780 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009781 CmdArgs.push_back(
9782 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009783
Douglas Katzman78b37b02015-11-17 20:28:07 +00009784 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9785 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009786 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009787
Zachary Turner10d75b22014-10-22 20:40:43 +00009788 if (!llvm::sys::Process::GetEnv("LIB")) {
9789 // If the VC environment hasn't been configured (perhaps because the user
9790 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009791 // the environment variable is set however, assume the user knows what
9792 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009793 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009794 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009795 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9796 SmallString<128> LibDir(VisualStudioDir);
9797 llvm::sys::path::append(LibDir, "VC", "lib");
9798 switch (MSVC.getArch()) {
9799 case llvm::Triple::x86:
9800 // x86 just puts the libraries directly in lib
9801 break;
9802 case llvm::Triple::x86_64:
9803 llvm::sys::path::append(LibDir, "amd64");
9804 break;
9805 case llvm::Triple::arm:
9806 llvm::sys::path::append(LibDir, "arm");
9807 break;
9808 default:
9809 break;
9810 }
9811 CmdArgs.push_back(
9812 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009813
9814 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9815 std::string UniversalCRTLibPath;
9816 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9817 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9818 UniversalCRTLibPath.c_str()));
9819 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009820 }
9821
9822 std::string WindowsSdkLibPath;
9823 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9824 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9825 WindowsSdkLibPath.c_str()));
9826 }
9827
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009828 CmdArgs.push_back("-nologo");
9829
Reid Kleckner124955a2015-08-05 18:51:13 +00009830 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009831 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009832
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009833 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009834 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009835 if (DLL) {
9836 CmdArgs.push_back(Args.MakeArgString("-dll"));
9837
9838 SmallString<128> ImplibName(Output.getFilename());
9839 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009840 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009841 }
9842
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009843 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009844 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009845 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009846 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009847 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9848 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009849 // Make sure the dynamic runtime thunk is not optimized out at link time
9850 // to ensure proper SEH handling.
9851 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009852 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009853 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009854 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009855 for (const auto &Lib : {"asan", "asan_cxx"})
9856 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009857 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009858 }
9859
Hans Wennborg2e274592013-08-13 23:38:57 +00009860 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009861
Alexey Bataevc7e84352015-08-19 04:49:01 +00009862 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9863 options::OPT_fno_openmp, false)) {
9864 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9865 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9866 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9867 TC.getDriver().Dir + "/../lib"));
9868 switch (getOpenMPRuntime(getToolChain(), Args)) {
9869 case OMPRT_OMP:
9870 CmdArgs.push_back("-defaultlib:libomp.lib");
9871 break;
9872 case OMPRT_IOMP5:
9873 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9874 break;
9875 case OMPRT_GOMP:
9876 break;
9877 case OMPRT_Unknown:
9878 // Already diagnosed.
9879 break;
9880 }
9881 }
9882
Andrey Turetskiya4868572016-03-14 11:19:43 +00009883 // Add compiler-rt lib in case if it was explicitly
9884 // specified as an argument for --rtlib option.
9885 if (!Args.hasArg(options::OPT_nostdlib)) {
9886 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9887 }
9888
Reid Kleckner337188f2014-09-16 19:22:00 +00009889 // Add filenames, libraries, and other linker inputs.
9890 for (const auto &Input : Inputs) {
9891 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009892 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009893 continue;
9894 }
9895
9896 const Arg &A = Input.getInputArg();
9897
9898 // Render -l options differently for the MSVC linker.
9899 if (A.getOption().matches(options::OPT_l)) {
9900 StringRef Lib = A.getValue();
9901 const char *LinkLibArg;
9902 if (Lib.endswith(".lib"))
9903 LinkLibArg = Args.MakeArgString(Lib);
9904 else
9905 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9906 CmdArgs.push_back(LinkLibArg);
9907 continue;
9908 }
9909
9910 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9911 // or -L. Render it, even if MSVC doesn't understand it.
9912 A.renderAsInput(Args, CmdArgs);
9913 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009914
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009915 TC.addProfileRTLibs(Args, CmdArgs);
9916
Zachary Turner719f58c2014-12-01 23:06:47 +00009917 // We need to special case some linker paths. In the case of lld, we need to
9918 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9919 // linker, we need to use a special search algorithm.
9920 llvm::SmallString<128> linkPath;
9921 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9922 if (Linker.equals_lower("lld"))
9923 Linker = "lld-link";
9924
9925 if (Linker.equals_lower("link")) {
9926 // If we're using the MSVC linker, it's not sufficient to just use link
9927 // from the program PATH, because other environments like GnuWin32 install
9928 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009929 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009930 C.getDriver().getClangProgramPath());
9931 } else {
9932 linkPath = Linker;
9933 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009934 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009935 }
9936
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009937 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009938 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009939}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009940
Douglas Katzman95354292015-06-23 20:42:09 +00009941void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9942 const InputInfo &Output,
9943 const InputInfoList &Inputs,
9944 const ArgList &Args,
9945 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009946 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9947}
9948
Douglas Katzman95354292015-06-23 20:42:09 +00009949std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009950 Compilation &C, const JobAction &JA, const InputInfo &Output,
9951 const InputInfoList &Inputs, const ArgList &Args,
9952 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009953 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009954 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009955 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009956 CmdArgs.push_back("/W0"); // No warnings.
9957
9958 // The goal is to be able to invoke this tool correctly based on
9959 // any flag accepted by clang-cl.
9960
9961 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009962 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009963
9964 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009965 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9966 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9967 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009968 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9969 if (A->getOption().getID() == options::OPT_O0) {
9970 CmdArgs.push_back("/Od");
9971 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009972 CmdArgs.push_back("/Og");
9973
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009974 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009975 if (OptLevel == "s" || OptLevel == "z")
9976 CmdArgs.push_back("/Os");
9977 else
9978 CmdArgs.push_back("/Ot");
9979
9980 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009981 }
9982 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009983 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9984 options::OPT_fno_omit_frame_pointer))
9985 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9986 ? "/Oy"
9987 : "/Oy-");
9988 if (!Args.hasArg(options::OPT_fwritable_strings))
9989 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009990
Nico Weber3f8dafb2015-03-12 19:37:10 +00009991 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009992 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9993
David Majnemerf6072342014-07-01 22:24:56 +00009994 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9995 /*default=*/false))
9996 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009997 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9998 options::OPT_fno_function_sections))
9999 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
10000 ? "/Gy"
10001 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +000010002 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
10003 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +000010004 CmdArgs.push_back(
10005 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010006 if (Args.hasArg(options::OPT_fsyntax_only))
10007 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +000010008 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
10009 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +000010010 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +000010011
Nico Weber3f8dafb2015-03-12 19:37:10 +000010012 std::vector<std::string> Includes =
10013 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010014 for (const auto &Include : Includes)
10015 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +000010016
Hans Wennborg87cfa712013-09-19 20:32:16 +000010017 // Flags that can simply be passed through.
10018 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10019 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +000010020 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10021 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +000010022 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +000010023 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010024
10025 // The order of these flags is relevant, so pick the last one.
10026 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10027 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10028 A->render(Args, CmdArgs);
10029
Ehsan Akhgarid8518332016-01-25 21:14:52 +000010030 // Pass through all unknown arguments so that the fallback command can see
10031 // them too.
10032 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10033
Hans Wennborg87cfa712013-09-19 20:32:16 +000010034 // Input filename.
10035 assert(Inputs.size() == 1);
10036 const InputInfo &II = Inputs[0];
10037 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10038 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10039 if (II.isFilename())
10040 CmdArgs.push_back(II.getFilename());
10041 else
10042 II.getInputArg().renderAsInput(Args, CmdArgs);
10043
10044 // Output filename.
10045 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010046 const char *Fo =
10047 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010048 CmdArgs.push_back(Fo);
10049
Hans Wennborg188382e2013-09-20 18:16:35 +000010050 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010051 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10052 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010053 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010054 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010055}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010056
Yaron Keren1c0070c2015-07-02 04:45:27 +000010057/// MinGW Tools
10058void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10059 const InputInfo &Output,
10060 const InputInfoList &Inputs,
10061 const ArgList &Args,
10062 const char *LinkingOutput) const {
10063 claimNoWarnArgs(Args);
10064 ArgStringList CmdArgs;
10065
10066 if (getToolChain().getArch() == llvm::Triple::x86) {
10067 CmdArgs.push_back("--32");
10068 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10069 CmdArgs.push_back("--64");
10070 }
10071
10072 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10073
10074 CmdArgs.push_back("-o");
10075 CmdArgs.push_back(Output.getFilename());
10076
10077 for (const auto &II : Inputs)
10078 CmdArgs.push_back(II.getFilename());
10079
10080 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010081 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010082
10083 if (Args.hasArg(options::OPT_gsplit_dwarf))
10084 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10085 SplitDebugName(Args, Inputs[0]));
10086}
10087
10088void MinGW::Linker::AddLibGCC(const ArgList &Args,
10089 ArgStringList &CmdArgs) const {
10090 if (Args.hasArg(options::OPT_mthreads))
10091 CmdArgs.push_back("-lmingwthrd");
10092 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010093
Yaron Kerenaa281332015-08-09 00:24:07 +000010094 // Make use of compiler-rt if --rtlib option is used
10095 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10096 if (RLT == ToolChain::RLT_Libgcc) {
10097 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10098 Args.hasArg(options::OPT_static);
10099 bool Shared = Args.hasArg(options::OPT_shared);
10100 bool CXX = getToolChain().getDriver().CCCIsCXX();
10101
10102 if (Static || (!CXX && !Shared)) {
10103 CmdArgs.push_back("-lgcc");
10104 CmdArgs.push_back("-lgcc_eh");
10105 } else {
10106 CmdArgs.push_back("-lgcc_s");
10107 CmdArgs.push_back("-lgcc");
10108 }
10109 } else {
10110 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10111 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010112
Yaron Keren1c0070c2015-07-02 04:45:27 +000010113 CmdArgs.push_back("-lmoldname");
10114 CmdArgs.push_back("-lmingwex");
10115 CmdArgs.push_back("-lmsvcrt");
10116}
10117
10118void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10119 const InputInfo &Output,
10120 const InputInfoList &Inputs,
10121 const ArgList &Args,
10122 const char *LinkingOutput) const {
10123 const ToolChain &TC = getToolChain();
10124 const Driver &D = TC.getDriver();
10125 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10126
10127 ArgStringList CmdArgs;
10128
10129 // Silence warning for "clang -g foo.o -o foo"
10130 Args.ClaimAllArgs(options::OPT_g_Group);
10131 // and "clang -emit-llvm foo.o -o foo"
10132 Args.ClaimAllArgs(options::OPT_emit_llvm);
10133 // and for "clang -w foo.o -o foo". Other warning options are already
10134 // handled somewhere else.
10135 Args.ClaimAllArgs(options::OPT_w);
10136
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010137 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10138 if (LinkerName.equals_lower("lld")) {
10139 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010140 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010141 } else if (!LinkerName.equals_lower("ld")) {
10142 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010143 }
10144
Yaron Keren1c0070c2015-07-02 04:45:27 +000010145 if (!D.SysRoot.empty())
10146 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10147
10148 if (Args.hasArg(options::OPT_s))
10149 CmdArgs.push_back("-s");
10150
10151 CmdArgs.push_back("-m");
10152 if (TC.getArch() == llvm::Triple::x86)
10153 CmdArgs.push_back("i386pe");
10154 if (TC.getArch() == llvm::Triple::x86_64)
10155 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010156 if (TC.getArch() == llvm::Triple::arm)
10157 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010158
10159 if (Args.hasArg(options::OPT_mwindows)) {
10160 CmdArgs.push_back("--subsystem");
10161 CmdArgs.push_back("windows");
10162 } else if (Args.hasArg(options::OPT_mconsole)) {
10163 CmdArgs.push_back("--subsystem");
10164 CmdArgs.push_back("console");
10165 }
10166
10167 if (Args.hasArg(options::OPT_static))
10168 CmdArgs.push_back("-Bstatic");
10169 else {
10170 if (Args.hasArg(options::OPT_mdll))
10171 CmdArgs.push_back("--dll");
10172 else if (Args.hasArg(options::OPT_shared))
10173 CmdArgs.push_back("--shared");
10174 CmdArgs.push_back("-Bdynamic");
10175 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10176 CmdArgs.push_back("-e");
10177 if (TC.getArch() == llvm::Triple::x86)
10178 CmdArgs.push_back("_DllMainCRTStartup@12");
10179 else
10180 CmdArgs.push_back("DllMainCRTStartup");
10181 CmdArgs.push_back("--enable-auto-image-base");
10182 }
10183 }
10184
10185 CmdArgs.push_back("-o");
10186 CmdArgs.push_back(Output.getFilename());
10187
10188 Args.AddAllArgs(CmdArgs, options::OPT_e);
10189 // FIXME: add -N, -n flags
10190 Args.AddLastArg(CmdArgs, options::OPT_r);
10191 Args.AddLastArg(CmdArgs, options::OPT_s);
10192 Args.AddLastArg(CmdArgs, options::OPT_t);
10193 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10194 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10195
Douglas Katzman78b37b02015-11-17 20:28:07 +000010196 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010197 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10198 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10199 } else {
10200 if (Args.hasArg(options::OPT_municode))
10201 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10202 else
10203 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10204 }
10205 if (Args.hasArg(options::OPT_pg))
10206 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10207 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10208 }
10209
10210 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010211 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010212 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10213
10214 // TODO: Add ASan stuff here
10215
10216 // TODO: Add profile stuff here
10217
Douglas Katzman78b37b02015-11-17 20:28:07 +000010218 if (D.CCCIsCXX() &&
10219 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010220 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10221 !Args.hasArg(options::OPT_static);
10222 if (OnlyLibstdcxxStatic)
10223 CmdArgs.push_back("-Bstatic");
10224 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10225 if (OnlyLibstdcxxStatic)
10226 CmdArgs.push_back("-Bdynamic");
10227 }
10228
10229 if (!Args.hasArg(options::OPT_nostdlib)) {
10230 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10231 if (Args.hasArg(options::OPT_static))
10232 CmdArgs.push_back("--start-group");
10233
10234 if (Args.hasArg(options::OPT_fstack_protector) ||
10235 Args.hasArg(options::OPT_fstack_protector_strong) ||
10236 Args.hasArg(options::OPT_fstack_protector_all)) {
10237 CmdArgs.push_back("-lssp_nonshared");
10238 CmdArgs.push_back("-lssp");
10239 }
10240 if (Args.hasArg(options::OPT_fopenmp))
10241 CmdArgs.push_back("-lgomp");
10242
10243 AddLibGCC(Args, CmdArgs);
10244
10245 if (Args.hasArg(options::OPT_pg))
10246 CmdArgs.push_back("-lgmon");
10247
Yaron Kerenadce68e2015-07-06 18:52:19 +000010248 if (Args.hasArg(options::OPT_pthread))
10249 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010250
10251 // add system libraries
10252 if (Args.hasArg(options::OPT_mwindows)) {
10253 CmdArgs.push_back("-lgdi32");
10254 CmdArgs.push_back("-lcomdlg32");
10255 }
10256 CmdArgs.push_back("-ladvapi32");
10257 CmdArgs.push_back("-lshell32");
10258 CmdArgs.push_back("-luser32");
10259 CmdArgs.push_back("-lkernel32");
10260
10261 if (Args.hasArg(options::OPT_static))
10262 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010263 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010264 AddLibGCC(Args, CmdArgs);
10265 }
10266
10267 if (!Args.hasArg(options::OPT_nostartfiles)) {
10268 // Add crtfastmath.o if available and fast math is enabled.
10269 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10270
10271 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10272 }
10273 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010274 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010275 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010276}
10277
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010278/// XCore Tools
10279// We pass assemble and link construction to the xcc tool.
10280
Douglas Katzman95354292015-06-23 20:42:09 +000010281void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10282 const InputInfo &Output,
10283 const InputInfoList &Inputs,
10284 const ArgList &Args,
10285 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010286 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010287 ArgStringList CmdArgs;
10288
10289 CmdArgs.push_back("-o");
10290 CmdArgs.push_back(Output.getFilename());
10291
10292 CmdArgs.push_back("-c");
10293
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010294 if (Args.hasArg(options::OPT_v))
10295 CmdArgs.push_back("-v");
10296
Robert Lytton894d25c2014-05-02 09:33:25 +000010297 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10298 if (!A->getOption().matches(options::OPT_g0))
10299 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010300
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010301 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10302 false))
10303 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010304
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010305 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010306
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010307 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010308 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010309
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010310 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010311 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010312}
10313
Douglas Katzman95354292015-06-23 20:42:09 +000010314void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10315 const InputInfo &Output,
10316 const InputInfoList &Inputs,
10317 const ArgList &Args,
10318 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010319 ArgStringList CmdArgs;
10320
10321 if (Output.isFilename()) {
10322 CmdArgs.push_back("-o");
10323 CmdArgs.push_back(Output.getFilename());
10324 } else {
10325 assert(Output.isNothing() && "Invalid output.");
10326 }
10327
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010328 if (Args.hasArg(options::OPT_v))
10329 CmdArgs.push_back("-v");
10330
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010331 // Pass -fexceptions through to the linker if it was present.
10332 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10333 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010334 CmdArgs.push_back("-fexceptions");
10335
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010336 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10337
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010338 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010339 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010340}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010341
Douglas Katzman95354292015-06-23 20:42:09 +000010342void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10343 const InputInfo &Output,
10344 const InputInfoList &Inputs,
10345 const ArgList &Args,
10346 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010347 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010348 const auto &TC =
10349 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10350 ArgStringList CmdArgs;
10351 const char *Exec;
10352
10353 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010354 default:
10355 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010356 case llvm::Triple::arm:
10357 case llvm::Triple::thumb:
10358 break;
10359 case llvm::Triple::x86:
10360 CmdArgs.push_back("--32");
10361 break;
10362 case llvm::Triple::x86_64:
10363 CmdArgs.push_back("--64");
10364 break;
10365 }
10366
10367 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10368
10369 CmdArgs.push_back("-o");
10370 CmdArgs.push_back(Output.getFilename());
10371
10372 for (const auto &Input : Inputs)
10373 CmdArgs.push_back(Input.getFilename());
10374
10375 const std::string Assembler = TC.GetProgramPath("as");
10376 Exec = Args.MakeArgString(Assembler);
10377
Justin Bognerd3371d82015-07-17 03:35:54 +000010378 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010379}
10380
Douglas Katzman95354292015-06-23 20:42:09 +000010381void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10382 const InputInfo &Output,
10383 const InputInfoList &Inputs,
10384 const ArgList &Args,
10385 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010386 const auto &TC =
10387 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10388 const llvm::Triple &T = TC.getTriple();
10389 const Driver &D = TC.getDriver();
10390 SmallString<128> EntryPoint;
10391 ArgStringList CmdArgs;
10392 const char *Exec;
10393
10394 // Silence warning for "clang -g foo.o -o foo"
10395 Args.ClaimAllArgs(options::OPT_g_Group);
10396 // and "clang -emit-llvm foo.o -o foo"
10397 Args.ClaimAllArgs(options::OPT_emit_llvm);
10398 // and for "clang -w foo.o -o foo"
10399 Args.ClaimAllArgs(options::OPT_w);
10400 // Other warning options are already handled somewhere else.
10401
10402 if (!D.SysRoot.empty())
10403 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10404
10405 if (Args.hasArg(options::OPT_pie))
10406 CmdArgs.push_back("-pie");
10407 if (Args.hasArg(options::OPT_rdynamic))
10408 CmdArgs.push_back("-export-dynamic");
10409 if (Args.hasArg(options::OPT_s))
10410 CmdArgs.push_back("--strip-all");
10411
10412 CmdArgs.push_back("-m");
10413 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010414 default:
10415 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010416 case llvm::Triple::arm:
10417 case llvm::Triple::thumb:
10418 // FIXME: this is incorrect for WinCE
10419 CmdArgs.push_back("thumb2pe");
10420 break;
10421 case llvm::Triple::x86:
10422 CmdArgs.push_back("i386pe");
10423 EntryPoint.append("_");
10424 break;
10425 case llvm::Triple::x86_64:
10426 CmdArgs.push_back("i386pep");
10427 break;
10428 }
10429
10430 if (Args.hasArg(options::OPT_shared)) {
10431 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010432 default:
10433 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010434 case llvm::Triple::arm:
10435 case llvm::Triple::thumb:
10436 case llvm::Triple::x86_64:
10437 EntryPoint.append("_DllMainCRTStartup");
10438 break;
10439 case llvm::Triple::x86:
10440 EntryPoint.append("_DllMainCRTStartup@12");
10441 break;
10442 }
10443
10444 CmdArgs.push_back("-shared");
10445 CmdArgs.push_back("-Bdynamic");
10446
10447 CmdArgs.push_back("--enable-auto-image-base");
10448
10449 CmdArgs.push_back("--entry");
10450 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10451 } else {
10452 EntryPoint.append("mainCRTStartup");
10453
10454 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10455 : "-Bdynamic");
10456
Douglas Katzman78b37b02015-11-17 20:28:07 +000010457 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010458 CmdArgs.push_back("--entry");
10459 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10460 }
10461
10462 // FIXME: handle subsystem
10463 }
10464
10465 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010466 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010467
10468 CmdArgs.push_back("-o");
10469 CmdArgs.push_back(Output.getFilename());
10470
10471 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10472 SmallString<261> ImpLib(Output.getFilename());
10473 llvm::sys::path::replace_extension(ImpLib, ".lib");
10474
10475 CmdArgs.push_back("--out-implib");
10476 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10477 }
10478
Douglas Katzman78b37b02015-11-17 20:28:07 +000010479 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010480 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10481 const char *CRTBegin;
10482
10483 CRTBegin =
10484 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10485 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10486 }
10487
10488 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010489 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010490 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10491
10492 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10493 !Args.hasArg(options::OPT_nodefaultlibs)) {
10494 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10495 !Args.hasArg(options::OPT_static);
10496 if (StaticCXX)
10497 CmdArgs.push_back("-Bstatic");
10498 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10499 if (StaticCXX)
10500 CmdArgs.push_back("-Bdynamic");
10501 }
10502
10503 if (!Args.hasArg(options::OPT_nostdlib)) {
10504 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10505 // TODO handle /MT[d] /MD[d]
10506 CmdArgs.push_back("-lmsvcrt");
10507 AddRunTimeLibs(TC, D, CmdArgs, Args);
10508 }
10509 }
10510
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010511 if (TC.getSanitizerArgs().needsAsanRt()) {
10512 // TODO handle /MT[d] /MD[d]
10513 if (Args.hasArg(options::OPT_shared)) {
10514 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10515 } else {
10516 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10517 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010518 // Make sure the dynamic runtime thunk is not optimized out at link time
10519 // to ensure proper SEH handling.
10520 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10521 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10522 ? "___asan_seh_interceptor"
10523 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010524 }
10525 }
10526
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010527 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010528
Justin Bognerd3371d82015-07-17 03:35:54 +000010529 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010530}
Douglas Katzman84a75642015-06-19 14:55:19 +000010531
Douglas Katzman95354292015-06-23 20:42:09 +000010532void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10533 const InputInfo &Output,
10534 const InputInfoList &Inputs,
10535 const ArgList &Args,
10536 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010537 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010538 assert(Inputs.size() == 1);
10539 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010540 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10541 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010542
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010543 if (JA.getKind() == Action::PreprocessJobClass) {
10544 Args.ClaimAllArgs();
10545 CmdArgs.push_back("-E");
10546 } else {
10547 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10548 CmdArgs.push_back("-S");
10549 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10550 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010551 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010552
Douglas Katzmanf6071112015-08-03 14:34:22 +000010553 // Append all -I, -iquote, -isystem paths, defines/undefines,
10554 // 'f' flags, optimize flags, and warning options.
10555 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010556 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010557 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010558 options::OPT_f_Group, options::OPT_f_clang_Group,
10559 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010560 options::OPT_O_Group, options::OPT_W_Group,
10561 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010562
10563 // If we're producing a dependency file, and assembly is the final action,
10564 // then the name of the target in the dependency file should be the '.o'
10565 // file, not the '.s' file produced by this step. For example, instead of
10566 // /tmp/mumble.s: mumble.c .../someheader.h
10567 // the filename on the lefthand side should be "mumble.o"
10568 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10569 C.getActions().size() == 1 &&
10570 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10571 Arg *A = Args.getLastArg(options::OPT_o);
10572 if (A) {
10573 CmdArgs.push_back("-MT");
10574 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10575 }
10576 }
10577
Douglas Katzman84a75642015-06-19 14:55:19 +000010578 CmdArgs.push_back(II.getFilename());
10579 CmdArgs.push_back("-o");
10580 CmdArgs.push_back(Output.getFilename());
10581
10582 std::string Exec =
10583 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010584 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10585 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010586}
10587
Douglas Katzman95354292015-06-23 20:42:09 +000010588void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10589 const InputInfo &Output,
10590 const InputInfoList &Inputs,
10591 const ArgList &Args,
10592 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010593 ArgStringList CmdArgs;
10594
10595 assert(Inputs.size() == 1);
10596 const InputInfo &II = Inputs[0];
10597 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10598 assert(Output.getType() == types::TY_Object);
10599
10600 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010601 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10602 if (CPUArg)
10603 CmdArgs.push_back(
10604 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010605 CmdArgs.push_back("-noSPrefixing");
10606 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010607 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10608 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10609 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010610 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010611 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010612 }
10613 CmdArgs.push_back("-elf"); // Output format.
10614 CmdArgs.push_back(II.getFilename());
10615 CmdArgs.push_back(
10616 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10617
10618 std::string Exec =
10619 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010620 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10621 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010622}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010623
10624void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10625 const InputInfo &Output,
10626 const InputInfoList &Inputs,
10627 const ArgList &Args,
10628 const char *LinkingOutput) const {
10629 const auto &TC =
10630 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10631 const llvm::Triple &T = TC.getTriple();
10632 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010633 bool UseStartfiles =
10634 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010635 bool UseDefaultLibs =
10636 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010637
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010638 if (T.getArch() == llvm::Triple::sparc)
10639 CmdArgs.push_back("-EB");
10640 else // SHAVE assumes little-endian, and sparcel is expressly so.
10641 CmdArgs.push_back("-EL");
10642
10643 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10644 // but we never pass through a --sysroot option and various other bits.
10645 // For example, there are no sanitizers (yet) nor gold linker.
10646
10647 // Eat some arguments that may be present but have no effect.
10648 Args.ClaimAllArgs(options::OPT_g_Group);
10649 Args.ClaimAllArgs(options::OPT_w);
10650 Args.ClaimAllArgs(options::OPT_static_libgcc);
10651
10652 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10653 CmdArgs.push_back("-s");
10654
10655 CmdArgs.push_back("-o");
10656 CmdArgs.push_back(Output.getFilename());
10657
10658 if (UseStartfiles) {
10659 // If you want startfiles, it means you want the builtin crti and crtbegin,
10660 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010661 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10662 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010663 }
10664
10665 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10666 options::OPT_e, options::OPT_s, options::OPT_t,
10667 options::OPT_Z_Flag, options::OPT_r});
10668
Douglas Katzman674a3122015-11-18 16:24:46 +000010669 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010670
10671 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10672
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010673 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010674 if (C.getDriver().CCCIsCXX())
10675 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010676 if (T.getOS() == llvm::Triple::RTEMS) {
10677 CmdArgs.push_back("--start-group");
10678 CmdArgs.push_back("-lc");
10679 // You must provide your own "-L" option to enable finding these.
10680 CmdArgs.push_back("-lrtemscpu");
10681 CmdArgs.push_back("-lrtemsbsp");
10682 CmdArgs.push_back("--end-group");
10683 } else {
10684 CmdArgs.push_back("-lc");
10685 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010686 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010687 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010688 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010689 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10690 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010691 }
10692
10693 std::string Exec =
10694 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10695 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10696 CmdArgs, Inputs));
10697}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010698
10699void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10700 const InputInfo &Output,
10701 const InputInfoList &Inputs,
10702 const ArgList &Args,
10703 const char *LinkingOutput) const {
10704 claimNoWarnArgs(Args);
10705 ArgStringList CmdArgs;
10706
10707 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10708
10709 CmdArgs.push_back("-o");
10710 CmdArgs.push_back(Output.getFilename());
10711
10712 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10713 const InputInfo &Input = Inputs[0];
10714 assert(Input.isFilename() && "Invalid input.");
10715 CmdArgs.push_back(Input.getFilename());
10716
10717 const char *Exec =
Paul Robinson9d613612016-05-16 17:22:25 +000010718 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010719 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10720}
10721
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010722static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10723 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10724 if (SanArgs.needsUbsanRt()) {
10725 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10726 }
10727 if (SanArgs.needsAsanRt()) {
10728 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10729 }
10730}
10731
10732static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10733 const JobAction &JA, const InputInfo &Output,
10734 const InputInfoList &Inputs,
10735 const ArgList &Args,
10736 const char *LinkingOutput) {
10737 const toolchains::FreeBSD &ToolChain =
10738 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10739 const Driver &D = ToolChain.getDriver();
10740 ArgStringList CmdArgs;
10741
10742 // Silence warning for "clang -g foo.o -o foo"
10743 Args.ClaimAllArgs(options::OPT_g_Group);
10744 // and "clang -emit-llvm foo.o -o foo"
10745 Args.ClaimAllArgs(options::OPT_emit_llvm);
10746 // and for "clang -w foo.o -o foo". Other warning options are already
10747 // handled somewhere else.
10748 Args.ClaimAllArgs(options::OPT_w);
10749
10750 if (!D.SysRoot.empty())
10751 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10752
10753 if (Args.hasArg(options::OPT_pie))
10754 CmdArgs.push_back("-pie");
10755
10756 if (Args.hasArg(options::OPT_rdynamic))
10757 CmdArgs.push_back("-export-dynamic");
10758 if (Args.hasArg(options::OPT_shared))
10759 CmdArgs.push_back("--oformat=so");
10760
10761 if (Output.isFilename()) {
10762 CmdArgs.push_back("-o");
10763 CmdArgs.push_back(Output.getFilename());
10764 } else {
10765 assert(Output.isNothing() && "Invalid output.");
10766 }
10767
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010768 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10769
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010770 Args.AddAllArgs(CmdArgs, options::OPT_L);
10771 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10772 Args.AddAllArgs(CmdArgs, options::OPT_e);
10773 Args.AddAllArgs(CmdArgs, options::OPT_s);
10774 Args.AddAllArgs(CmdArgs, options::OPT_t);
10775 Args.AddAllArgs(CmdArgs, options::OPT_r);
10776
10777 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10778 CmdArgs.push_back("--no-demangle");
10779
10780 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10781
10782 if (Args.hasArg(options::OPT_pthread)) {
10783 CmdArgs.push_back("-lpthread");
10784 }
10785
Paul Robinson9d613612016-05-16 17:22:25 +000010786 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010787
10788 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10789}
10790
10791static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10792 const JobAction &JA, const InputInfo &Output,
10793 const InputInfoList &Inputs,
10794 const ArgList &Args,
10795 const char *LinkingOutput) {
10796 const toolchains::FreeBSD &ToolChain =
10797 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10798 const Driver &D = ToolChain.getDriver();
10799 ArgStringList CmdArgs;
10800
10801 // Silence warning for "clang -g foo.o -o foo"
10802 Args.ClaimAllArgs(options::OPT_g_Group);
10803 // and "clang -emit-llvm foo.o -o foo"
10804 Args.ClaimAllArgs(options::OPT_emit_llvm);
10805 // and for "clang -w foo.o -o foo". Other warning options are already
10806 // handled somewhere else.
10807 Args.ClaimAllArgs(options::OPT_w);
10808
10809 if (!D.SysRoot.empty())
10810 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10811
10812 if (Args.hasArg(options::OPT_pie))
10813 CmdArgs.push_back("-pie");
10814
10815 if (Args.hasArg(options::OPT_static)) {
10816 CmdArgs.push_back("-Bstatic");
10817 } else {
10818 if (Args.hasArg(options::OPT_rdynamic))
10819 CmdArgs.push_back("-export-dynamic");
10820 CmdArgs.push_back("--eh-frame-hdr");
10821 if (Args.hasArg(options::OPT_shared)) {
10822 CmdArgs.push_back("-Bshareable");
10823 } else {
10824 CmdArgs.push_back("-dynamic-linker");
10825 CmdArgs.push_back("/libexec/ld-elf.so.1");
10826 }
10827 CmdArgs.push_back("--enable-new-dtags");
10828 }
10829
10830 if (Output.isFilename()) {
10831 CmdArgs.push_back("-o");
10832 CmdArgs.push_back(Output.getFilename());
10833 } else {
10834 assert(Output.isNothing() && "Invalid output.");
10835 }
10836
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010837 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10838
Douglas Katzman78b37b02015-11-17 20:28:07 +000010839 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010840 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010841 if (!Args.hasArg(options::OPT_shared)) {
10842 if (Args.hasArg(options::OPT_pg))
10843 crt1 = "gcrt1.o";
10844 else if (Args.hasArg(options::OPT_pie))
10845 crt1 = "Scrt1.o";
10846 else
10847 crt1 = "crt1.o";
10848 }
10849 if (crt1)
10850 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10851
10852 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10853
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010854 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010855 if (Args.hasArg(options::OPT_static))
10856 crtbegin = "crtbeginT.o";
10857 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10858 crtbegin = "crtbeginS.o";
10859 else
10860 crtbegin = "crtbegin.o";
10861
10862 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10863 }
10864
10865 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010866 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010867 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10868 Args.AddAllArgs(CmdArgs, options::OPT_e);
10869 Args.AddAllArgs(CmdArgs, options::OPT_s);
10870 Args.AddAllArgs(CmdArgs, options::OPT_t);
10871 Args.AddAllArgs(CmdArgs, options::OPT_r);
10872
10873 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10874 CmdArgs.push_back("--no-demangle");
10875
10876 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10877
Douglas Katzman78b37b02015-11-17 20:28:07 +000010878 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010879 // For PS4, we always want to pass libm, libstdc++ and libkernel
10880 // libraries for both C and C++ compilations.
10881 CmdArgs.push_back("-lkernel");
10882 if (D.CCCIsCXX()) {
10883 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10884 if (Args.hasArg(options::OPT_pg))
10885 CmdArgs.push_back("-lm_p");
10886 else
10887 CmdArgs.push_back("-lm");
10888 }
10889 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10890 // the default system libraries. Just mimic this for now.
10891 if (Args.hasArg(options::OPT_pg))
10892 CmdArgs.push_back("-lgcc_p");
10893 else
10894 CmdArgs.push_back("-lcompiler_rt");
10895 if (Args.hasArg(options::OPT_static)) {
10896 CmdArgs.push_back("-lstdc++");
10897 } else if (Args.hasArg(options::OPT_pg)) {
10898 CmdArgs.push_back("-lgcc_eh_p");
10899 } else {
10900 CmdArgs.push_back("--as-needed");
10901 CmdArgs.push_back("-lstdc++");
10902 CmdArgs.push_back("--no-as-needed");
10903 }
10904
10905 if (Args.hasArg(options::OPT_pthread)) {
10906 if (Args.hasArg(options::OPT_pg))
10907 CmdArgs.push_back("-lpthread_p");
10908 else
10909 CmdArgs.push_back("-lpthread");
10910 }
10911
10912 if (Args.hasArg(options::OPT_pg)) {
10913 if (Args.hasArg(options::OPT_shared))
10914 CmdArgs.push_back("-lc");
10915 else {
10916 if (Args.hasArg(options::OPT_static)) {
10917 CmdArgs.push_back("--start-group");
10918 CmdArgs.push_back("-lc_p");
10919 CmdArgs.push_back("-lpthread_p");
10920 CmdArgs.push_back("--end-group");
10921 } else {
10922 CmdArgs.push_back("-lc_p");
10923 }
10924 }
10925 CmdArgs.push_back("-lgcc_p");
10926 } else {
10927 if (Args.hasArg(options::OPT_static)) {
10928 CmdArgs.push_back("--start-group");
10929 CmdArgs.push_back("-lc");
10930 CmdArgs.push_back("-lpthread");
10931 CmdArgs.push_back("--end-group");
10932 } else {
10933 CmdArgs.push_back("-lc");
10934 }
10935 CmdArgs.push_back("-lcompiler_rt");
10936 }
10937
10938 if (Args.hasArg(options::OPT_static)) {
10939 CmdArgs.push_back("-lstdc++");
10940 } else if (Args.hasArg(options::OPT_pg)) {
10941 CmdArgs.push_back("-lgcc_eh_p");
10942 } else {
10943 CmdArgs.push_back("--as-needed");
10944 CmdArgs.push_back("-lstdc++");
10945 CmdArgs.push_back("--no-as-needed");
10946 }
10947 }
10948
Douglas Katzman78b37b02015-11-17 20:28:07 +000010949 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010950 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10951 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10952 else
10953 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10954 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10955 }
10956
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010957 const char *Exec =
10958#ifdef LLVM_ON_WIN32
Paul Robinson9d613612016-05-16 17:22:25 +000010959 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010960#else
Paul Robinson9d613612016-05-16 17:22:25 +000010961 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010962#endif
10963
10964 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10965}
10966
10967void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10968 const InputInfo &Output,
10969 const InputInfoList &Inputs,
10970 const ArgList &Args,
10971 const char *LinkingOutput) const {
10972 const toolchains::FreeBSD &ToolChain =
10973 static_cast<const toolchains::FreeBSD &>(getToolChain());
10974 const Driver &D = ToolChain.getDriver();
10975 bool PS4Linker;
10976 StringRef LinkerOptName;
10977 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10978 LinkerOptName = A->getValue();
10979 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10980 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10981 }
10982
10983 if (LinkerOptName == "gold")
10984 PS4Linker = false;
10985 else if (LinkerOptName == "ps4")
10986 PS4Linker = true;
10987 else
10988 PS4Linker = !Args.hasArg(options::OPT_shared);
10989
10990 if (PS4Linker)
10991 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10992 else
10993 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10994}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010995
10996void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10997 const InputInfo &Output,
10998 const InputInfoList &Inputs,
10999 const ArgList &Args,
11000 const char *LinkingOutput) const {
11001 const auto &TC =
11002 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011003 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011004
11005 std::vector<std::string> gpu_archs =
11006 Args.getAllArgValues(options::OPT_march_EQ);
11007 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
11008 const std::string& gpu_arch = gpu_archs[0];
11009
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011010 ArgStringList CmdArgs;
11011 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000011012 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
11013 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000011014 // ptxas does not accept -g option if optimization is enabled, so
11015 // we ignore the compiler's -O* options if we want debug info.
11016 CmdArgs.push_back("-g");
11017 CmdArgs.push_back("--dont-merge-basicblocks");
11018 CmdArgs.push_back("--return-at-end");
11019 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11020 // Map the -O we received to -O{0,1,2,3}.
11021 //
11022 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11023 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011024
Justin Lebar2836dcd2016-01-19 19:52:21 +000011025 // -O3 seems like the least-bad option when -Osomething is specified to
11026 // clang but it isn't handled below.
11027 StringRef OOpt = "3";
11028 if (A->getOption().matches(options::OPT_O4) ||
11029 A->getOption().matches(options::OPT_Ofast))
11030 OOpt = "3";
11031 else if (A->getOption().matches(options::OPT_O0))
11032 OOpt = "0";
11033 else if (A->getOption().matches(options::OPT_O)) {
11034 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11035 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11036 .Case("1", "1")
11037 .Case("2", "2")
11038 .Case("3", "3")
11039 .Case("s", "2")
11040 .Case("z", "2")
11041 .Default("2");
11042 }
11043 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11044 } else {
11045 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11046 // to no optimizations, but ptxas's default is -O3.
11047 CmdArgs.push_back("-O0");
11048 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011049
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011050 CmdArgs.push_back("--gpu-name");
11051 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11052 CmdArgs.push_back("--output-file");
11053 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11054 for (const auto& II : Inputs)
11055 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11056
11057 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11058 CmdArgs.push_back(Args.MakeArgString(A));
11059
11060 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11061 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11062}
11063
11064// All inputs to this linker must be from CudaDeviceActions, as we need to look
11065// at the Inputs' Actions in order to figure out which GPU architecture they
11066// correspond to.
11067void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11068 const InputInfo &Output,
11069 const InputInfoList &Inputs,
11070 const ArgList &Args,
11071 const char *LinkingOutput) const {
11072 const auto &TC =
11073 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011074 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011075
11076 ArgStringList CmdArgs;
11077 CmdArgs.push_back("--cuda");
11078 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11079 CmdArgs.push_back(Args.MakeArgString("--create"));
11080 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11081
11082 for (const auto& II : Inputs) {
11083 auto* A = cast<const CudaDeviceAction>(II.getAction());
11084 // We need to pass an Arch of the form "sm_XX" for cubin files and
11085 // "compute_XX" for ptx.
11086 const char *Arch = (II.getType() == types::TY_PP_Asm)
11087 ? A->getComputeArchName()
11088 : A->getGpuArchName();
11089 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11090 Arch + ",file=" + II.getFilename()));
11091 }
11092
11093 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11094 CmdArgs.push_back(Args.MakeArgString(A));
11095
11096 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11097 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11098}