blob: 2c1ac8a9b8451157778ee186817e94665f0b45cc [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)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001236 .Cases("o32", "eabi", DefMips32CPU)
1237 .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 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001439}
1440
Hal Finkel8eb59282012-06-11 22:35:19 +00001441/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1442static std::string getPPCTargetCPU(const ArgList &Args) {
1443 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001444 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001445
1446 if (CPUName == "native") {
1447 std::string CPU = llvm::sys::getHostCPUName();
1448 if (!CPU.empty() && CPU != "generic")
1449 return CPU;
1450 else
1451 return "";
1452 }
1453
1454 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001455 .Case("common", "generic")
1456 .Case("440", "440")
1457 .Case("440fp", "440")
1458 .Case("450", "450")
1459 .Case("601", "601")
1460 .Case("602", "602")
1461 .Case("603", "603")
1462 .Case("603e", "603e")
1463 .Case("603ev", "603ev")
1464 .Case("604", "604")
1465 .Case("604e", "604e")
1466 .Case("620", "620")
1467 .Case("630", "pwr3")
1468 .Case("G3", "g3")
1469 .Case("7400", "7400")
1470 .Case("G4", "g4")
1471 .Case("7450", "7450")
1472 .Case("G4+", "g4+")
1473 .Case("750", "750")
1474 .Case("970", "970")
1475 .Case("G5", "g5")
1476 .Case("a2", "a2")
1477 .Case("a2q", "a2q")
1478 .Case("e500mc", "e500mc")
1479 .Case("e5500", "e5500")
1480 .Case("power3", "pwr3")
1481 .Case("power4", "pwr4")
1482 .Case("power5", "pwr5")
1483 .Case("power5x", "pwr5x")
1484 .Case("power6", "pwr6")
1485 .Case("power6x", "pwr6x")
1486 .Case("power7", "pwr7")
1487 .Case("power8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001488 .Case("power9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001489 .Case("pwr3", "pwr3")
1490 .Case("pwr4", "pwr4")
1491 .Case("pwr5", "pwr5")
1492 .Case("pwr5x", "pwr5x")
1493 .Case("pwr6", "pwr6")
1494 .Case("pwr6x", "pwr6x")
1495 .Case("pwr7", "pwr7")
1496 .Case("pwr8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001497 .Case("pwr9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001498 .Case("powerpc", "ppc")
1499 .Case("powerpc64", "ppc64")
1500 .Case("powerpc64le", "ppc64le")
1501 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001502 }
1503
1504 return "";
1505}
1506
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001507static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1508 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001509 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001510 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001511
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001512 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1513 if (FloatABI == ppc::FloatABI::Soft &&
1514 !(Triple.getArch() == llvm::Triple::ppc64 ||
1515 Triple.getArch() == llvm::Triple::ppc64le))
1516 Features.push_back("+soft-float");
1517 else if (FloatABI == ppc::FloatABI::Soft &&
1518 (Triple.getArch() == llvm::Triple::ppc64 ||
1519 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001520 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001521 << "soft float is not supported for ppc64";
1522
Eric Christopher643bb6a2013-10-16 20:40:08 +00001523 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001524 AddTargetFeature(Args, Features, options::OPT_faltivec,
1525 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001526}
1527
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001528ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1529 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1530 if (Arg *A =
1531 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1532 options::OPT_mfloat_abi_EQ)) {
1533 if (A->getOption().matches(options::OPT_msoft_float))
1534 ABI = ppc::FloatABI::Soft;
1535 else if (A->getOption().matches(options::OPT_mhard_float))
1536 ABI = ppc::FloatABI::Hard;
1537 else {
1538 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1539 .Case("soft", ppc::FloatABI::Soft)
1540 .Case("hard", ppc::FloatABI::Hard)
1541 .Default(ppc::FloatABI::Invalid);
1542 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1543 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1544 ABI = ppc::FloatABI::Hard;
1545 }
1546 }
1547 }
1548
1549 // If unspecified, choose the default based on the platform.
1550 if (ABI == ppc::FloatABI::Invalid) {
1551 ABI = ppc::FloatABI::Hard;
1552 }
1553
1554 return ABI;
1555}
1556
Ulrich Weigand8afad612014-07-28 13:17:52 +00001557void Clang::AddPPCTargetArgs(const ArgList &Args,
1558 ArgStringList &CmdArgs) const {
1559 // Select the ABI to use.
1560 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001561 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001562 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001563 case llvm::Triple::ppc64: {
1564 // When targeting a processor that supports QPX, or if QPX is
1565 // specifically enabled, default to using the ABI that supports QPX (so
1566 // long as it is not specifically disabled).
1567 bool HasQPX = false;
1568 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1569 HasQPX = A->getValue() == StringRef("a2q");
1570 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1571 if (HasQPX) {
1572 ABIName = "elfv1-qpx";
1573 break;
1574 }
1575
Ulrich Weigand8afad612014-07-28 13:17:52 +00001576 ABIName = "elfv1";
1577 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001578 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001579 case llvm::Triple::ppc64le:
1580 ABIName = "elfv2";
1581 break;
1582 default:
1583 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001584 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001585
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001586 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1587 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1588 // the option if given as we don't have backend support for any targets
1589 // that don't use the altivec abi.
1590 if (StringRef(A->getValue()) != "altivec")
1591 ABIName = A->getValue();
1592
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001593 ppc::FloatABI FloatABI =
1594 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1595
1596 if (FloatABI == ppc::FloatABI::Soft) {
1597 // Floating point operations and argument passing are soft.
1598 CmdArgs.push_back("-msoft-float");
1599 CmdArgs.push_back("-mfloat-abi");
1600 CmdArgs.push_back("soft");
1601 } else {
1602 // Floating point operations and argument passing are hard.
1603 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1604 CmdArgs.push_back("-mfloat-abi");
1605 CmdArgs.push_back("hard");
1606 }
1607
Ulrich Weigand8afad612014-07-28 13:17:52 +00001608 if (ABIName) {
1609 CmdArgs.push_back("-target-abi");
1610 CmdArgs.push_back(ABIName);
1611 }
1612}
1613
1614bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1615 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1616 return A && (A->getValue() == StringRef(Value));
1617}
1618
Tom Stellard6674c702013-04-01 20:56:53 +00001619/// Get the (LLVM) name of the R600 gpu we are targeting.
1620static std::string getR600TargetGPU(const ArgList &Args) {
1621 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001622 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001623 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001624 .Cases("rv630", "rv635", "r600")
1625 .Cases("rv610", "rv620", "rs780", "rs880")
1626 .Case("rv740", "rv770")
1627 .Case("palm", "cedar")
1628 .Cases("sumo", "sumo2", "sumo")
1629 .Case("hemlock", "cypress")
1630 .Case("aruba", "cayman")
1631 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001632 }
1633 return "";
1634}
1635
Jacques Pienaard964cc22016-03-28 21:02:54 +00001636static std::string getLanaiTargetCPU(const ArgList &Args) {
1637 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1638 return A->getValue();
1639 }
1640 return "";
1641}
1642
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001643sparc::FloatABI sparc::getSparcFloatABI(const Driver &D,
1644 const ArgList &Args) {
1645 sparc::FloatABI ABI = sparc::FloatABI::Invalid;
1646 if (Arg *A =
1647 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1648 options::OPT_mfloat_abi_EQ)) {
1649 if (A->getOption().matches(options::OPT_msoft_float))
1650 ABI = sparc::FloatABI::Soft;
1651 else if (A->getOption().matches(options::OPT_mhard_float))
1652 ABI = sparc::FloatABI::Hard;
1653 else {
1654 ABI = llvm::StringSwitch<sparc::FloatABI>(A->getValue())
1655 .Case("soft", sparc::FloatABI::Soft)
1656 .Case("hard", sparc::FloatABI::Hard)
1657 .Default(sparc::FloatABI::Invalid);
1658 if (ABI == sparc::FloatABI::Invalid &&
1659 !StringRef(A->getValue()).empty()) {
1660 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1661 ABI = sparc::FloatABI::Hard;
1662 }
1663 }
1664 }
1665
1666 // If unspecified, choose the default based on the platform.
1667 // Only the hard-float ABI on Sparc is standardized, and it is the
1668 // default. GCC also supports a nonstandard soft-float ABI mode, also
1669 // implemented in LLVM. However as this is not standard we set the default
1670 // to be hard-float.
1671 if (ABI == sparc::FloatABI::Invalid) {
1672 ABI = sparc::FloatABI::Hard;
1673 }
1674
1675 return ABI;
1676}
1677
1678static void getSparcTargetFeatures(const Driver &D, const ArgList &Args,
1679 std::vector<const char *> &Features) {
1680 sparc::FloatABI FloatABI = sparc::getSparcFloatABI(D, Args);
1681 if (FloatABI == sparc::FloatABI::Soft)
1682 Features.push_back("+soft-float");
1683}
1684
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001685void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001686 ArgStringList &CmdArgs) const {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001687 //const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001688 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001689
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001690 sparc::FloatABI FloatABI =
1691 sparc::getSparcFloatABI(getToolChain().getDriver(), Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001692
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00001693 if (FloatABI == sparc::FloatABI::Soft) {
1694 // Floating point operations and argument passing are soft.
1695 CmdArgs.push_back("-msoft-float");
1696 CmdArgs.push_back("-mfloat-abi");
1697 CmdArgs.push_back("soft");
1698 } else {
1699 // Floating point operations and argument passing are hard.
1700 assert(FloatABI == sparc::FloatABI::Hard && "Invalid float abi!");
1701 CmdArgs.push_back("-mfloat-abi");
1702 CmdArgs.push_back("hard");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001703 }
1704}
1705
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00001706void Clang::AddSystemZTargetArgs(const ArgList &Args,
1707 ArgStringList &CmdArgs) const {
1708 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1709 CmdArgs.push_back("-mbackchain");
1710}
1711
Richard Sandiford4652d892013-07-19 16:51:51 +00001712static const char *getSystemZTargetCPU(const ArgList &Args) {
1713 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1714 return A->getValue();
1715 return "z10";
1716}
1717
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001718static void getSystemZTargetFeatures(const ArgList &Args,
1719 std::vector<const char *> &Features) {
1720 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001721 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001722 if (A->getOption().matches(options::OPT_mhtm))
1723 Features.push_back("+transactional-execution");
1724 else
1725 Features.push_back("-transactional-execution");
1726 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001727 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001728 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001729 if (A->getOption().matches(options::OPT_mvx))
1730 Features.push_back("+vector");
1731 else
1732 Features.push_back("-vector");
1733 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001734}
1735
Chandler Carruth953fb082013-01-13 11:46:33 +00001736static const char *getX86TargetCPU(const ArgList &Args,
1737 const llvm::Triple &Triple) {
1738 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001739 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001740 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001741 return "core-avx2";
1742
Chandler Carruth953fb082013-01-13 11:46:33 +00001743 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001744 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001745
1746 // FIXME: Reject attempts to use -march=native unless the target matches
1747 // the host.
1748 //
1749 // FIXME: We should also incorporate the detected target features for use
1750 // with -native.
1751 std::string CPU = llvm::sys::getHostCPUName();
1752 if (!CPU.empty() && CPU != "generic")
1753 return Args.MakeArgString(CPU);
1754 }
1755
Reid Kleckner3123eff2015-06-30 16:32:04 +00001756 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1757 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1758 StringRef Arch = A->getValue();
1759 const char *CPU;
1760 if (Triple.getArch() == llvm::Triple::x86) {
1761 CPU = llvm::StringSwitch<const char *>(Arch)
1762 .Case("IA32", "i386")
1763 .Case("SSE", "pentium3")
1764 .Case("SSE2", "pentium4")
1765 .Case("AVX", "sandybridge")
1766 .Case("AVX2", "haswell")
1767 .Default(nullptr);
1768 } else {
1769 CPU = llvm::StringSwitch<const char *>(Arch)
1770 .Case("AVX", "sandybridge")
1771 .Case("AVX2", "haswell")
1772 .Default(nullptr);
1773 }
1774 if (CPU)
1775 return CPU;
1776 }
1777
Chandler Carruth953fb082013-01-13 11:46:33 +00001778 // Select the default CPU if none was given (or detection failed).
1779
1780 if (Triple.getArch() != llvm::Triple::x86_64 &&
1781 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001782 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001783
1784 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1785
1786 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001787 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001788 if (Triple.getArchName() == "x86_64h")
1789 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001790 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001791 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001792
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001793 // Set up default CPU name for PS4 compilers.
1794 if (Triple.isPS4CPU())
1795 return "btver2";
1796
Alexey Bataev286d1b92014-01-31 04:07:13 +00001797 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001798 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001799 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001800
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001801 // Everything else goes to x86-64 in 64-bit mode.
1802 if (Is64Bit)
1803 return "x86-64";
1804
1805 switch (Triple.getOS()) {
1806 case llvm::Triple::FreeBSD:
1807 case llvm::Triple::NetBSD:
1808 case llvm::Triple::OpenBSD:
1809 return "i486";
1810 case llvm::Triple::Haiku:
1811 return "i586";
1812 case llvm::Triple::Bitrig:
1813 return "i686";
1814 default:
1815 // Fallback to p4.
1816 return "pentium4";
1817 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001818}
1819
Dan Gohmanc2853072015-09-03 22:51:53 +00001820/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1821static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1822 // If we have -mcpu=, use that.
1823 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1824 StringRef CPU = A->getValue();
1825
1826#ifdef __wasm__
1827 // Handle "native" by examining the host. "native" isn't meaningful when
1828 // cross compiling, so only support this when the host is also WebAssembly.
1829 if (CPU == "native")
1830 return llvm::sys::getHostCPUName();
1831#endif
1832
1833 return CPU;
1834 }
1835
1836 return "generic";
1837}
1838
Renato Golin7c542b42015-07-27 23:44:45 +00001839static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1840 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001841 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001842 default:
1843 return "";
1844
Amara Emerson703da2e2013-10-31 09:32:33 +00001845 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001846 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001847 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001848
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001849 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001850 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001851 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001852 case llvm::Triple::thumbeb: {
1853 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001854 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001855 return arm::getARMTargetCPU(MCPU, MArch, T);
1856 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001857 case llvm::Triple::mips:
1858 case llvm::Triple::mipsel:
1859 case llvm::Triple::mips64:
1860 case llvm::Triple::mips64el: {
1861 StringRef CPUName;
1862 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001863 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001864 return CPUName;
1865 }
1866
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001867 case llvm::Triple::nvptx:
1868 case llvm::Triple::nvptx64:
1869 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1870 return A->getValue();
1871 return "";
1872
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001873 case llvm::Triple::ppc:
1874 case llvm::Triple::ppc64:
1875 case llvm::Triple::ppc64le: {
1876 std::string TargetCPUName = getPPCTargetCPU(Args);
1877 // LLVM may default to generating code for the native CPU,
1878 // but, like gcc, we default to a more generic option for
1879 // each architecture. (except on Darwin)
1880 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1881 if (T.getArch() == llvm::Triple::ppc64)
1882 TargetCPUName = "ppc64";
1883 else if (T.getArch() == llvm::Triple::ppc64le)
1884 TargetCPUName = "ppc64le";
1885 else
1886 TargetCPUName = "ppc";
1887 }
1888 return TargetCPUName;
1889 }
1890
1891 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001892 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001893 case llvm::Triple::sparcv9:
1894 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001895 return A->getValue();
1896 return "";
1897
1898 case llvm::Triple::x86:
1899 case llvm::Triple::x86_64:
1900 return getX86TargetCPU(Args, T);
1901
1902 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001903 return "hexagon" +
1904 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001905
Jacques Pienaard964cc22016-03-28 21:02:54 +00001906 case llvm::Triple::lanai:
1907 return getLanaiTargetCPU(Args);
1908
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001909 case llvm::Triple::systemz:
1910 return getSystemZTargetCPU(Args);
1911
1912 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001913 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001914 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001915
1916 case llvm::Triple::wasm32:
1917 case llvm::Triple::wasm64:
1918 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001919 }
1920}
1921
Alp Tokerce365ca2013-12-02 12:43:03 +00001922static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001923 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001924 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1925 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1926 // forward.
1927 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001928 std::string Plugin =
1929 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001930 CmdArgs.push_back(Args.MakeArgString(Plugin));
1931
1932 // Try to pass driver level flags relevant to LTO code generation down to
1933 // the plugin.
1934
1935 // Handle flags for selecting CPU variants.
1936 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1937 if (!CPU.empty())
1938 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001939
James Molloyf97fdae2015-12-21 10:44:36 +00001940 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1941 StringRef OOpt;
1942 if (A->getOption().matches(options::OPT_O4) ||
1943 A->getOption().matches(options::OPT_Ofast))
1944 OOpt = "3";
1945 else if (A->getOption().matches(options::OPT_O))
1946 OOpt = A->getValue();
1947 else if (A->getOption().matches(options::OPT_O0))
1948 OOpt = "0";
1949 if (!OOpt.empty())
1950 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1951 }
1952
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001953 if (IsThinLTO)
1954 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001955
1956 // If an explicit debugger tuning argument appeared, pass it along.
1957 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1958 options::OPT_ggdbN_Group)) {
1959 if (A->getOption().matches(options::OPT_glldb))
1960 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1961 else if (A->getOption().matches(options::OPT_gsce))
1962 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1963 else
1964 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1965 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001966}
1967
Sanjay Patel2987c292015-06-11 14:53:41 +00001968/// This is a helper function for validating the optional refinement step
1969/// parameter in reciprocal argument strings. Return false if there is an error
1970/// parsing the refinement step. Otherwise, return true and set the Position
1971/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001972static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001974 const char RefinementStepToken = ':';
1975 Position = In.find(RefinementStepToken);
1976 if (Position != StringRef::npos) {
1977 StringRef Option = A.getOption().getName();
1978 StringRef RefStep = In.substr(Position + 1);
1979 // Allow exactly one numeric character for the additional refinement
1980 // step parameter. This is reasonable for all currently-supported
1981 // operations and architectures because we would expect that a larger value
1982 // of refinement steps would cause the estimate "optimization" to
1983 // under-perform the native operation. Also, if the estimate does not
1984 // converge quickly, it probably will not ever converge, so further
1985 // refinement steps will not produce a better answer.
1986 if (RefStep.size() != 1) {
1987 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1988 return false;
1989 }
1990 char RefStepChar = RefStep[0];
1991 if (RefStepChar < '0' || RefStepChar > '9') {
1992 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1993 return false;
1994 }
1995 }
1996 return true;
1997}
1998
1999/// The -mrecip flag requires processing of many optional parameters.
2000static void ParseMRecip(const Driver &D, const ArgList &Args,
2001 ArgStringList &OutStrings) {
2002 StringRef DisabledPrefixIn = "!";
2003 StringRef DisabledPrefixOut = "!";
2004 StringRef EnabledPrefixOut = "";
2005 StringRef Out = "-mrecip=";
2006
2007 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
2008 if (!A)
2009 return;
2010
2011 unsigned NumOptions = A->getNumValues();
2012 if (NumOptions == 0) {
2013 // No option is the same as "all".
2014 OutStrings.push_back(Args.MakeArgString(Out + "all"));
2015 return;
2016 }
2017
2018 // Pass through "all", "none", or "default" with an optional refinement step.
2019 if (NumOptions == 1) {
2020 StringRef Val = A->getValue(0);
2021 size_t RefStepLoc;
2022 if (!getRefinementStep(Val, D, *A, RefStepLoc))
2023 return;
2024 StringRef ValBase = Val.slice(0, RefStepLoc);
2025 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
2026 OutStrings.push_back(Args.MakeArgString(Out + Val));
2027 return;
2028 }
2029 }
2030
2031 // Each reciprocal type may be enabled or disabled individually.
2032 // Check each input value for validity, concatenate them all back together,
2033 // and pass through.
2034
2035 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 OptionStrings.insert(std::make_pair("divd", false));
2037 OptionStrings.insert(std::make_pair("divf", false));
2038 OptionStrings.insert(std::make_pair("vec-divd", false));
2039 OptionStrings.insert(std::make_pair("vec-divf", false));
2040 OptionStrings.insert(std::make_pair("sqrtd", false));
2041 OptionStrings.insert(std::make_pair("sqrtf", false));
2042 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
2043 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00002044
2045 for (unsigned i = 0; i != NumOptions; ++i) {
2046 StringRef Val = A->getValue(i);
2047
2048 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2049 // Ignore the disablement token for string matching.
2050 if (IsDisabled)
2051 Val = Val.substr(1);
2052
2053 size_t RefStep;
2054 if (!getRefinementStep(Val, D, *A, RefStep))
2055 return;
2056
2057 StringRef ValBase = Val.slice(0, RefStep);
2058 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2059 if (OptionIter == OptionStrings.end()) {
2060 // Try again specifying float suffix.
2061 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2062 if (OptionIter == OptionStrings.end()) {
2063 // The input name did not match any known option string.
2064 D.Diag(diag::err_drv_unknown_argument) << Val;
2065 return;
2066 }
2067 // The option was specified without a float or double suffix.
2068 // Make sure that the double entry was not already specified.
2069 // The float entry will be checked below.
2070 if (OptionStrings[ValBase.str() + 'd']) {
2071 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2072 return;
2073 }
2074 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002075
Sanjay Patel2987c292015-06-11 14:53:41 +00002076 if (OptionIter->second == true) {
2077 // Duplicate option specified.
2078 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2079 return;
2080 }
2081
2082 // Mark the matched option as found. Do not allow duplicate specifiers.
2083 OptionIter->second = true;
2084
2085 // If the precision was not specified, also mark the double entry as found.
2086 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2087 OptionStrings[ValBase.str() + 'd'] = true;
2088
2089 // Build the output string.
2090 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2091 Out = Args.MakeArgString(Out + Prefix + Val);
2092 if (i != NumOptions - 1)
2093 Out = Args.MakeArgString(Out + ",");
2094 }
2095
2096 OutStrings.push_back(Args.MakeArgString(Out));
2097}
2098
Eric Christopherc54920a2015-03-23 19:26:05 +00002099static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002100 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002101 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002102 // If -march=native, autodetect the feature list.
2103 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2104 if (StringRef(A->getValue()) == "native") {
2105 llvm::StringMap<bool> HostFeatures;
2106 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2107 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002108 Features.push_back(
2109 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002110 }
2111 }
2112
Jim Grosbach82eee262013-11-16 00:53:35 +00002113 if (Triple.getArchName() == "x86_64h") {
2114 // x86_64h implies quite a few of the more modern subtarget features
2115 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2116 Features.push_back("-rdrnd");
2117 Features.push_back("-aes");
2118 Features.push_back("-pclmul");
2119 Features.push_back("-rtm");
2120 Features.push_back("-hle");
2121 Features.push_back("-fsgsbase");
2122 }
2123
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002124 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002125 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002126 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002127 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002128 Features.push_back("+sse4.2");
2129 Features.push_back("+popcnt");
2130 } else
2131 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002132 }
2133
Eric Christopherc54920a2015-03-23 19:26:05 +00002134 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002135 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2136 StringRef Arch = A->getValue();
2137 bool ArchUsed = false;
2138 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002139 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002140 if (Arch == "AVX" || Arch == "AVX2") {
2141 ArchUsed = true;
2142 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2143 }
2144 }
2145 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002146 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002147 if (Arch == "IA32") {
2148 ArchUsed = true;
2149 } else if (Arch == "SSE" || Arch == "SSE2") {
2150 ArchUsed = true;
2151 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2152 }
2153 }
2154 if (!ArchUsed)
2155 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2156 }
2157
Jim Grosbach82eee262013-11-16 00:53:35 +00002158 // Now add any that the user explicitly requested on the command line,
2159 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002160 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002161}
2162
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002163void Clang::AddX86TargetArgs(const ArgList &Args,
2164 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002165 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002166 Args.hasArg(options::OPT_mkernel) ||
2167 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002168 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002169
Bob Wilson2616e2e2013-02-10 16:01:41 +00002170 // Default to avoid implicit floating-point for kernel/kext code, but allow
2171 // that to be overridden with -mno-soft-float.
2172 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2173 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002174 if (Arg *A = Args.getLastArg(
2175 options::OPT_msoft_float, options::OPT_mno_soft_float,
2176 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002177 const Option &O = A->getOption();
2178 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2179 O.matches(options::OPT_msoft_float));
2180 }
2181 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002182 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002183
2184 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2185 StringRef Value = A->getValue();
2186 if (Value == "intel" || Value == "att") {
2187 CmdArgs.push_back("-mllvm");
2188 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2189 } else {
2190 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2191 << A->getOption().getName() << Value;
2192 }
2193 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002194
2195 // Set flags to support MCU ABI.
2196 if (Args.hasArg(options::OPT_miamcu)) {
2197 CmdArgs.push_back("-mfloat-abi");
2198 CmdArgs.push_back("soft");
2199 CmdArgs.push_back("-mstack-alignment=4");
2200 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002201}
2202
Tony Linthicum76329bf2011-12-12 21:14:55 +00002203void Clang::AddHexagonTargetArgs(const ArgList &Args,
2204 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002205 CmdArgs.push_back("-mqdsp6-compat");
2206 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002207
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002208 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2209 std::string N = llvm::utostr(G.getValue());
2210 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002211 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002212 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002213 }
2214
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002215 if (!Args.hasArg(options::OPT_fno_short_enums))
2216 CmdArgs.push_back("-fshort-enums");
2217 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002218 CmdArgs.push_back("-mllvm");
2219 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002220 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002221 CmdArgs.push_back("-mllvm");
2222 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002223}
2224
Jacques Pienaard964cc22016-03-28 21:02:54 +00002225void Clang::AddLanaiTargetArgs(const ArgList &Args,
2226 ArgStringList &CmdArgs) const {
2227 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2228 StringRef CPUName = A->getValue();
2229
2230 CmdArgs.push_back("-target-cpu");
2231 CmdArgs.push_back(Args.MakeArgString(CPUName));
2232 }
2233 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2234 StringRef Value = A->getValue();
2235 // Only support mregparm=4 to support old usage. Report error for all other
2236 // cases.
2237 int Mregparm;
2238 if (Value.getAsInteger(10, Mregparm)) {
2239 if (Mregparm != 4) {
2240 getToolChain().getDriver().Diag(
2241 diag::err_drv_unsupported_option_argument)
2242 << A->getOption().getName() << Value;
2243 }
2244 }
2245 }
2246}
2247
Dan Gohmane3d71e12016-01-07 01:00:21 +00002248void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2249 ArgStringList &CmdArgs) const {
2250 // Default to "hidden" visibility.
2251 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2252 options::OPT_fvisibility_ms_compat)) {
2253 CmdArgs.push_back("-fvisibility");
2254 CmdArgs.push_back("hidden");
2255 }
2256}
2257
Kevin Qin110db6f2014-07-18 07:03:22 +00002258// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002259static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002260 std::vector<const char *> &Features) {
2261 SmallVector<StringRef, 8> Split;
2262 text.split(Split, StringRef("+"), -1, false);
2263
Benjamin Kramer72e64312015-09-24 14:48:49 +00002264 for (StringRef Feature : Split) {
Renato Golin3b8709c2016-05-25 12:36:31 +00002265 const char *result = llvm::StringSwitch<const char *>(Feature)
2266 .Case("fp", "+fp-armv8")
2267 .Case("simd", "+neon")
2268 .Case("crc", "+crc")
2269 .Case("crypto", "+crypto")
2270 .Case("fp16", "+fullfp16")
2271 .Case("profile", "+spe")
2272 .Case("nofp", "-fp-armv8")
2273 .Case("nosimd", "-neon")
2274 .Case("nocrc", "-crc")
2275 .Case("nocrypto", "-crypto")
2276 .Case("nofp16", "-fullfp16")
2277 .Case("noprofile", "-spe")
2278 .Default(nullptr);
2279 if (result)
2280 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002281 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002282 D.Diag(diag::err_drv_no_neon_modifier);
2283 else
2284 return false;
2285 }
2286 return true;
2287}
2288
2289// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2290// decode CPU and feature.
2291static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2292 std::vector<const char *> &Features) {
2293 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2294 CPU = Split.first;
Renato Golin3b8709c2016-05-25 12:36:31 +00002295 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
2296 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2297 CPU == "kryo") {
2298 Features.push_back("+neon");
2299 Features.push_back("+crc");
2300 Features.push_back("+crypto");
2301 } else if (CPU == "cyclone") {
2302 Features.push_back("+neon");
2303 Features.push_back("+crypto");
2304 } else if (CPU == "generic") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002305 Features.push_back("+neon");
2306 } else {
Renato Golin3b8709c2016-05-25 12:36:31 +00002307 return false;
2308 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002309
2310 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2311 return false;
2312
2313 return true;
2314}
2315
2316static bool
2317getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2318 const ArgList &Args,
2319 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002320 std::string MarchLowerCase = March.lower();
2321 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002322
Renato Golin3b8709c2016-05-25 12:36:31 +00002323 if (Split.first == "armv8-a" || Split.first == "armv8a") {
2324 // ok, no additional features.
2325 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
2326 Features.push_back("+v8.1a");
2327 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2328 Features.push_back("+v8.2a");
2329 } else {
2330 return false;
2331 }
2332
2333 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002334 return false;
2335
2336 return true;
2337}
2338
2339static bool
2340getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2341 const ArgList &Args,
2342 std::vector<const char *> &Features) {
2343 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002344 std::string McpuLowerCase = Mcpu.lower();
2345 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002346 return false;
2347
2348 return true;
2349}
2350
2351static bool
2352getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2353 const ArgList &Args,
2354 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002355 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002356 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002357 if (MtuneLowerCase == "native")
2358 MtuneLowerCase = llvm::sys::getHostCPUName();
2359 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002360 Features.push_back("+zcm");
2361 Features.push_back("+zcz");
2362 }
2363 return true;
2364}
2365
2366static bool
2367getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2368 const ArgList &Args,
2369 std::vector<const char *> &Features) {
2370 StringRef CPU;
2371 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002372 std::string McpuLowerCase = Mcpu.lower();
2373 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002374 return false;
2375
2376 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2377}
2378
Justin Bognerf9052562015-11-13 23:07:31 +00002379static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002380 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002381 Arg *A;
2382 bool success = true;
2383 // Enable NEON by default.
2384 Features.push_back("+neon");
2385 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2386 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2387 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2388 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002389 else if (Args.hasArg(options::OPT_arch))
2390 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2391 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002392
2393 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2394 success =
2395 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2396 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2397 success =
2398 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002399 else if (Args.hasArg(options::OPT_arch))
2400 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2401 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002402
2403 if (!success)
2404 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002405
2406 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2407 Features.push_back("-fp-armv8");
2408 Features.push_back("-crypto");
2409 Features.push_back("-neon");
2410 }
Bradley Smith418c5932014-05-02 15:17:51 +00002411
2412 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002413 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002414 if (A->getOption().matches(options::OPT_mcrc))
2415 Features.push_back("+crc");
2416 else
2417 Features.push_back("-crc");
2418 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002419
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002420 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2421 options::OPT_munaligned_access))
2422 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2423 Features.push_back("+strict-align");
2424
Justin Bognerf9052562015-11-13 23:07:31 +00002425 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002426 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002427}
2428
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002429static void getHexagonTargetFeatures(const ArgList &Args,
2430 std::vector<const char *> &Features) {
2431 bool HasHVX = false, HasHVXD = false;
2432
Eric Christopher49062a52015-12-22 03:12:34 +00002433 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2434 // doing dependent option handling here rather than in initFeatureMap or a
2435 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002436 for (auto &A : Args) {
2437 auto &Opt = A->getOption();
2438 if (Opt.matches(options::OPT_mhexagon_hvx))
2439 HasHVX = true;
2440 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2441 HasHVXD = HasHVX = false;
2442 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2443 HasHVXD = HasHVX = true;
2444 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2445 HasHVXD = false;
2446 else
2447 continue;
2448 A->claim();
2449 }
2450
2451 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2452 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2453}
2454
Dan Gohmanc2853072015-09-03 22:51:53 +00002455static void getWebAssemblyTargetFeatures(const ArgList &Args,
2456 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002457 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002458}
2459
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002460static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2461 std::vector<const char *> &Features) {
2462 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2463 StringRef value = dAbi->getValue();
2464 if (value == "1.0") {
2465 Features.push_back("+amdgpu-debugger-insert-nops");
Konstantin Zhuravlyove6dbd902016-05-26 19:36:39 +00002466 Features.push_back("+amdgpu-debugger-reserve-regs");
2467 Features.push_back("+amdgpu-debugger-emit-prologue");
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002468 } else {
2469 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2470 }
2471 }
2472
2473 handleTargetFeaturesGroup(
2474 Args, Features, options::OPT_m_amdgpu_Features_Group);
2475}
2476
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002477static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002478 const ArgList &Args, ArgStringList &CmdArgs,
2479 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002480 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002481 std::vector<const char *> Features;
2482 switch (Triple.getArch()) {
2483 default:
2484 break;
2485 case llvm::Triple::mips:
2486 case llvm::Triple::mipsel:
2487 case llvm::Triple::mips64:
2488 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002489 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002490 break;
2491
2492 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002493 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002494 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002495 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002496 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002497 break;
2498
2499 case llvm::Triple::ppc:
2500 case llvm::Triple::ppc64:
2501 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002502 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002503 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002504 case llvm::Triple::systemz:
2505 getSystemZTargetFeatures(Args, Features);
2506 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002507 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002508 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002509 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002510 break;
2511 case llvm::Triple::x86:
2512 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002513 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002514 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002515 case llvm::Triple::hexagon:
2516 getHexagonTargetFeatures(Args, Features);
2517 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002518 case llvm::Triple::wasm32:
2519 case llvm::Triple::wasm64:
2520 getWebAssemblyTargetFeatures(Args, Features);
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00002521 break;
2522 case llvm::Triple::sparc:
2523 case llvm::Triple::sparcel:
2524 case llvm::Triple::sparcv9:
2525 getSparcTargetFeatures(D, Args, Features);
Dan Gohmanc2853072015-09-03 22:51:53 +00002526 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002527 case llvm::Triple::r600:
2528 case llvm::Triple::amdgcn:
2529 getAMDGPUTargetFeatures(D, Args, Features);
2530 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002531 }
Rafael Espindola43964802013-08-21 17:34:32 +00002532
2533 // Find the last of each feature.
2534 llvm::StringMap<unsigned> LastOpt;
2535 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2536 const char *Name = Features[I];
2537 assert(Name[0] == '-' || Name[0] == '+');
2538 LastOpt[Name + 1] = I;
2539 }
2540
2541 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2542 // If this feature was overridden, ignore it.
2543 const char *Name = Features[I];
2544 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2545 assert(LastI != LastOpt.end());
2546 unsigned Last = LastI->second;
2547 if (Last != I)
2548 continue;
2549
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002550 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002551 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002552 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002553}
2554
David Majnemerae394812014-12-09 00:12:30 +00002555static bool
2556shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2557 const llvm::Triple &Triple) {
2558 // We use the zero-cost exception tables for Objective-C if the non-fragile
2559 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2560 // later.
2561 if (runtime.isNonFragile())
2562 return true;
2563
2564 if (!Triple.isMacOSX())
2565 return false;
2566
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002567 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002568 (Triple.getArch() == llvm::Triple::x86_64 ||
2569 Triple.getArch() == llvm::Triple::arm));
2570}
2571
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002572/// Adds exception related arguments to the driver command arguments. There's a
2573/// master flag, -fexceptions and also language specific flags to enable/disable
2574/// C++ and Objective-C exceptions. This makes it possible to for example
2575/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002576static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002577 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002578 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002579 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002580 const Driver &D = TC.getDriver();
2581 const llvm::Triple &Triple = TC.getTriple();
2582
Chad Rosier4fab82c2012-03-26 22:04:46 +00002583 if (KernelOrKext) {
2584 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2585 // arguments now to avoid warnings about unused arguments.
2586 Args.ClaimAllArgs(options::OPT_fexceptions);
2587 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2588 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2589 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2590 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2591 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002592 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002593 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002594
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002595 // See if the user explicitly enabled exceptions.
2596 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2597 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002598
David Majnemerae394812014-12-09 00:12:30 +00002599 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2600 // is not necessarily sensible, but follows GCC.
2601 if (types::isObjC(InputType) &&
2602 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002603 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002604 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002605
David Majnemerae394812014-12-09 00:12:30 +00002606 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002607 }
2608
2609 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002610 // Disable C++ EH by default on XCore and PS4.
2611 bool CXXExceptionsEnabled =
2612 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002613 Arg *ExceptionArg = Args.getLastArg(
2614 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2615 options::OPT_fexceptions, options::OPT_fno_exceptions);
2616 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002617 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002618 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2619 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002620
2621 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002622 if (Triple.isPS4CPU()) {
2623 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2624 assert(ExceptionArg &&
2625 "On the PS4 exceptions should only be enabled if passing "
2626 "an argument");
2627 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2628 const Arg *RTTIArg = TC.getRTTIArg();
2629 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2630 D.Diag(diag::err_drv_argument_not_allowed_with)
2631 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2632 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2633 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2634 } else
2635 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2636
Anders Carlssone96ab552011-02-28 02:27:16 +00002637 CmdArgs.push_back("-fcxx-exceptions");
2638
David Majnemer8de68642014-12-05 08:11:58 +00002639 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002640 }
2641 }
2642
David Majnemer8de68642014-12-05 08:11:58 +00002643 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002644 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002645}
2646
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002647static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002648 bool Default = true;
2649 if (TC.getTriple().isOSDarwin()) {
2650 // The native darwin assembler doesn't support the linker_option directives,
2651 // so we disable them if we think the .s file will be passed to it.
2652 Default = TC.useIntegratedAs();
2653 }
2654 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2655 Default);
2656}
2657
Ted Kremenek62093662013-03-12 17:02:12 +00002658static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2659 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002660 bool UseDwarfDirectory =
2661 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2662 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002663 return !UseDwarfDirectory;
2664}
2665
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002666/// \brief Check whether the given input tree contains any compilation actions.
2667static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002668 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002669 return true;
2670
Nico Weber5a459f82016-02-23 19:30:43 +00002671 for (const auto &AI : A->inputs())
2672 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002673 return true;
2674
2675 return false;
2676}
2677
2678/// \brief Check if -relax-all should be passed to the internal assembler.
2679/// This is done by default when compiling non-assembler source with -O0.
2680static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2681 bool RelaxDefault = true;
2682
2683 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2684 RelaxDefault = A->getOption().matches(options::OPT_O0);
2685
2686 if (RelaxDefault) {
2687 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002688 for (const auto &Act : C.getActions()) {
2689 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002690 RelaxDefault = true;
2691 break;
2692 }
2693 }
2694 }
2695
2696 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002697 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002698}
2699
Paul Robinson0334a042015-12-19 19:41:48 +00002700// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2701// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002702static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002703 assert(A.getOption().matches(options::OPT_gN_Group) &&
2704 "Not a -g option that specifies a debug-info level");
2705 if (A.getOption().matches(options::OPT_g0) ||
2706 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002707 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002708 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2709 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002710 return codegenoptions::DebugLineTablesOnly;
2711 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002712}
2713
Douglas Katzman3459ce22015-10-08 04:24:12 +00002714// Extract the integer N from a string spelled "-dwarf-N", returning 0
2715// on mismatch. The StringRef input (rather than an Arg) allows
2716// for use by the "-Xassembler" option parser.
2717static unsigned DwarfVersionNum(StringRef ArgValue) {
2718 return llvm::StringSwitch<unsigned>(ArgValue)
2719 .Case("-gdwarf-2", 2)
2720 .Case("-gdwarf-3", 3)
2721 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002722 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002723 .Default(0);
2724}
2725
2726static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002727 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002728 unsigned DwarfVersion,
2729 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002730 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002731 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002732 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2733 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002734 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002735 CmdArgs.push_back("-debug-info-kind=limited");
2736 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002737 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002738 CmdArgs.push_back("-debug-info-kind=standalone");
2739 break;
2740 default:
2741 break;
2742 }
2743 if (DwarfVersion > 0)
2744 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002745 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002746 switch (DebuggerTuning) {
2747 case llvm::DebuggerKind::GDB:
2748 CmdArgs.push_back("-debugger-tuning=gdb");
2749 break;
2750 case llvm::DebuggerKind::LLDB:
2751 CmdArgs.push_back("-debugger-tuning=lldb");
2752 break;
2753 case llvm::DebuggerKind::SCE:
2754 CmdArgs.push_back("-debugger-tuning=sce");
2755 break;
2756 default:
2757 break;
2758 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002759}
2760
David Blaikie9260ed62013-07-25 21:19:01 +00002761static void CollectArgsForIntegratedAssembler(Compilation &C,
2762 const ArgList &Args,
2763 ArgStringList &CmdArgs,
2764 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002765 if (UseRelaxAll(C, Args))
2766 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002767
David Majnemer2b9349d2015-12-21 22:09:34 +00002768 // Only default to -mincremental-linker-compatible if we think we are
2769 // targeting the MSVC linker.
2770 bool DefaultIncrementalLinkerCompatible =
2771 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2772 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2773 options::OPT_mno_incremental_linker_compatible,
2774 DefaultIncrementalLinkerCompatible))
2775 CmdArgs.push_back("-mincremental-linker-compatible");
2776
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002777 // When passing -I arguments to the assembler we sometimes need to
2778 // unconditionally take the next argument. For example, when parsing
2779 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2780 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2781 // arg after parsing the '-I' arg.
2782 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002783
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002784 // When using an integrated assembler, translate -Wa, and -Xassembler
2785 // options.
2786 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002787 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002788 for (const Arg *A :
2789 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2790 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002791
Benjamin Kramer72e64312015-09-24 14:48:49 +00002792 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002793 if (TakeNextArg) {
2794 CmdArgs.push_back(Value.data());
2795 TakeNextArg = false;
2796 continue;
2797 }
David Blaikie9260ed62013-07-25 21:19:01 +00002798
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002799 switch (C.getDefaultToolChain().getArch()) {
2800 default:
2801 break;
2802 case llvm::Triple::mips:
2803 case llvm::Triple::mipsel:
2804 case llvm::Triple::mips64:
2805 case llvm::Triple::mips64el:
2806 if (Value == "--trap") {
2807 CmdArgs.push_back("-target-feature");
2808 CmdArgs.push_back("+use-tcc-in-div");
2809 continue;
2810 }
2811 if (Value == "--break") {
2812 CmdArgs.push_back("-target-feature");
2813 CmdArgs.push_back("-use-tcc-in-div");
2814 continue;
2815 }
2816 if (Value.startswith("-msoft-float")) {
2817 CmdArgs.push_back("-target-feature");
2818 CmdArgs.push_back("+soft-float");
2819 continue;
2820 }
2821 if (Value.startswith("-mhard-float")) {
2822 CmdArgs.push_back("-target-feature");
2823 CmdArgs.push_back("-soft-float");
2824 continue;
2825 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002826
2827 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2828 .Case("-mips1", "+mips1")
2829 .Case("-mips2", "+mips2")
2830 .Case("-mips3", "+mips3")
2831 .Case("-mips4", "+mips4")
2832 .Case("-mips5", "+mips5")
2833 .Case("-mips32", "+mips32")
2834 .Case("-mips32r2", "+mips32r2")
2835 .Case("-mips32r3", "+mips32r3")
2836 .Case("-mips32r5", "+mips32r5")
2837 .Case("-mips32r6", "+mips32r6")
2838 .Case("-mips64", "+mips64")
2839 .Case("-mips64r2", "+mips64r2")
2840 .Case("-mips64r3", "+mips64r3")
2841 .Case("-mips64r5", "+mips64r5")
2842 .Case("-mips64r6", "+mips64r6")
2843 .Default(nullptr);
2844 if (MipsTargetFeature)
2845 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002846 }
2847
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002848 if (Value == "-force_cpusubtype_ALL") {
2849 // Do nothing, this is the default and we don't support anything else.
2850 } else if (Value == "-L") {
2851 CmdArgs.push_back("-msave-temp-labels");
2852 } else if (Value == "--fatal-warnings") {
2853 CmdArgs.push_back("-massembler-fatal-warnings");
2854 } else if (Value == "--noexecstack") {
2855 CmdArgs.push_back("-mnoexecstack");
2856 } else if (Value == "-compress-debug-sections" ||
2857 Value == "--compress-debug-sections") {
2858 CompressDebugSections = true;
2859 } else if (Value == "-nocompress-debug-sections" ||
2860 Value == "--nocompress-debug-sections") {
2861 CompressDebugSections = false;
2862 } else if (Value.startswith("-I")) {
2863 CmdArgs.push_back(Value.data());
2864 // We need to consume the next argument if the current arg is a plain
2865 // -I. The next arg will be the include directory.
2866 if (Value == "-I")
2867 TakeNextArg = true;
2868 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002869 // "-gdwarf-N" options are not cc1as options.
2870 unsigned DwarfVersion = DwarfVersionNum(Value);
2871 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2872 CmdArgs.push_back(Value.data());
2873 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002874 RenderDebugEnablingArgs(Args, CmdArgs,
2875 codegenoptions::LimitedDebugInfo,
2876 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002877 }
Renato Golin7c542b42015-07-27 23:44:45 +00002878 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2879 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2880 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002881 } else {
2882 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002883 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002884 }
2885 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002886 }
2887 if (CompressDebugSections) {
2888 if (llvm::zlib::isAvailable())
2889 CmdArgs.push_back("-compress-debug-sections");
2890 else
2891 D.Diag(diag::warn_debug_compression_unavailable);
2892 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002893 if (MipsTargetFeature != nullptr) {
2894 CmdArgs.push_back("-target-feature");
2895 CmdArgs.push_back(MipsTargetFeature);
2896 }
David Blaikie9260ed62013-07-25 21:19:01 +00002897}
2898
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002899// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002900// FIXME: Make sure we can also emit shared objects if they're requested
2901// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002902static void addClangRT(const ToolChain &TC, const ArgList &Args,
2903 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002904 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002905}
2906
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002907namespace {
2908enum OpenMPRuntimeKind {
2909 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2910 /// without knowing what runtime to target.
2911 OMPRT_Unknown,
2912
2913 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2914 /// the default for Clang.
2915 OMPRT_OMP,
2916
2917 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2918 /// this runtime but can swallow the pragmas, and find and link against the
2919 /// runtime library itself.
2920 OMPRT_GOMP,
2921
Chandler Carruthc6625c62015-05-28 21:10:31 +00002922 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002923 /// OpenMP runtime. We support this mode for users with existing dependencies
2924 /// on this runtime library name.
2925 OMPRT_IOMP5
2926};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002927}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002928
2929/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002930static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2931 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002932 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2933
2934 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2935 if (A)
2936 RuntimeName = A->getValue();
2937
2938 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002939 .Case("libomp", OMPRT_OMP)
2940 .Case("libgomp", OMPRT_GOMP)
2941 .Case("libiomp5", OMPRT_IOMP5)
2942 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002943
2944 if (RT == OMPRT_Unknown) {
2945 if (A)
2946 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002947 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002948 else
2949 // FIXME: We could use a nicer diagnostic here.
2950 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2951 }
2952
2953 return RT;
2954}
2955
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002956static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2957 const ArgList &Args) {
2958 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2959 options::OPT_fno_openmp, false))
2960 return;
2961
2962 switch (getOpenMPRuntime(TC, Args)) {
2963 case OMPRT_OMP:
2964 CmdArgs.push_back("-lomp");
2965 break;
2966 case OMPRT_GOMP:
2967 CmdArgs.push_back("-lgomp");
2968 break;
2969 case OMPRT_IOMP5:
2970 CmdArgs.push_back("-liomp5");
2971 break;
2972 case OMPRT_Unknown:
2973 // Already diagnosed.
2974 break;
2975 }
2976}
2977
Alexey Samsonov52550342014-09-15 19:58:40 +00002978static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2979 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002980 bool IsShared, bool IsWhole) {
2981 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002982 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002983 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002984 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002985 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002986}
2987
Alexey Samsonov52550342014-09-15 19:58:40 +00002988// Tries to use a file with the list of dynamic symbols that need to be exported
2989// from the runtime library. Returns true if the file was found.
2990static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2991 ArgStringList &CmdArgs,
2992 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002993 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002994 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2995 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002996 return true;
2997 }
2998 return false;
2999}
3000
3001static void linkSanitizerRuntimeDeps(const ToolChain &TC,
3002 ArgStringList &CmdArgs) {
3003 // Force linking against the system libraries sanitizers depends on
3004 // (see PR15823 why this is necessary).
3005 CmdArgs.push_back("--no-as-needed");
3006 CmdArgs.push_back("-lpthread");
3007 CmdArgs.push_back("-lrt");
3008 CmdArgs.push_back("-lm");
3009 // There's no libdl on FreeBSD.
3010 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
3011 CmdArgs.push_back("-ldl");
3012}
3013
3014static void
3015collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
3016 SmallVectorImpl<StringRef> &SharedRuntimes,
3017 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003018 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
3019 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
3020 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003021 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
3022 // Collect shared runtimes.
3023 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
3024 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00003025 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003026 // The stats_client library is also statically linked into DSOs.
3027 if (SanArgs.needsStatsRt())
3028 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003029
Alexey Samsonov52550342014-09-15 19:58:40 +00003030 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003031 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003032 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00003033 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00003034 }
3035 if (SanArgs.needsAsanRt()) {
3036 if (SanArgs.needsSharedAsanRt()) {
3037 HelperStaticRuntimes.push_back("asan-preinit");
3038 } else {
3039 StaticRuntimes.push_back("asan");
3040 if (SanArgs.linkCXXRuntimes())
3041 StaticRuntimes.push_back("asan_cxx");
3042 }
3043 }
3044 if (SanArgs.needsDfsanRt())
3045 StaticRuntimes.push_back("dfsan");
3046 if (SanArgs.needsLsanRt())
3047 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003048 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003049 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003050 if (SanArgs.linkCXXRuntimes())
3051 StaticRuntimes.push_back("msan_cxx");
3052 }
3053 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003054 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003055 if (SanArgs.linkCXXRuntimes())
3056 StaticRuntimes.push_back("tsan_cxx");
3057 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003058 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00003059 StaticRuntimes.push_back("ubsan_standalone");
3060 if (SanArgs.linkCXXRuntimes())
3061 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003062 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003063 if (SanArgs.needsSafeStackRt())
3064 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003065 if (SanArgs.needsCfiRt())
3066 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003067 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003068 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003069 if (SanArgs.linkCXXRuntimes())
3070 StaticRuntimes.push_back("ubsan_standalone_cxx");
3071 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003072 if (SanArgs.needsStatsRt()) {
3073 NonWholeStaticRuntimes.push_back("stats");
3074 RequiredSymbols.push_back("__sanitizer_stats_register");
3075 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003076 if (SanArgs.needsEsanRt())
3077 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003078}
3079
Alexey Samsonov52550342014-09-15 19:58:40 +00003080// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3081// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3082static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003083 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003084 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003085 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003086 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003087 NonWholeStaticRuntimes, HelperStaticRuntimes,
3088 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003089 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003090 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003091 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003092 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003093 bool AddExportDynamic = false;
3094 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003095 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003096 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3097 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003098 for (auto RT : NonWholeStaticRuntimes) {
3099 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3100 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3101 }
3102 for (auto S : RequiredSymbols) {
3103 CmdArgs.push_back("-u");
3104 CmdArgs.push_back(Args.MakeArgString(S));
3105 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003106 // If there is a static runtime with no dynamic list, force all the symbols
3107 // to be dynamic to be sure we export sanitizer interface functions.
3108 if (AddExportDynamic)
3109 CmdArgs.push_back("-export-dynamic");
3110 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003111}
3112
Reid Kleckner86ea7702015-02-04 23:45:07 +00003113static bool areOptimizationsEnabled(const ArgList &Args) {
3114 // Find the last -O arg and see if it is non-zero.
3115 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3116 return !A->getOption().matches(options::OPT_O0);
3117 // Defaults to -O0.
3118 return false;
3119}
3120
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003121static bool shouldUseFramePointerForTarget(const ArgList &Args,
3122 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003123 switch (Triple.getArch()) {
3124 case llvm::Triple::xcore:
3125 case llvm::Triple::wasm32:
3126 case llvm::Triple::wasm64:
3127 // XCore never wants frame pointers, regardless of OS.
3128 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003129 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003130 default:
3131 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003132 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003133
3134 if (Triple.isOSLinux()) {
3135 switch (Triple.getArch()) {
3136 // Don't use a frame pointer on linux if optimizing for certain targets.
3137 case llvm::Triple::mips64:
3138 case llvm::Triple::mips64el:
3139 case llvm::Triple::mips:
3140 case llvm::Triple::mipsel:
3141 case llvm::Triple::systemz:
3142 case llvm::Triple::x86:
3143 case llvm::Triple::x86_64:
3144 return !areOptimizationsEnabled(Args);
3145 default:
3146 return true;
3147 }
3148 }
3149
3150 if (Triple.isOSWindows()) {
3151 switch (Triple.getArch()) {
3152 case llvm::Triple::x86:
3153 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003154 case llvm::Triple::x86_64:
3155 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003156 case llvm::Triple::arm:
3157 case llvm::Triple::thumb:
3158 // Windows on ARM builds with FPO disabled to aid fast stack walking
3159 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003160 default:
3161 // All other supported Windows ISAs use xdata unwind information, so frame
3162 // pointers are not generally useful.
3163 return false;
3164 }
3165 }
3166
3167 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003168}
3169
Rafael Espindola224dd632011-12-14 21:02:23 +00003170static bool shouldUseFramePointer(const ArgList &Args,
3171 const llvm::Triple &Triple) {
3172 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3173 options::OPT_fomit_frame_pointer))
3174 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003175 if (Args.hasArg(options::OPT_pg))
3176 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003177
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003178 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003179}
3180
Eric Christopherb7d97e92013-04-03 01:58:53 +00003181static bool shouldUseLeafFramePointer(const ArgList &Args,
3182 const llvm::Triple &Triple) {
3183 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3184 options::OPT_momit_leaf_frame_pointer))
3185 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003186 if (Args.hasArg(options::OPT_pg))
3187 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003188
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003189 if (Triple.isPS4CPU())
3190 return false;
3191
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003192 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003193}
3194
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003195/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003196static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003197 SmallString<128> cwd;
3198 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003199 CmdArgs.push_back("-fdebug-compilation-dir");
3200 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003201 }
3202}
3203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003204static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003205 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3206 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3207 SmallString<128> T(FinalOutput->getValue());
3208 llvm::sys::path::replace_extension(T, "dwo");
3209 return Args.MakeArgString(T);
3210 } else {
3211 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003212 SmallString<128> T(
3213 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003214 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003215 llvm::sys::path::replace_extension(F, "dwo");
3216 T += F;
3217 return Args.MakeArgString(F);
3218 }
3219}
3220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003221static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3222 const JobAction &JA, const ArgList &Args,
3223 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003224 ArgStringList ExtractArgs;
3225 ExtractArgs.push_back("--extract-dwo");
3226
3227 ArgStringList StripArgs;
3228 StripArgs.push_back("--strip-dwo");
3229
3230 // Grabbing the output of the earlier compile step.
3231 StripArgs.push_back(Output.getFilename());
3232 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003233 ExtractArgs.push_back(OutFile);
3234
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003235 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003236 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003237
3238 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003239 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003240
3241 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003242 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003243}
3244
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003245/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003246/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3247static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003248 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003249 if (A->getOption().matches(options::OPT_O4) ||
3250 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003251 return true;
3252
3253 if (A->getOption().matches(options::OPT_O0))
3254 return false;
3255
3256 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3257
Rafael Espindola91780de2013-08-26 14:05:41 +00003258 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003259 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003260 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003261 return true;
3262
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003263 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003264 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003265 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003266
3267 unsigned OptLevel = 0;
3268 if (S.getAsInteger(10, OptLevel))
3269 return false;
3270
3271 return OptLevel > 1;
3272 }
3273
3274 return false;
3275}
3276
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003277/// Add -x lang to \p CmdArgs for \p Input.
3278static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3279 ArgStringList &CmdArgs) {
3280 // When using -verify-pch, we don't want to provide the type
3281 // 'precompiled-header' if it was inferred from the file extension
3282 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3283 return;
3284
3285 CmdArgs.push_back("-x");
3286 if (Args.hasArg(options::OPT_rewrite_objc))
3287 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3288 else
3289 CmdArgs.push_back(types::getTypeName(Input.getType()));
3290}
3291
David Majnemerc371ff02015-03-22 08:39:22 +00003292static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003293 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003294 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003295
3296 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003297 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003298
3299 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003300 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003301 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003302 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003303}
3304
Rafael Espindola577637a2015-01-03 00:06:04 +00003305// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003306// options that build systems might add but are unused when assembling or only
3307// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003308static void claimNoWarnArgs(const ArgList &Args) {
3309 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003310 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003311 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003312 Args.ClaimAllArgs(options::OPT_flto);
3313 Args.ClaimAllArgs(options::OPT_fno_lto);
3314}
3315
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003316static void appendUserToPath(SmallVectorImpl<char> &Result) {
3317#ifdef LLVM_ON_UNIX
3318 const char *Username = getenv("LOGNAME");
3319#else
3320 const char *Username = getenv("USERNAME");
3321#endif
3322 if (Username) {
3323 // Validate that LoginName can be used in a path, and get its length.
3324 size_t Len = 0;
3325 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003326 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003327 Username = nullptr;
3328 break;
3329 }
3330 }
3331
3332 if (Username && Len > 0) {
3333 Result.append(Username, Username + Len);
3334 return;
3335 }
3336 }
3337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003338// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003339#ifdef LLVM_ON_UNIX
3340 std::string UID = llvm::utostr(getuid());
3341#else
3342 // FIXME: Windows seems to have an 'SID' that might work.
3343 std::string UID = "9999";
3344#endif
3345 Result.append(UID.begin(), UID.end());
3346}
3347
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003348VersionTuple visualstudio::getMSVCVersion(const Driver *D, const ToolChain &TC,
David Majnemere11d3732015-06-08 00:22:46 +00003349 const llvm::Triple &Triple,
3350 const llvm::opt::ArgList &Args,
3351 bool IsWindowsMSVC) {
3352 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3353 IsWindowsMSVC) ||
3354 Args.hasArg(options::OPT_fmsc_version) ||
3355 Args.hasArg(options::OPT_fms_compatibility_version)) {
3356 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3357 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003358 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003359
3360 if (MSCVersion && MSCompatibilityVersion) {
3361 if (D)
3362 D->Diag(diag::err_drv_argument_not_allowed_with)
3363 << MSCVersion->getAsString(Args)
3364 << MSCompatibilityVersion->getAsString(Args);
3365 return VersionTuple();
3366 }
3367
3368 if (MSCompatibilityVersion) {
3369 VersionTuple MSVT;
3370 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3371 D->Diag(diag::err_drv_invalid_value)
3372 << MSCompatibilityVersion->getAsString(Args)
3373 << MSCompatibilityVersion->getValue();
3374 return MSVT;
3375 }
3376
3377 if (MSCVersion) {
3378 unsigned Version = 0;
3379 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3380 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3381 << MSCVersion->getValue();
3382 return getMSCompatibilityVersion(Version);
3383 }
3384
3385 unsigned Major, Minor, Micro;
3386 Triple.getEnvironmentVersion(Major, Minor, Micro);
3387 if (Major || Minor || Micro)
3388 return VersionTuple(Major, Minor, Micro);
3389
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00003390 if (IsWindowsMSVC) {
3391 VersionTuple MSVT = TC.getMSVCVersionFromExe();
3392 if (!MSVT.empty())
3393 return MSVT;
3394
3395 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
3396 return VersionTuple(18);
3397 }
David Majnemere11d3732015-06-08 00:22:46 +00003398 }
3399 return VersionTuple();
3400}
3401
Diego Novilloa0545962015-07-10 18:00:07 +00003402static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3403 const InputInfo &Output, const ArgList &Args,
3404 ArgStringList &CmdArgs) {
3405 auto *ProfileGenerateArg = Args.getLastArg(
3406 options::OPT_fprofile_instr_generate,
3407 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003408 options::OPT_fprofile_generate_EQ,
3409 options::OPT_fno_profile_instr_generate);
3410 if (ProfileGenerateArg &&
3411 ProfileGenerateArg->getOption().matches(
3412 options::OPT_fno_profile_instr_generate))
3413 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003414
3415 auto *ProfileUseArg = Args.getLastArg(
3416 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003417 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3418 options::OPT_fno_profile_instr_use);
3419 if (ProfileUseArg &&
3420 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3421 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003422
3423 if (ProfileGenerateArg && ProfileUseArg)
3424 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003425 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003426
Diego Novillo758f3f52015-08-05 21:49:51 +00003427 if (ProfileGenerateArg) {
3428 if (ProfileGenerateArg->getOption().matches(
3429 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003430 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3431 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003432 else if (ProfileGenerateArg->getOption().matches(
3433 options::OPT_fprofile_generate_EQ)) {
3434 SmallString<128> Path(ProfileGenerateArg->getValue());
3435 llvm::sys::path::append(Path, "default.profraw");
3436 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003437 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3438 }
3439 // The default is to use Clang Instrumentation.
3440 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003441 }
Diego Novilloa0545962015-07-10 18:00:07 +00003442
Diego Novillo758f3f52015-08-05 21:49:51 +00003443 if (ProfileUseArg) {
3444 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003445 CmdArgs.push_back(Args.MakeArgString(
3446 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003447 else if ((ProfileUseArg->getOption().matches(
3448 options::OPT_fprofile_use_EQ) ||
3449 ProfileUseArg->getOption().matches(
3450 options::OPT_fprofile_instr_use))) {
3451 SmallString<128> Path(
3452 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3453 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3454 llvm::sys::path::append(Path, "default.profdata");
3455 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003456 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003457 }
Diego Novilloa0545962015-07-10 18:00:07 +00003458 }
3459
3460 if (Args.hasArg(options::OPT_ftest_coverage) ||
3461 Args.hasArg(options::OPT_coverage))
3462 CmdArgs.push_back("-femit-coverage-notes");
3463 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3464 false) ||
3465 Args.hasArg(options::OPT_coverage))
3466 CmdArgs.push_back("-femit-coverage-data");
3467
Diego Novilloc4b94da2015-08-05 23:27:40 +00003468 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3469 options::OPT_fno_coverage_mapping, false) &&
3470 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003471 D.Diag(diag::err_drv_argument_only_allowed_with)
3472 << "-fcoverage-mapping"
3473 << "-fprofile-instr-generate";
3474
Diego Novilloc4b94da2015-08-05 23:27:40 +00003475 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3476 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003477 CmdArgs.push_back("-fcoverage-mapping");
3478
3479 if (C.getArgs().hasArg(options::OPT_c) ||
3480 C.getArgs().hasArg(options::OPT_S)) {
3481 if (Output.isFilename()) {
3482 CmdArgs.push_back("-coverage-file");
3483 SmallString<128> CoverageFilename;
3484 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3485 CoverageFilename = FinalOutput->getValue();
3486 } else {
3487 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3488 }
3489 if (llvm::sys::path::is_relative(CoverageFilename)) {
3490 SmallString<128> Pwd;
3491 if (!llvm::sys::fs::current_path(Pwd)) {
3492 llvm::sys::path::append(Pwd, CoverageFilename);
3493 CoverageFilename.swap(Pwd);
3494 }
3495 }
3496 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3497 }
3498 }
3499}
3500
Paul Robinsond083b9a2015-12-16 17:25:27 +00003501static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3502 ArgStringList &CmdArgs) {
3503 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3504 false) ||
3505 Args.hasFlag(options::OPT_fprofile_generate,
3506 options::OPT_fno_profile_instr_generate, false) ||
3507 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3508 options::OPT_fno_profile_instr_generate, false) ||
3509 Args.hasFlag(options::OPT_fprofile_instr_generate,
3510 options::OPT_fno_profile_instr_generate, false) ||
3511 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3512 options::OPT_fno_profile_instr_generate, false) ||
3513 Args.hasArg(options::OPT_fcreate_profile) ||
3514 Args.hasArg(options::OPT_coverage)))
3515 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3516}
3517
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003518/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3519/// smooshes them together with platform defaults, to decide whether
3520/// this compile should be using PIC mode or not. Returns a tuple of
3521/// (RelocationModel, PICLevel, IsPIE).
3522static std::tuple<llvm::Reloc::Model, unsigned, bool>
3523ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3524 const ArgList &Args) {
3525 // FIXME: why does this code...and so much everywhere else, use both
3526 // ToolChain.getTriple() and Triple?
3527 bool PIE = ToolChain.isPIEDefault();
3528 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003529 // The Darwin/MachO default to use PIC does not apply when using -static.
3530 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3531 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003532 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003533 bool IsPICLevelTwo = PIC;
3534
3535 bool KernelOrKext =
3536 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3537
3538 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003539 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003540 switch (ToolChain.getArch()) {
3541 case llvm::Triple::arm:
3542 case llvm::Triple::armeb:
3543 case llvm::Triple::thumb:
3544 case llvm::Triple::thumbeb:
3545 case llvm::Triple::aarch64:
3546 case llvm::Triple::mips:
3547 case llvm::Triple::mipsel:
3548 case llvm::Triple::mips64:
3549 case llvm::Triple::mips64el:
3550 PIC = true; // "-fpic"
3551 break;
3552
3553 case llvm::Triple::x86:
3554 case llvm::Triple::x86_64:
3555 PIC = true; // "-fPIC"
3556 IsPICLevelTwo = true;
3557 break;
3558
3559 default:
3560 break;
3561 }
3562 }
3563
3564 // OpenBSD-specific defaults for PIE
3565 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3566 switch (ToolChain.getArch()) {
3567 case llvm::Triple::mips64:
3568 case llvm::Triple::mips64el:
3569 case llvm::Triple::sparcel:
3570 case llvm::Triple::x86:
3571 case llvm::Triple::x86_64:
3572 IsPICLevelTwo = false; // "-fpie"
3573 break;
3574
3575 case llvm::Triple::ppc:
3576 case llvm::Triple::sparc:
3577 case llvm::Triple::sparcv9:
3578 IsPICLevelTwo = true; // "-fPIE"
3579 break;
3580
3581 default:
3582 break;
3583 }
3584 }
3585
3586 // The last argument relating to either PIC or PIE wins, and no
3587 // other argument is used. If the last argument is any flavor of the
3588 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3589 // option implicitly enables PIC at the same level.
3590 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3591 options::OPT_fpic, options::OPT_fno_pic,
3592 options::OPT_fPIE, options::OPT_fno_PIE,
3593 options::OPT_fpie, options::OPT_fno_pie);
3594 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3595 // is forced, then neither PIC nor PIE flags will have no effect.
3596 if (!ToolChain.isPICDefaultForced()) {
3597 if (LastPICArg) {
3598 Option O = LastPICArg->getOption();
3599 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3600 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3601 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3602 PIC =
3603 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3604 IsPICLevelTwo =
3605 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3606 } else {
3607 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003608 if (Triple.isPS4CPU()) {
3609 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3610 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3611 if (Model != "kernel") {
3612 PIC = true;
3613 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3614 << LastPICArg->getSpelling();
3615 }
3616 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003617 }
3618 }
3619 }
3620
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003621 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3622 // PIC level would've been set to level 1, force it back to level 2 PIC
3623 // instead.
3624 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003625 IsPICLevelTwo |= ToolChain.isPICDefault();
3626
James Y Knightc4015d32015-08-21 04:14:55 +00003627 // This kernel flags are a trump-card: they will disable PIC/PIE
3628 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003629 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3630 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003631 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003632
3633 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3634 // This is a very special mode. It trumps the other modes, almost no one
3635 // uses it, and it isn't even valid on any OS but Darwin.
3636 if (!ToolChain.getTriple().isOSDarwin())
3637 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3638 << A->getSpelling() << ToolChain.getTriple().str();
3639
3640 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3641
3642 // Only a forced PIC mode can cause the actual compile to have PIC defines
3643 // etc., no flags are sufficient. This behavior was selected to closely
3644 // match that of llvm-gcc and Apple GCC before that.
3645 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3646
3647 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3648 }
3649
3650 if (PIC)
3651 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3652
3653 return std::make_tuple(llvm::Reloc::Static, 0, false);
3654}
3655
3656static const char *RelocationModelName(llvm::Reloc::Model Model) {
3657 switch (Model) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003658 case llvm::Reloc::Static:
3659 return "static";
3660 case llvm::Reloc::PIC_:
3661 return "pic";
3662 case llvm::Reloc::DynamicNoPIC:
3663 return "dynamic-no-pic";
3664 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003665 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003666}
3667
3668static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3669 ArgStringList &CmdArgs) {
3670 llvm::Reloc::Model RelocationModel;
3671 unsigned PICLevel;
3672 bool IsPIE;
3673 std::tie(RelocationModel, PICLevel, IsPIE) =
3674 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3675
3676 if (RelocationModel != llvm::Reloc::Static)
3677 CmdArgs.push_back("-KPIC");
3678}
3679
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003680void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003681 const InputInfo &Output, const InputInfoList &Inputs,
3682 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003683 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3684 const llvm::Triple Triple(TripleStr);
3685
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003686 bool KernelOrKext =
3687 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003688 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003689 ArgStringList CmdArgs;
3690
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003691 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003692 bool IsWindowsCygnus =
3693 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003694 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003695 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003696
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003697 // Check number of inputs for sanity. We need at least one input.
3698 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003699 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003700 // CUDA compilation may have multiple inputs (source file + results of
3701 // device-side compilations). All other jobs are expected to have exactly one
3702 // input.
3703 bool IsCuda = types::isCuda(Input.getType());
3704 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003705
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003706 // Invoke ourselves in -cc1 mode.
3707 //
3708 // FIXME: Implement custom jobs for internal actions.
3709 CmdArgs.push_back("-cc1");
3710
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003711 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003712 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003713 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003714
Artem Belevichfa11ab52015-11-17 22:28:46 +00003715 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003716 if (IsCuda) {
3717 // FIXME: We need a (better) way to pass information about
3718 // particular compilation pass we're constructing here. For now we
3719 // can check which toolchain we're using and pick the other one to
3720 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003721 if (&getToolChain() == C.getCudaDeviceToolChain())
3722 AuxToolChain = C.getCudaHostToolChain();
3723 else if (&getToolChain() == C.getCudaHostToolChain())
3724 AuxToolChain = C.getCudaDeviceToolChain();
3725 else
3726 llvm_unreachable("Can't figure out CUDA compilation mode.");
3727 assert(AuxToolChain != nullptr && "No aux toolchain.");
3728 CmdArgs.push_back("-aux-triple");
3729 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3730 }
3731
James Y Knight2db38f32015-08-15 03:45:25 +00003732 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3733 Triple.getArch() == llvm::Triple::thumb)) {
3734 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003735 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003736 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003737 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003738 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003739 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003740 }
3741
Tim Northover336f1892014-03-29 13:16:12 +00003742 // Push all default warning arguments that are specific to
3743 // the given target. These come before user provided warning options
3744 // are provided.
3745 getToolChain().addClangWarningOptions(CmdArgs);
3746
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003747 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003748 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003749
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003750 if (isa<AnalyzeJobAction>(JA)) {
3751 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3752 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003753 } else if (isa<MigrateJobAction>(JA)) {
3754 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003755 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003756 if (Output.getType() == types::TY_Dependencies)
3757 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003758 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003759 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003760 if (Args.hasArg(options::OPT_rewrite_objc) &&
3761 !Args.hasArg(options::OPT_g_Group))
3762 CmdArgs.push_back("-P");
3763 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003764 } else if (isa<AssembleJobAction>(JA)) {
3765 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003766
David Blaikie9260ed62013-07-25 21:19:01 +00003767 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003768
3769 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003770 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003771 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003772 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003773 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003774
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003775 if (JA.getType() == types::TY_Nothing)
3776 CmdArgs.push_back("-fsyntax-only");
3777 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003778 CmdArgs.push_back("-emit-pch");
3779 else
3780 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003781 } else if (isa<VerifyPCHJobAction>(JA)) {
3782 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003783 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003784 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3785 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003786 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003787 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003788 } else if (JA.getType() == types::TY_LLVM_IR ||
3789 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003790 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003791 } else if (JA.getType() == types::TY_LLVM_BC ||
3792 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003793 CmdArgs.push_back("-emit-llvm-bc");
3794 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003795 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003796 } else if (JA.getType() == types::TY_AST) {
3797 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003798 } else if (JA.getType() == types::TY_ModuleFile) {
3799 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003800 } else if (JA.getType() == types::TY_RewrittenObjC) {
3801 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003802 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003803 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3804 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003805 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003806 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003807 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003808 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003809
3810 // Preserve use-list order by default when emitting bitcode, so that
3811 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3812 // same result as running passes here. For LTO, we don't need to preserve
3813 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003814 if (JA.getType() == types::TY_LLVM_BC)
3815 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003816
3817 if (D.isUsingLTO())
3818 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003819 }
3820
Teresa Johnsonaff22322015-12-07 19:21:34 +00003821 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3822 if (!types::isLLVMIR(Input.getType()))
3823 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3824 << "-x ir";
3825 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3826 }
3827
Steven Wu574b0f22016-03-01 01:07:58 +00003828 // Embed-bitcode option.
3829 if (C.getDriver().embedBitcodeEnabled() &&
3830 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3831 // Add flags implied by -fembed-bitcode.
Steven Wu27fb5222016-05-11 16:26:03 +00003832 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
Steven Wu574b0f22016-03-01 01:07:58 +00003833 // Disable all llvm IR level optimizations.
3834 CmdArgs.push_back("-disable-llvm-optzns");
3835 }
3836 if (C.getDriver().embedBitcodeMarkerOnly())
Steven Wu27fb5222016-05-11 16:26:03 +00003837 CmdArgs.push_back("-fembed-bitcode=marker");
Steven Wu574b0f22016-03-01 01:07:58 +00003838
Justin Bognera88f0122014-06-20 22:59:50 +00003839 // We normally speed up the clang process a bit by skipping destructors at
3840 // exit, but when we're generating diagnostics we can rely on some of the
3841 // cleanup.
3842 if (!C.isForDiagnostics())
3843 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003845// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003846#ifdef NDEBUG
3847 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003848 // Discard LLVM value names in -asserts builds.
3849 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003850#endif
3851
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003852 // Set the main file name, so that debug info works even with
3853 // -save-temps.
3854 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003855 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003856
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003857 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003858 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003859 if (Args.hasArg(options::OPT_static))
3860 CmdArgs.push_back("-static-define");
3861
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003862 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003863 // Enable region store model by default.
3864 CmdArgs.push_back("-analyzer-store=region");
3865
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003866 // Treat blocks as analysis entry points.
3867 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3868
Ted Kremenek49c79792011-03-24 00:28:47 +00003869 CmdArgs.push_back("-analyzer-eagerly-assume");
3870
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003871 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003872 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003873 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003874
Devin Coughlin65c77082016-01-21 20:09:49 +00003875 if (!IsWindowsMSVC) {
3876 CmdArgs.push_back("-analyzer-checker=unix");
3877 } else {
3878 // Enable "unix" checkers that also work on Windows.
3879 CmdArgs.push_back("-analyzer-checker=unix.API");
3880 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3881 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3882 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3883 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3884 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3885 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003886
Sean Evesonb38c32b2016-01-06 10:03:58 +00003887 // Disable some unix checkers for PS4.
3888 if (IsPS4CPU) {
3889 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3890 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3891 }
3892
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003893 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003894 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003895
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003896 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003897
Artem Belevichba558952015-05-06 18:20:23 +00003898 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003899 CmdArgs.push_back("-analyzer-checker=cplusplus");
3900
Sean Evesonb38c32b2016-01-06 10:03:58 +00003901 if (!IsPS4CPU) {
3902 CmdArgs.push_back(
3903 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3904 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3905 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3906 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3907 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3908 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3909 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003910
3911 // Default nullability checks.
3912 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3913 CmdArgs.push_back(
3914 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003915 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003916
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003917 // Set the output format. The default is plist, for (lame) historical
3918 // reasons.
3919 CmdArgs.push_back("-analyzer-output");
3920 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003921 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003922 else
3923 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003924
Ted Kremenekfe449a22010-03-22 22:32:05 +00003925 // Disable the presentation of standard compiler warnings when
3926 // using --analyze. We only want to show static analyzer diagnostics
3927 // or frontend errors.
3928 CmdArgs.push_back("-w");
3929
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003930 // Add -Xanalyzer arguments when running as analyzer.
3931 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003932 }
3933
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003934 CheckCodeGenerationOptions(D, Args);
3935
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003936 llvm::Reloc::Model RelocationModel;
3937 unsigned PICLevel;
3938 bool IsPIE;
3939 std::tie(RelocationModel, PICLevel, IsPIE) =
3940 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003941
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003942 const char *RMName = RelocationModelName(RelocationModel);
3943 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003944 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003945 CmdArgs.push_back(RMName);
3946 }
3947 if (PICLevel > 0) {
3948 CmdArgs.push_back("-pic-level");
3949 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3950 if (IsPIE) {
3951 CmdArgs.push_back("-pie-level");
3952 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003953 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003954 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003955
Renato Golin4854d802015-11-09 12:40:41 +00003956 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3957 CmdArgs.push_back("-meabi");
3958 CmdArgs.push_back(A->getValue());
3959 }
3960
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003961 CmdArgs.push_back("-mthread-model");
3962 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3963 CmdArgs.push_back(A->getValue());
3964 else
3965 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3966
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003967 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3968
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003969 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3970 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003971 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003972
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003973 // LLVM Code Generator Options.
3974
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003975 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3976 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003977 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3978 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003979 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003980 CmdArgs.push_back(A->getValue());
3981 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003982 }
3983 }
3984
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003985 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3986 StringRef v = A->getValue();
3987 CmdArgs.push_back("-mllvm");
3988 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3989 A->claim();
3990 }
3991
Nirav Daved2f44d82016-04-05 17:50:43 +00003992 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3993 true))
3994 CmdArgs.push_back("-fno-jump-tables");
3995
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003996 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3997 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003998 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003999 }
4000
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004001 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
4002 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004003 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00004004 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004005 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00004006 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
4007 CmdArgs.push_back("-fpcc-struct-return");
4008 } else {
4009 assert(A->getOption().matches(options::OPT_freg_struct_return));
4010 CmdArgs.push_back("-freg-struct-return");
4011 }
4012 }
4013
Roman Divacky65b88cd2011-03-01 17:40:53 +00004014 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
Alexey Bataeva7547182016-05-18 09:06:38 +00004015 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
Roman Divacky65b88cd2011-03-01 17:40:53 +00004016
Rafael Espindola224dd632011-12-14 21:02:23 +00004017 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004018 CmdArgs.push_back("-mdisable-fp-elim");
4019 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
4020 options::OPT_fno_zero_initialized_in_bss))
4021 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004022
4023 bool OFastEnabled = isOptimizationLevelFast(Args);
4024 // If -Ofast is the optimization level, then -fstrict-aliasing should be
4025 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004026 OptSpecifier StrictAliasingAliasOption =
4027 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004028 // We turn strict aliasing off by default if we're in CL mode, since MSVC
4029 // doesn't do any TBAA.
4030 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004031 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00004032 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00004033 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00004034 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
4035 options::OPT_fno_struct_path_tbaa))
4036 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00004037 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
4038 false))
4039 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00004040 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
4041 options::OPT_fno_strict_vtable_pointers,
4042 false))
4043 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00004044 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
4045 options::OPT_fno_optimize_sibling_calls))
4046 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004047
Eric Christopher006208c2013-04-04 06:29:47 +00004048 // Handle segmented stacks.
4049 if (Args.hasArg(options::OPT_fsplit_stack))
4050 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004051
4052 // If -Ofast is the optimization level, then -ffast-math should be enabled.
4053 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004054 OptSpecifier FastMathAliasOption =
4055 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4056
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004057 // Handle various floating point optimization flags, mapping them to the
4058 // appropriate LLVM code generation flags. The pattern for all of these is to
4059 // default off the codegen optimizations, and if any flag enables them and no
4060 // flag disables them after the flag enabling them, enable the codegen
4061 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004062 if (Arg *A = Args.getLastArg(
4063 options::OPT_ffast_math, FastMathAliasOption,
4064 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4065 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4066 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004067 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4068 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004069 A->getOption().getID() != options::OPT_fhonor_infinities)
4070 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004071 if (Arg *A = Args.getLastArg(
4072 options::OPT_ffast_math, FastMathAliasOption,
4073 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4074 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4075 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004076 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4077 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004078 A->getOption().getID() != options::OPT_fhonor_nans)
4079 CmdArgs.push_back("-menable-no-nans");
4080
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004081 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4082 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004083 if (Arg *A =
4084 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4085 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4086 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004087 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4088 // However, turning *off* -ffast_math merely restores the toolchain default
4089 // (which may be false).
4090 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4091 A->getOption().getID() == options::OPT_ffast_math ||
4092 A->getOption().getID() == options::OPT_Ofast)
4093 MathErrno = false;
4094 else if (A->getOption().getID() == options::OPT_fmath_errno)
4095 MathErrno = true;
4096 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004097 if (MathErrno)
4098 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004099
4100 // There are several flags which require disabling very specific
4101 // optimizations. Any of these being disabled forces us to turn off the
4102 // entire set of LLVM optimizations, so collect them through all the flag
4103 // madness.
4104 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004105 if (Arg *A = Args.getLastArg(
4106 options::OPT_ffast_math, FastMathAliasOption,
4107 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4108 options::OPT_fno_unsafe_math_optimizations,
4109 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004110 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4111 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004112 A->getOption().getID() != options::OPT_fno_associative_math)
4113 AssociativeMath = true;
4114 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004115 if (Arg *A = Args.getLastArg(
4116 options::OPT_ffast_math, FastMathAliasOption,
4117 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4118 options::OPT_fno_unsafe_math_optimizations,
4119 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004120 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4121 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004122 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4123 ReciprocalMath = true;
4124 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004125 if (Arg *A = Args.getLastArg(
4126 options::OPT_ffast_math, FastMathAliasOption,
4127 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4128 options::OPT_fno_unsafe_math_optimizations,
4129 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004130 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4131 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004132 A->getOption().getID() != options::OPT_fsigned_zeros)
4133 SignedZeros = false;
4134 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004135 if (Arg *A = Args.getLastArg(
4136 options::OPT_ffast_math, FastMathAliasOption,
4137 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4138 options::OPT_fno_unsafe_math_optimizations,
4139 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004140 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4141 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004142 A->getOption().getID() != options::OPT_ftrapping_math)
4143 TrappingMath = false;
4144 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4145 !TrappingMath)
4146 CmdArgs.push_back("-menable-unsafe-fp-math");
4147
Sanjay Patel76c9e092015-01-23 16:40:50 +00004148 if (!SignedZeros)
4149 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004150
Sanjay Patel359b1052015-04-09 15:03:23 +00004151 if (ReciprocalMath)
4152 CmdArgs.push_back("-freciprocal-math");
4153
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004154 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004155 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004156 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004157 options::OPT_ffp_contract)) {
4158 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004159 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004160 if (Val == "fast" || Val == "on" || Val == "off") {
4161 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4162 } else {
4163 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004164 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004165 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004166 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4167 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004168 // If fast-math is set then set the fp-contract mode to fast.
4169 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4170 }
4171 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004172
Sanjay Patel2987c292015-06-11 14:53:41 +00004173 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004174
Bob Wilson6a039162012-07-19 03:52:53 +00004175 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4176 // and if we find them, tell the frontend to provide the appropriate
4177 // preprocessor macros. This is distinct from enabling any optimizations as
4178 // these options induce language changes which must survive serialization
4179 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004180 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4181 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004182 if (!A->getOption().matches(options::OPT_fno_fast_math))
4183 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004184 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4185 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004186 if (A->getOption().matches(options::OPT_ffinite_math_only))
4187 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004188
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004189 // Decide whether to use verbose asm. Verbose assembly is the default on
4190 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004191 bool IsIntegratedAssemblerDefault =
4192 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004193 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004194 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004195 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004196 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004197
Rafael Espindolab8a12932015-05-22 20:44:03 +00004198 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4199 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004200 CmdArgs.push_back("-no-integrated-as");
4201
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004202 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4203 CmdArgs.push_back("-mdebug-pass");
4204 CmdArgs.push_back("Structure");
4205 }
4206 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4207 CmdArgs.push_back("-mdebug-pass");
4208 CmdArgs.push_back("Arguments");
4209 }
4210
Justin Lebar710a35f2016-01-25 22:36:35 +00004211 // Enable -mconstructor-aliases except on darwin, where we have to work around
4212 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4213 // aliases aren't supported.
4214 if (!getToolChain().getTriple().isOSDarwin() &&
4215 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004216 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004217
John McCall7ef5cb32011-03-18 02:56:14 +00004218 // Darwin's kernel doesn't support guard variables; just die if we
4219 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004220 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004221 CmdArgs.push_back("-fforbid-guard-variables");
4222
Akira Hatanaka02028482015-11-12 17:21:22 +00004223 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4224 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004225 CmdArgs.push_back("-mms-bitfields");
4226 }
John McCall8517abc2010-02-19 02:45:38 +00004227
Daniel Dunbar306945d2009-09-16 06:17:29 +00004228 // This is a coarse approximation of what llvm-gcc actually does, both
4229 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4230 // complicated ways.
4231 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004232 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4233 options::OPT_fno_asynchronous_unwind_tables,
4234 (getToolChain().IsUnwindTablesDefault() ||
4235 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4236 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004237 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4238 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004239 CmdArgs.push_back("-munwind-tables");
4240
Chandler Carruth05fb5852012-11-21 23:40:23 +00004241 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004242
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004243 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4244 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004245 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004246 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004247
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004248 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004249 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004250
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004251 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004252 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004253 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004254 }
4255
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004256 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004257 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004258 if (!CPU.empty()) {
4259 CmdArgs.push_back("-target-cpu");
4260 CmdArgs.push_back(Args.MakeArgString(CPU));
4261 }
4262
Rafael Espindolaeb265472013-08-21 21:59:03 +00004263 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4264 CmdArgs.push_back("-mfpmath");
4265 CmdArgs.push_back(A->getValue());
4266 }
4267
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004268 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004269 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004270
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004271 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004272 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004273 default:
4274 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004275
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004276 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004277 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004278 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004279 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004280 // Use the effective triple, which takes into account the deployment target.
4281 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004282 break;
4283
Tim Northover573cbee2014-05-24 12:52:07 +00004284 case llvm::Triple::aarch64:
4285 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004286 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004287 break;
4288
Eric Christopher0b26a612010-03-02 02:41:08 +00004289 case llvm::Triple::mips:
4290 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004291 case llvm::Triple::mips64:
4292 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004293 AddMIPSTargetArgs(Args, CmdArgs);
4294 break;
4295
Ulrich Weigand8afad612014-07-28 13:17:52 +00004296 case llvm::Triple::ppc:
4297 case llvm::Triple::ppc64:
4298 case llvm::Triple::ppc64le:
4299 AddPPCTargetArgs(Args, CmdArgs);
4300 break;
4301
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004302 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004303 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004304 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004305 AddSparcTargetArgs(Args, CmdArgs);
4306 break;
4307
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00004308 case llvm::Triple::systemz:
4309 AddSystemZTargetArgs(Args, CmdArgs);
4310 break;
4311
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004312 case llvm::Triple::x86:
4313 case llvm::Triple::x86_64:
4314 AddX86TargetArgs(Args, CmdArgs);
4315 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004316
Jacques Pienaard964cc22016-03-28 21:02:54 +00004317 case llvm::Triple::lanai:
4318 AddLanaiTargetArgs(Args, CmdArgs);
4319 break;
4320
Tony Linthicum76329bf2011-12-12 21:14:55 +00004321 case llvm::Triple::hexagon:
4322 AddHexagonTargetArgs(Args, CmdArgs);
4323 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004324
4325 case llvm::Triple::wasm32:
4326 case llvm::Triple::wasm64:
4327 AddWebAssemblyTargetArgs(Args, CmdArgs);
4328 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004329 }
4330
Douglas Katzman3459ce22015-10-08 04:24:12 +00004331 // The 'g' groups options involve a somewhat intricate sequence of decisions
4332 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004333 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004334 // * what level of debug info to generate
4335 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004336 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004337 // This avoids having to monkey around further in cc1 other than to disable
4338 // codeview if not running in a Windows environment. Perhaps even that
4339 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004340 unsigned DwarfVersion = 0;
4341 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4342 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004343 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004344 bool EmitCodeView = false;
4345
Hans Wennborg75958c42013-08-08 00:17:41 +00004346 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004347 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004348 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004349 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004350
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004351 // Pass the linker version in use.
4352 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4353 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004354 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004355 }
4356
Eric Christopherb7d97e92013-04-03 01:58:53 +00004357 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004358 CmdArgs.push_back("-momit-leaf-frame-pointer");
4359
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004360 // Explicitly error on some things we know we don't support and can't just
4361 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004362 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4363 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004364 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004365 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004366 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4367 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004368 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004369 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004370 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004371 }
4372
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004373 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004374 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004375 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004376 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004377 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4378 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004379 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004380 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004381 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004382
Chad Rosierbe10f982011-08-02 17:58:04 +00004383 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004384 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004385 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4386 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004387 }
4388
Rafael Espindola08a692a2010-03-07 04:46:18 +00004389 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004390 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004391 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004392 // If the last option explicitly specified a debug-info level, use it.
4393 if (A->getOption().matches(options::OPT_gN_Group)) {
4394 DebugInfoKind = DebugLevelToInfoKind(*A);
4395 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4396 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4397 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004398 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004399 A->getIndex() > SplitDwarfArg->getIndex())
4400 SplitDwarfArg = nullptr;
4401 } else
4402 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004403 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004404 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004405
Paul Robinson0334a042015-12-19 19:41:48 +00004406 // If a debugger tuning argument appeared, remember it.
4407 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4408 options::OPT_ggdbN_Group)) {
4409 if (A->getOption().matches(options::OPT_glldb))
4410 DebuggerTuning = llvm::DebuggerKind::LLDB;
4411 else if (A->getOption().matches(options::OPT_gsce))
4412 DebuggerTuning = llvm::DebuggerKind::SCE;
4413 else
4414 DebuggerTuning = llvm::DebuggerKind::GDB;
4415 }
4416
4417 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004418 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004419 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004420 DwarfVersion = DwarfVersionNum(A->getSpelling());
4421
Reid Kleckner124955a2015-08-05 18:51:13 +00004422 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004423 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4424 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4425 // DwarfVersion remains at 0 if no explicit choice was made.
4426 CmdArgs.push_back("-gcodeview");
4427 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004428 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004429 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4430 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004431
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004432 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4433 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004434
4435 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004436 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004437 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004438 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004439
Eric Christopher138c32b2013-09-13 22:37:55 +00004440 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004441 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004442 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004443 CmdArgs.push_back("-dwarf-ext-refs");
4444 CmdArgs.push_back("-fmodule-format=obj");
4445 }
4446
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004447 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4448 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004449 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004450 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004451 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004452 CmdArgs.push_back("-backend-option");
4453 CmdArgs.push_back("-split-dwarf=Enable");
4454 }
4455
Douglas Katzman3459ce22015-10-08 04:24:12 +00004456 // After we've dealt with all combinations of things that could
4457 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4458 // figure out if we need to "upgrade" it to standalone debug info.
4459 // We parse these two '-f' options whether or not they will be used,
4460 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4461 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4462 options::OPT_fno_standalone_debug,
4463 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004464 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4465 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004466 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4467 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004468
Eric Christopher138c32b2013-09-13 22:37:55 +00004469 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4470 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4471 CmdArgs.push_back("-backend-option");
4472 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4473 }
Eric Christophereec89c22013-06-18 00:03:50 +00004474
Eric Christopher0d403d22014-02-14 01:27:03 +00004475 // -gdwarf-aranges turns on the emission of the aranges section in the
4476 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004477 // Always enabled on the PS4.
4478 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004479 CmdArgs.push_back("-backend-option");
4480 CmdArgs.push_back("-generate-arange-section");
4481 }
4482
David Blaikief36d9ba2014-01-27 18:52:43 +00004483 if (Args.hasFlag(options::OPT_fdebug_types_section,
4484 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004485 CmdArgs.push_back("-backend-option");
4486 CmdArgs.push_back("-generate-type-units");
4487 }
Eric Christophereec89c22013-06-18 00:03:50 +00004488
Dan Gohmana5b804b2016-01-07 00:50:27 +00004489 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4490 // default.
4491 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4492 Triple.getArch() == llvm::Triple::wasm32 ||
4493 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004494
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004495 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004496 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004497 CmdArgs.push_back("-ffunction-sections");
4498 }
4499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004500 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4501 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004502 CmdArgs.push_back("-fdata-sections");
4503 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004504
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004505 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004506 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004507 CmdArgs.push_back("-fno-unique-section-names");
4508
Chris Lattner3c77a352010-06-22 00:03:40 +00004509 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4510
Diego Novilloa0545962015-07-10 18:00:07 +00004511 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004512
Paul Robinsond083b9a2015-12-16 17:25:27 +00004513 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4514 if (getToolChain().getTriple().isPS4CPU())
4515 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4516
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004517 // Pass options for controlling the default header search paths.
4518 if (Args.hasArg(options::OPT_nostdinc)) {
4519 CmdArgs.push_back("-nostdsysteminc");
4520 CmdArgs.push_back("-nobuiltininc");
4521 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004522 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004523 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004524 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4525 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4526 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004527
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004528 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004529 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004530 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004531
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004532 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4533
Ted Kremenekf7639e12012-03-06 20:06:33 +00004534 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004535 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004536 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004537 options::OPT_ccc_arcmt_modify,
4538 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004539 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004540 switch (A->getOption().getID()) {
4541 default:
4542 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004543 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004544 CmdArgs.push_back("-arcmt-check");
4545 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004546 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004547 CmdArgs.push_back("-arcmt-modify");
4548 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004549 case options::OPT_ccc_arcmt_migrate:
4550 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004551 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004552 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004553
4554 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4555 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004556 break;
John McCalld70fb982011-06-15 23:25:17 +00004557 }
4558 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004559 } else {
4560 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4561 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4562 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004563 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004564
Ted Kremenekf7639e12012-03-06 20:06:33 +00004565 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4566 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004567 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4568 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004569 }
4570 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004571 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004572
4573 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004574 options::OPT_objcmt_migrate_subscripting,
4575 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004576 // None specified, means enable them all.
4577 CmdArgs.push_back("-objcmt-migrate-literals");
4578 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004579 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004580 } else {
4581 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4582 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004583 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004584 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004585 } else {
4586 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4587 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4588 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4589 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4590 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4591 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004592 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004593 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4594 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4595 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4596 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4597 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4598 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4599 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004600 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004601 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004602 }
4603
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004604 // Add preprocessing options like -I, -D, etc. if we are using the
4605 // preprocessor.
4606 //
4607 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004608 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004609 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4610 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004611
Rafael Espindolaa7431922011-07-21 23:40:37 +00004612 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4613 // that "The compiler can only warn and ignore the option if not recognized".
4614 // When building with ccache, it will pass -D options to clang even on
4615 // preprocessed inputs and configure concludes that -fPIC is not supported.
4616 Args.ClaimAllArgs(options::OPT_D);
4617
Alp Toker7874bdc2013-11-15 20:40:58 +00004618 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004619 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4620 if (A->getOption().matches(options::OPT_O4)) {
4621 CmdArgs.push_back("-O3");
4622 D.Diag(diag::warn_O4_is_O3);
4623 } else {
4624 A->render(Args, CmdArgs);
4625 }
4626 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004627
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004628 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004629 for (const Arg *A :
4630 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4631 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004632 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004633 }
4634
Rafael Espindola577637a2015-01-03 00:06:04 +00004635 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004636
Richard Smith3be1cb22014-08-07 00:24:21 +00004637 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004638 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004639 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4640 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004641 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004642 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004643
4644 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004645 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004646 //
4647 // If a std is supplied, only add -trigraphs if it follows the
4648 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004649 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004650 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4651 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004652 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004653 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004654 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004655 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004656 else
4657 Std->render(Args, CmdArgs);
4658
Nico Weber00721502014-12-23 22:32:37 +00004659 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004660 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004661 options::OPT_ftrigraphs,
4662 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004663 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004664 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004665 } else {
4666 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004667 //
4668 // FIXME: Clang doesn't correctly handle -std= when the input language
4669 // doesn't match. For the time being just ignore this for C++ inputs;
4670 // eventually we want to do all the standard defaulting here instead of
4671 // splitting it between the driver and clang -cc1.
4672 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004673 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4674 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004675 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004676 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004677
Nico Weber00721502014-12-23 22:32:37 +00004678 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4679 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004680 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004681
Richard Smith282b4492013-09-04 22:50:31 +00004682 // GCC's behavior for -Wwrite-strings is a bit strange:
4683 // * In C, this "warning flag" changes the types of string literals from
4684 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4685 // for the discarded qualifier.
4686 // * In C++, this is just a normal warning flag.
4687 //
4688 // Implementing this warning correctly in C is hard, so we follow GCC's
4689 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4690 // a non-const char* in C, rather than using this crude hack.
4691 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004692 // FIXME: This should behave just like a warning flag, and thus should also
4693 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4694 Arg *WriteStrings =
4695 Args.getLastArg(options::OPT_Wwrite_strings,
4696 options::OPT_Wno_write_strings, options::OPT_w);
4697 if (WriteStrings &&
4698 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004699 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004700 }
4701
Chandler Carruth61fbf622011-04-23 09:27:53 +00004702 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004703 // during C++ compilation, which it is by default. GCC keeps this define even
4704 // in the presence of '-w', match this behavior bug-for-bug.
4705 if (types::isCXX(InputType) &&
4706 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4707 true)) {
4708 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004709 }
4710
Chandler Carruthe0391482010-05-22 02:21:53 +00004711 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4712 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4713 if (Asm->getOption().matches(options::OPT_fasm))
4714 CmdArgs.push_back("-fgnu-keywords");
4715 else
4716 CmdArgs.push_back("-fno-gnu-keywords");
4717 }
4718
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004719 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4720 CmdArgs.push_back("-fno-dwarf-directory-asm");
4721
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004722 if (ShouldDisableAutolink(Args, getToolChain()))
4723 CmdArgs.push_back("-fno-autolink");
4724
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004725 // Add in -fdebug-compilation-dir if necessary.
4726 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004727
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004728 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4729 StringRef Map = A->getValue();
4730 if (Map.find('=') == StringRef::npos)
4731 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4732 else
4733 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4734 A->claim();
4735 }
4736
Richard Smith9a568822011-11-21 19:36:32 +00004737 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4738 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004739 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004740 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004741 }
4742
Richard Smith79c927b2013-11-06 19:31:51 +00004743 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4744 CmdArgs.push_back("-foperator-arrow-depth");
4745 CmdArgs.push_back(A->getValue());
4746 }
4747
Richard Smith9a568822011-11-21 19:36:32 +00004748 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4749 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004750 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004751 }
4752
Richard Smitha3d3bd22013-05-08 02:12:03 +00004753 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4754 CmdArgs.push_back("-fconstexpr-steps");
4755 CmdArgs.push_back(A->getValue());
4756 }
4757
Richard Smithb3a14522013-02-22 01:59:51 +00004758 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4759 CmdArgs.push_back("-fbracket-depth");
4760 CmdArgs.push_back(A->getValue());
4761 }
4762
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004763 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4764 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004765 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004766 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004767 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4768 } else
4769 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004770 }
4771
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004772 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004773 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004774
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004775 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4776 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004777 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004778 }
David Chisnall5778fce2009-08-31 16:41:57 +00004779
Chris Lattnere23003d2010-01-09 21:54:33 +00004780 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4781 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004782 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004783 }
4784
Chris Lattnerb35583d2010-04-07 20:49:23 +00004785 CmdArgs.push_back("-ferror-limit");
4786 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004787 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004788 else
4789 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004790
Chandler Carrutha77a7272010-05-06 04:55:18 +00004791 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4792 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004793 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004794 }
4795
4796 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4797 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004798 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004799 }
4800
Richard Smithf6f003a2011-12-16 19:06:07 +00004801 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4802 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004803 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004804 }
4805
Nick Lewycky24653262014-12-16 21:39:02 +00004806 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4807 CmdArgs.push_back("-fspell-checking-limit");
4808 CmdArgs.push_back(A->getValue());
4809 }
4810
Daniel Dunbar2c978472009-11-04 06:24:47 +00004811 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004812 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004813 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004814 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004815 } else {
4816 // If -fmessage-length=N was not specified, determine whether this is a
4817 // terminal and, if so, implicitly define -fmessage-length appropriately.
4818 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004819 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004820 }
4821
John McCallb4a99d32013-02-19 01:57:35 +00004822 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4823 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4824 options::OPT_fvisibility_ms_compat)) {
4825 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4826 CmdArgs.push_back("-fvisibility");
4827 CmdArgs.push_back(A->getValue());
4828 } else {
4829 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4830 CmdArgs.push_back("-fvisibility");
4831 CmdArgs.push_back("hidden");
4832 CmdArgs.push_back("-ftype-visibility");
4833 CmdArgs.push_back("default");
4834 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004835 }
4836
Douglas Gregor08329632010-06-15 17:05:35 +00004837 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004838
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004839 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4840
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004841 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004842 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4843 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004844 CmdArgs.push_back("-ffreestanding");
4845
Daniel Dunbare357d562009-12-03 18:42:11 +00004846 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004847 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004848 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004849 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004850 // Emulated TLS is enabled by default on Android, and can be enabled manually
4851 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004852 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004853 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4854 EmulatedTLSDefault))
4855 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004856 // AltiVec-like language extensions aren't relevant for assembling.
4857 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004858 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004859 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4860 }
Richard Trieu91844232012-06-26 18:18:47 +00004861 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4862 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004863
Alexey Bataevdb390212015-05-20 04:24:19 +00004864 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004865 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004866 options::OPT_fno_openmp, false)) {
4867 Args.AddAllArgs(CmdArgs, options::OPT_fopenmp_version_EQ);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004868 switch (getOpenMPRuntime(getToolChain(), Args)) {
4869 case OMPRT_OMP:
4870 case OMPRT_IOMP5:
4871 // Clang can generate useful OpenMP code for these two runtime libraries.
4872 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004873
4874 // If no option regarding the use of TLS in OpenMP codegeneration is
4875 // given, decide a default based on the target. Otherwise rely on the
4876 // options and pass the right information to the frontend.
4877 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004878 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004879 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004880 break;
4881 default:
4882 // By default, if Clang doesn't know how to generate useful OpenMP code
4883 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4884 // down to the actual compilation.
4885 // FIXME: It would be better to have a mode which *only* omits IR
4886 // generation based on the OpenMP support so that we get consistent
4887 // semantic analysis, etc.
4888 break;
4889 }
Alexey Bataevc6bd8912016-05-26 11:10:11 +00004890 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004891
Peter Collingbourne32701642013-11-01 18:16:25 +00004892 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004893 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004894
Eric Christopher459d2712013-02-19 06:16:53 +00004895 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004896 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4897 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4898 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4899 Arch == llvm::Triple::ppc64le))
4900 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4901 << "ppc/ppc64/ppc64le";
4902 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004903
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004904 // -fzvector is incompatible with -faltivec.
4905 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4906 if (Args.hasArg(options::OPT_faltivec))
4907 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4908 << "-faltivec";
4909
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004910 if (getToolChain().SupportsProfiling())
4911 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004912
4913 // -flax-vector-conversions is default.
4914 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4915 options::OPT_fno_lax_vector_conversions))
4916 CmdArgs.push_back("-fno-lax-vector-conversions");
4917
John Brawna7b4ec02015-08-10 11:11:28 +00004918 if (Args.getLastArg(options::OPT_fapple_kext) ||
4919 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004920 CmdArgs.push_back("-fapple-kext");
4921
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004922 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004923 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004924 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004925 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4926 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004927
4928 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4929 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004930 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004931 }
4932
Bob Wilson14adb362012-02-03 06:27:22 +00004933 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004934
Chandler Carruth6e501032011-03-27 00:04:55 +00004935 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4936 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004937 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004938 if (A->getOption().matches(options::OPT_fwrapv))
4939 CmdArgs.push_back("-fwrapv");
4940 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4941 options::OPT_fno_strict_overflow)) {
4942 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4943 CmdArgs.push_back("-fwrapv");
4944 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004945
4946 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4947 options::OPT_fno_reroll_loops))
4948 if (A->getOption().matches(options::OPT_freroll_loops))
4949 CmdArgs.push_back("-freroll-loops");
4950
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004951 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004952 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4953 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004954
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004955 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4956
Daniel Dunbar4930e332009-11-17 08:07:36 +00004957 // -stack-protector=0 is default.
4958 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004959 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4960 options::OPT_fstack_protector_all,
4961 options::OPT_fstack_protector_strong,
4962 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004963 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004964 StackProtectorLevel = std::max<unsigned>(
4965 LangOptions::SSPOn,
4966 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004967 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004968 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004969 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004970 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004971 } else {
4972 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004973 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004974 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004975 if (StackProtectorLevel) {
4976 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004977 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004978 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004979
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004980 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004981 for (const Arg *A : Args.filtered(options::OPT__param)) {
4982 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004983 if (Str.startswith("ssp-buffer-size=")) {
4984 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004985 CmdArgs.push_back("-stack-protector-buffer-size");
4986 // FIXME: Verify the argument is a valid integer.
4987 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004988 }
Sean Silva14facf32015-06-09 01:57:17 +00004989 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004990 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004991 }
4992
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004993 // Translate -mstackrealign
4994 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004995 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004996 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004997
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004998 if (Args.hasArg(options::OPT_mstack_alignment)) {
4999 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
5000 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00005001 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00005002
Hans Wennborg77dc2362015-01-20 19:45:50 +00005003 if (Args.hasArg(options::OPT_mstack_probe_size)) {
5004 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
5005
5006 if (!Size.empty())
5007 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
5008 else
5009 CmdArgs.push_back("-mstack-probe-size=0");
5010 }
5011
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005012 switch (getToolChain().getArch()) {
5013 case llvm::Triple::aarch64:
5014 case llvm::Triple::aarch64_be:
5015 case llvm::Triple::arm:
5016 case llvm::Triple::armeb:
5017 case llvm::Triple::thumb:
5018 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005019 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005020 break;
5021
5022 default:
5023 break;
5024 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00005025
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005026 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
5027 options::OPT_mno_restrict_it)) {
5028 if (A->getOption().matches(options::OPT_mrestrict_it)) {
5029 CmdArgs.push_back("-backend-option");
5030 CmdArgs.push_back("-arm-restrict-it");
5031 } else {
5032 CmdArgs.push_back("-backend-option");
5033 CmdArgs.push_back("-arm-no-restrict-it");
5034 }
James Y Knight2db38f32015-08-15 03:45:25 +00005035 } else if (Triple.isOSWindows() &&
5036 (Triple.getArch() == llvm::Triple::arm ||
5037 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00005038 // Windows on ARM expects restricted IT blocks
5039 CmdArgs.push_back("-backend-option");
5040 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00005041 }
5042
Daniel Dunbard18049a2009-04-07 21:16:11 +00005043 // Forward -f options with positive and negative forms; we translate
5044 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00005045 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5046 StringRef fname = A->getValue();
5047 if (!llvm::sys::fs::exists(fname))
5048 D.Diag(diag::err_drv_no_such_file) << fname;
5049 else
5050 A->render(Args, CmdArgs);
5051 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005052
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005053 // -fbuiltin is default unless -mkernel is used.
5054 bool UseBuiltins =
5055 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5056 !Args.hasArg(options::OPT_mkernel));
5057 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005058 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005059
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005060 // -ffreestanding implies -fno-builtin.
5061 if (Args.hasArg(options::OPT_ffreestanding))
5062 UseBuiltins = false;
5063
5064 // Process the -fno-builtin-* options.
5065 for (const auto &Arg : Args) {
5066 const Option &O = Arg->getOption();
5067 if (!O.matches(options::OPT_fno_builtin_))
5068 continue;
5069
5070 Arg->claim();
5071 // If -fno-builtin is specified, then there's no need to pass the option to
5072 // the frontend.
5073 if (!UseBuiltins)
5074 continue;
5075
5076 StringRef FuncName = Arg->getValue();
5077 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5078 }
5079
Nuno Lopes13c88c72009-12-16 16:59:22 +00005080 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5081 options::OPT_fno_assume_sane_operator_new))
5082 CmdArgs.push_back("-fno-assume-sane-operator-new");
5083
Daniel Dunbar4930e332009-11-17 08:07:36 +00005084 // -fblocks=0 is default.
5085 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005086 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005087 (Args.hasArg(options::OPT_fgnu_runtime) &&
5088 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5089 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005090 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005091
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005092 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005093 !getToolChain().hasBlocksRuntime())
5094 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005095 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005096
Richard Smith47972af2015-06-16 00:08:24 +00005097 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005098 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005099 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005100 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005101 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005102 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5103 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005104 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005105 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005106 HaveModules = true;
5107 }
5108 }
5109
Richard Smith47972af2015-06-16 00:08:24 +00005110 // -fmodule-maps enables implicit reading of module map files. By default,
5111 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005112 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5113 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005114 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005115 }
5116
Daniel Jasperac42b752013-10-21 06:34:34 +00005117 // -fmodules-decluse checks that modules used are declared so (off by
5118 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005119 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005120 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005121 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005122 }
5123
Daniel Jasper962b38e2014-04-11 11:47:45 +00005124 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5125 // all #included headers are part of modules.
5126 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005127 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005128 CmdArgs.push_back("-fmodules-strict-decluse");
5129 }
5130
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005131 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5132 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5133 options::OPT_fno_implicit_modules)) {
5134 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005135 } else if (HaveModules) {
5136 // -fmodule-cache-path specifies where our implicitly-built module files
5137 // should be written.
5138 SmallString<128> Path;
5139 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5140 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005141 if (C.isForDiagnostics()) {
5142 // When generating crash reports, we want to emit the modules along with
5143 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005144 Path = Output.getFilename();
5145 llvm::sys::path::replace_extension(Path, ".cache");
5146 llvm::sys::path::append(Path, "modules");
5147 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005148 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005149 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005150 llvm::sys::path::append(Path, "org.llvm.clang.");
5151 appendUserToPath(Path);
5152 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005153 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005154 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005155 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5156 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005157 }
5158
Richard Smith8d83d6d2016-03-21 19:06:06 +00005159 // -fmodule-name specifies the module that is currently being built (or
5160 // used for header checking by -fmodule-maps).
5161 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5162
5163 // -fmodule-map-file can be used to specify files containing module
5164 // definitions.
5165 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5166
5167 // -fmodule-file can be used to specify files containing precompiled modules.
5168 if (HaveModules)
5169 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5170 else
5171 Args.ClaimAllArgs(options::OPT_fmodule_file);
5172
Justin Bognera88f0122014-06-20 22:59:50 +00005173 // When building modules and generating crashdumps, we need to dump a module
5174 // dependency VFS alongside the output.
5175 if (HaveModules && C.isForDiagnostics()) {
5176 SmallString<128> VFSDir(Output.getFilename());
5177 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005178 // Add the cache directory as a temp so the crash diagnostics pick it up.
5179 C.addTempFile(Args.MakeArgString(VFSDir));
5180
Justin Bognera88f0122014-06-20 22:59:50 +00005181 llvm::sys::path::append(VFSDir, "vfs");
5182 CmdArgs.push_back("-module-dependency-dir");
5183 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005184 }
5185
Richard Smith9887d792014-10-17 01:42:53 +00005186 if (HaveModules)
5187 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005188
Douglas Gregor35b04d62013-02-07 19:01:24 +00005189 // Pass through all -fmodules-ignore-macro arguments.
5190 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005191 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5192 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005193
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005194 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5195
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005196 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5197 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5198 D.Diag(diag::err_drv_argument_not_allowed_with)
5199 << A->getAsString(Args) << "-fbuild-session-timestamp";
5200
5201 llvm::sys::fs::file_status Status;
5202 if (llvm::sys::fs::status(A->getValue(), Status))
5203 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005204 CmdArgs.push_back(Args.MakeArgString(
5205 "-fbuild-session-timestamp=" +
5206 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005207 }
5208
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005209 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005210 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5211 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005212 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5213
5214 Args.AddLastArg(CmdArgs,
5215 options::OPT_fmodules_validate_once_per_build_session);
5216 }
5217
Ben Langmuirdcf73862014-03-12 00:06:17 +00005218 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5219
John McCalldfea9982010-04-09 19:12:06 +00005220 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005221 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005222 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005223 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005224
Anders Carlssond470fef2010-11-21 00:09:52 +00005225 // -felide-constructors is the default.
5226 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005227 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005228 CmdArgs.push_back("-fno-elide-constructors");
5229
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005230 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005231
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005232 if (KernelOrKext || (types::isCXX(InputType) &&
5233 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5234 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005235 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005236
Tony Linthicum76329bf2011-12-12 21:14:55 +00005237 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005238 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5239 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005240 CmdArgs.push_back("-fshort-enums");
5241
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005242 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005243 if (Arg *A = Args.getLastArg(
5244 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5245 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5246 if (A->getOption().matches(options::OPT_funsigned_char) ||
5247 A->getOption().matches(options::OPT_fno_signed_char)) {
5248 CmdArgs.push_back("-fno-signed-char");
5249 }
5250 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005251 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005252 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005253
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005254 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005255 if (!Args.hasFlag(
5256 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5257 !IsWindowsCygnus && !IsWindowsGNU &&
5258 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5259 getToolChain().getArch() != llvm::Triple::hexagon &&
5260 getToolChain().getArch() != llvm::Triple::xcore &&
5261 ((getToolChain().getTriple().getVendor() !=
5262 llvm::Triple::MipsTechnologies) ||
5263 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005264 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005265 CmdArgs.push_back("-fno-use-cxa-atexit");
5266
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005267 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005268 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005269 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005270 CmdArgs.push_back("-fms-extensions");
5271
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005272 // -fno-use-line-directives is default.
5273 if (Args.hasFlag(options::OPT_fuse_line_directives,
5274 options::OPT_fno_use_line_directives, false))
5275 CmdArgs.push_back("-fuse-line-directives");
5276
Francois Pichet1b4f1632011-09-17 04:32:15 +00005277 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005278 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005279 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005280 (IsWindowsMSVC &&
5281 Args.hasFlag(options::OPT_fms_extensions,
5282 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005283 CmdArgs.push_back("-fms-compatibility");
5284
David Majnemerc371ff02015-03-22 08:39:22 +00005285 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005286 VersionTuple MSVT = visualstudio::getMSVCVersion(
Adrian McCarthye4b26fc2016-05-13 23:20:11 +00005287 &D, getToolChain(), getToolChain().getTriple(), Args, IsWindowsMSVC);
David Majnemere11d3732015-06-08 00:22:46 +00005288 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005289 CmdArgs.push_back(
5290 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005291
David Majnemer8db91762015-05-18 04:49:30 +00005292 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5293 if (ImplyVCPPCXXVer) {
5294 if (IsMSVC2015Compatible)
5295 CmdArgs.push_back("-std=c++14");
5296 else
5297 CmdArgs.push_back("-std=c++11");
5298 }
5299
Eric Christopher5ecce122013-02-18 00:38:31 +00005300 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005301 if (Args.hasFlag(options::OPT_fborland_extensions,
5302 options::OPT_fno_borland_extensions, false))
5303 CmdArgs.push_back("-fborland-extensions");
5304
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005305 // -fno-declspec is default, except for PS4.
5306 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5307 getToolChain().getTriple().isPS4()))
5308 CmdArgs.push_back("-fdeclspec");
5309 else if (Args.hasArg(options::OPT_fno_declspec))
5310 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5311
David Majnemerc371ff02015-03-22 08:39:22 +00005312 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5313 // than 19.
5314 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5315 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005316 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005317 CmdArgs.push_back("-fno-threadsafe-statics");
5318
Francois Pichet02744872011-09-01 16:38:08 +00005319 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5320 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005321 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005322 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005323 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005324
Chandler Carruthe03aa552010-04-17 20:17:31 +00005325 // -fgnu-keywords default varies depending on language; only pass if
5326 // specified.
5327 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005328 options::OPT_fno_gnu_keywords))
5329 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005331 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005332 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005333 CmdArgs.push_back("-fgnu89-inline");
5334
Chad Rosier9c76d242012-03-15 22:31:42 +00005335 if (Args.hasArg(options::OPT_fno_inline))
5336 CmdArgs.push_back("-fno-inline");
5337
Hans Wennborg7a008882016-05-24 20:40:51 +00005338 if (Arg* InlineArg = Args.getLastArg(options::OPT_finline_functions,
5339 options::OPT_fno_inline_functions))
5340 InlineArg->render(Args, CmdArgs);
Chad Rosier80603182012-03-06 18:49:20 +00005341
John McCall5fb5df92012-06-20 06:18:46 +00005342 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005343
John McCall5fb5df92012-06-20 06:18:46 +00005344 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005345 // legacy is the default. Except for deployment taget of 10.5,
5346 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5347 // gets ignored silently.
5348 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005349 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5350 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005351 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005352 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005353 if (getToolChain().UseObjCMixedDispatch())
5354 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5355 else
5356 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5357 }
5358 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005359
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005360 // When ObjectiveC legacy runtime is in effect on MacOSX,
5361 // turn on the option to do Array/Dictionary subscripting
5362 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005363 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005364 getToolChain().getTriple().isMacOSX() &&
5365 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5366 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005367 objcRuntime.isNeXTFamily())
5368 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005369
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005370 // -fencode-extended-block-signature=1 is default.
5371 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5372 CmdArgs.push_back("-fencode-extended-block-signature");
5373 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005374
John McCall24fc0de2011-07-06 00:26:06 +00005375 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5376 // NOTE: This logic is duplicated in ToolChains.cpp.
5377 bool ARC = isObjCAutoRefCount(Args);
5378 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005379 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005380
John McCall24fc0de2011-07-06 00:26:06 +00005381 CmdArgs.push_back("-fobjc-arc");
5382
Chandler Carruth491db322011-11-04 07:34:47 +00005383 // FIXME: It seems like this entire block, and several around it should be
5384 // wrapped in isObjC, but for now we just use it here as this is where it
5385 // was being used previously.
5386 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5387 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5388 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5389 else
5390 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5391 }
5392
John McCall24fc0de2011-07-06 00:26:06 +00005393 // Allow the user to enable full exceptions code emission.
5394 // We define off for Objective-CC, on for Objective-C++.
5395 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5396 options::OPT_fno_objc_arc_exceptions,
5397 /*default*/ types::isCXX(InputType)))
5398 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005399
John McCall24fc0de2011-07-06 00:26:06 +00005400 }
5401
5402 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5403 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005404 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005405 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005406
John McCall24fc0de2011-07-06 00:26:06 +00005407 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5408 // takes precedence.
5409 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5410 if (!GCArg)
5411 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5412 if (GCArg) {
5413 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005414 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005415 } else if (getToolChain().SupportsObjCGC()) {
5416 GCArg->render(Args, CmdArgs);
5417 } else {
5418 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005419 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005420 }
5421 }
5422
John McCallfbe5ed72015-11-05 19:19:56 +00005423 // Pass down -fobjc-weak or -fno-objc-weak if present.
5424 if (types::isObjC(InputType)) {
5425 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5426 options::OPT_fno_objc_weak);
5427 if (!WeakArg) {
5428 // nothing to do
5429 } else if (GCArg) {
5430 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5431 D.Diag(diag::err_objc_weak_with_gc);
5432 } else if (!objcRuntime.allowsWeak()) {
5433 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5434 D.Diag(diag::err_objc_weak_unsupported);
5435 } else {
5436 WeakArg->render(Args, CmdArgs);
5437 }
5438 }
5439
Bob Wilsonb111ec92015-03-02 19:01:14 +00005440 if (Args.hasFlag(options::OPT_fapplication_extension,
5441 options::OPT_fno_application_extension, false))
5442 CmdArgs.push_back("-fapplication-extension");
5443
Reid Klecknerc542d372014-06-27 17:02:02 +00005444 // Handle GCC-style exception args.
5445 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005446 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5447 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005448
Tim Northovere931f9f2015-10-30 16:30:41 +00005449 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005450 CmdArgs.push_back("-fsjlj-exceptions");
5451
5452 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005453 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5454 options::OPT_fno_assume_sane_operator_new))
5455 CmdArgs.push_back("-fno-assume-sane-operator-new");
5456
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005457 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5458 // most platforms.
5459 if (Args.hasFlag(options::OPT_fsized_deallocation,
5460 options::OPT_fno_sized_deallocation, false))
5461 CmdArgs.push_back("-fsized-deallocation");
5462
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005463 // -fconstant-cfstrings is default, and may be subject to argument translation
5464 // on Darwin.
5465 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5466 options::OPT_fno_constant_cfstrings) ||
5467 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5468 options::OPT_mno_constant_cfstrings))
5469 CmdArgs.push_back("-fno-constant-cfstrings");
5470
John Thompsoned4e2952009-11-05 20:14:16 +00005471 // -fshort-wchar default varies depending on platform; only
5472 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005473 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5474 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005475 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005476
Hans Wennborg28c96312013-07-31 23:39:13 +00005477 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005478 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005479 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005480 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005481
Daniel Dunbar096ed292011-10-05 21:04:55 +00005482 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5483 // -fno-pack-struct doesn't apply to -fpack-struct=.
5484 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005485 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005486 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005487 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005488 } else if (Args.hasFlag(options::OPT_fpack_struct,
5489 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005490 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005491 }
5492
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005493 // Handle -fmax-type-align=N and -fno-type-align
5494 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5495 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5496 if (!SkipMaxTypeAlign) {
5497 std::string MaxTypeAlignStr = "-fmax-type-align=";
5498 MaxTypeAlignStr += A->getValue();
5499 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5500 }
5501 } else if (getToolChain().getTriple().isOSDarwin()) {
5502 if (!SkipMaxTypeAlign) {
5503 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5504 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5505 }
5506 }
5507
John Brawna7b4ec02015-08-10 11:11:28 +00005508 // -fcommon is the default unless compiling kernel code or the target says so
5509 bool NoCommonDefault =
5510 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5511 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5512 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005513 CmdArgs.push_back("-fno-common");
5514
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005515 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005516 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005517 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005518 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005519 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005520 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005521
Daniel Dunbar6358d682010-10-15 22:30:42 +00005522 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005523 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005524 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005525 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005526
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005527 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005528 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5529 StringRef value = inputCharset->getValue();
5530 if (value != "UTF-8")
5531 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5532 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005533 }
5534
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005535 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005536 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5537 StringRef value = execCharset->getValue();
5538 if (value != "UTF-8")
5539 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5540 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005541 }
5542
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005543 // -fcaret-diagnostics is default.
5544 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5545 options::OPT_fno_caret_diagnostics, true))
5546 CmdArgs.push_back("-fno-caret-diagnostics");
5547
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005548 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005549 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005550 options::OPT_fno_diagnostics_fixit_info))
5551 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005552
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005553 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005554 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005555 options::OPT_fno_diagnostics_show_option))
5556 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005557
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005558 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005559 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005560 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005561 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005562 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005563
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005564 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005565 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005566 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005567 }
5568
Chandler Carruthb6766f02011-03-27 01:50:55 +00005569 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 options::OPT_fdiagnostics_show_note_include_stack,
5571 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005572 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005573 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005574 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5575 else
5576 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5577 }
5578
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005579 // Color diagnostics are the default, unless the terminal doesn't support
5580 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005581 // Support both clang's -f[no-]color-diagnostics and gcc's
5582 // -f[no-]diagnostics-colors[=never|always|auto].
5583 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005584 for (const auto &Arg : Args) {
5585 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005586 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5587 !O.matches(options::OPT_fdiagnostics_color) &&
5588 !O.matches(options::OPT_fno_color_diagnostics) &&
5589 !O.matches(options::OPT_fno_diagnostics_color) &&
5590 !O.matches(options::OPT_fdiagnostics_color_EQ))
5591 continue;
5592
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005593 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005594 if (O.matches(options::OPT_fcolor_diagnostics) ||
5595 O.matches(options::OPT_fdiagnostics_color)) {
5596 ShowColors = Colors_On;
5597 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5598 O.matches(options::OPT_fno_diagnostics_color)) {
5599 ShowColors = Colors_Off;
5600 } else {
5601 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005602 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005603 if (value == "always")
5604 ShowColors = Colors_On;
5605 else if (value == "never")
5606 ShowColors = Colors_Off;
5607 else if (value == "auto")
5608 ShowColors = Colors_Auto;
5609 else
5610 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005611 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005612 }
5613 }
5614 if (ShowColors == Colors_On ||
5615 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005616 CmdArgs.push_back("-fcolor-diagnostics");
5617
Nico Rieck7857d462013-09-11 00:38:02 +00005618 if (Args.hasArg(options::OPT_fansi_escape_codes))
5619 CmdArgs.push_back("-fansi-escape-codes");
5620
Daniel Dunbardb097022009-06-08 21:13:54 +00005621 if (!Args.hasFlag(options::OPT_fshow_source_location,
5622 options::OPT_fno_show_source_location))
5623 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005624
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005625 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005626 true))
5627 CmdArgs.push_back("-fno-show-column");
5628
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005629 if (!Args.hasFlag(options::OPT_fspell_checking,
5630 options::OPT_fno_spell_checking))
5631 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005632
Chad Rosierc8e56e82012-12-05 21:08:21 +00005633 // -fno-asm-blocks is default.
5634 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5635 false))
5636 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005637
Steven Wucb0d13f2015-01-16 23:05:28 +00005638 // -fgnu-inline-asm is default.
5639 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5640 options::OPT_fno_gnu_inline_asm, true))
5641 CmdArgs.push_back("-fno-gnu-inline-asm");
5642
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005643 // Enable vectorization per default according to the optimization level
5644 // selected. For optimization levels that want vectorization we use the alias
5645 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005646 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005647 OptSpecifier VectorizeAliasOption =
5648 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005649 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005650 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005651 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005652
Chad Rosier136d67d2014-04-28 19:30:57 +00005653 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005654 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005655 OptSpecifier SLPVectAliasOption =
5656 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005657 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005658 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005659 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005660
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005661 // -fno-slp-vectorize-aggressive is default.
5662 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005663 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005664 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005665
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005666 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5667 A->render(Args, CmdArgs);
5668
Filipe Cabecinhasab731f72016-05-12 16:51:36 +00005669 if (Arg *A = Args.getLastArg(
5670 options::OPT_fsanitize_undefined_strip_path_components_EQ))
5671 A->render(Args, CmdArgs);
5672
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005673 // -fdollars-in-identifiers default varies depending on platform and
5674 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005675 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005676 options::OPT_fno_dollars_in_identifiers)) {
5677 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005678 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005679 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005680 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005681 }
5682
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005683 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5684 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005685 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005686 options::OPT_fno_unit_at_a_time)) {
5687 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005688 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005689 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005690
Eli Friedman055c9702011-11-02 01:53:16 +00005691 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5692 options::OPT_fno_apple_pragma_pack, false))
5693 CmdArgs.push_back("-fapple-pragma-pack");
5694
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005695 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005696 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5697 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005698 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005699 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005700 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005701
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005702// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5703//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005704// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005705#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005706 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005707 (getToolChain().getArch() == llvm::Triple::arm ||
5708 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005709 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5710 CmdArgs.push_back("-fno-builtin-strcat");
5711 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5712 CmdArgs.push_back("-fno-builtin-strcpy");
5713 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005714#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005715
Justin Bognera88f0122014-06-20 22:59:50 +00005716 // Enable rewrite includes if the user's asked for it or if we're generating
5717 // diagnostics.
5718 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5719 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005720 if (Args.hasFlag(options::OPT_frewrite_includes,
5721 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005722 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005723 CmdArgs.push_back("-frewrite-includes");
5724
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005725 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005726 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005727 options::OPT_traditional_cpp)) {
5728 if (isa<PreprocessJobAction>(JA))
5729 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005730 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005731 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005732 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005733
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005734 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005735 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005737 // Handle serialized diagnostics.
5738 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5739 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005740 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005741 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005742
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005743 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5744 CmdArgs.push_back("-fretain-comments-from-system-headers");
5745
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005746 // Forward -fcomment-block-commands to -cc1.
5747 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005748 // Forward -fparse-all-comments to -cc1.
5749 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005750
John Brawnad31ace2015-09-23 13:55:40 +00005751 // Turn -fplugin=name.so into -load name.so
5752 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5753 CmdArgs.push_back("-load");
5754 CmdArgs.push_back(A->getValue());
5755 A->claim();
5756 }
5757
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005758 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5759 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005760 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005761 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5762 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005763
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005764 // We translate this by hand to the -cc1 argument, since nightly test uses
5765 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005766 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005767 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005768 } else
Sean Silva14facf32015-06-09 01:57:17 +00005769 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005770 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005771
Bob Wilson23a55f12014-12-21 07:00:00 +00005772 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005773 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5774 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00005775 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5776 // has slightly different breakdown between stages.
5777 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5778 // pristine IR generated by the frontend. Ideally, a new compile action should
5779 // be added so both IR can be captured.
5780 if (C.getDriver().isSaveTempsEnabled() &&
5781 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00005782 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005783
Daniel Dunbard67a3222009-03-30 06:36:42 +00005784 if (Output.getType() == types::TY_Dependencies) {
5785 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005786 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005787 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005788 CmdArgs.push_back(Output.getFilename());
5789 } else {
5790 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005791 }
5792
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005793 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005794
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005795 if (Input.isFilename())
5796 CmdArgs.push_back(Input.getFilename());
5797 else
5798 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005799
Chris Lattnere9d7d782009-11-03 19:50:27 +00005800 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5801
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005802 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005803
5804 // Optionally embed the -cc1 level arguments into the debug info, for build
5805 // analysis.
5806 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005807 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005808 for (const auto &Arg : Args)
5809 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005810
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005811 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005812 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005813 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005814 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005815 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005816 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005817 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005818 }
5819 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005820 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005821 }
5822
Eric Christopherd3804002013-02-22 20:12:52 +00005823 // Add the split debug info name to the command lines here so we
5824 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005825 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005826 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5827 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005828 const char *SplitDwarfOut;
5829 if (SplitDwarf) {
5830 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005831 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005832 CmdArgs.push_back(SplitDwarfOut);
5833 }
5834
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005835 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5836 // Include them with -fcuda-include-gpubinary.
5837 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005838 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005839 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005840 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005841 }
5842
Peter Collingbourne3afb2662016-04-28 17:09:37 +00005843 bool WholeProgramVTables =
5844 Args.hasFlag(options::OPT_fwhole_program_vtables,
5845 options::OPT_fno_whole_program_vtables, false);
5846 if (WholeProgramVTables) {
5847 if (!D.isUsingLTO())
5848 D.Diag(diag::err_drv_argument_only_allowed_with)
5849 << "-fwhole-program-vtables"
5850 << "-flto";
5851 CmdArgs.push_back("-fwhole-program-vtables");
5852 }
5853
Eric Christopherd3804002013-02-22 20:12:52 +00005854 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005855 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005856 Output.getType() == types::TY_Object &&
5857 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005858 auto CLCommand =
5859 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005860 C.addCommand(llvm::make_unique<FallbackCommand>(
5861 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005862 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5863 isa<PrecompileJobAction>(JA)) {
5864 // In /fallback builds, run the main compilation even if the pch generation
5865 // fails, so that the main compilation's fallback to cl.exe runs.
5866 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5867 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005868 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005869 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005870 }
5871
Eric Christopherf1545832013-02-22 23:50:16 +00005872 // Handle the debug info splitting at object creation time if we're
5873 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005874 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005875 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005876 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005877
Roman Divacky178e01602011-02-10 16:52:03 +00005878 if (Arg *A = Args.getLastArg(options::OPT_pg))
5879 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005880 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5881 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005882
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005883 // Claim some arguments which clang supports automatically.
5884
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005885 // -fpch-preprocess is used with gcc to add a special marker in the output to
5886 // include the PCH file. Clang's PTH solution is completely transparent, so we
5887 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005888 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005889
Daniel Dunbar17731772009-03-23 19:03:36 +00005890 // Claim some arguments which clang doesn't support, but we don't
5891 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005892 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5893 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005894
Rafael Espindolab0092d72013-09-04 19:37:35 +00005895 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005896 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005897}
5898
John McCall5fb5df92012-06-20 06:18:46 +00005899/// Add options related to the Objective-C runtime/ABI.
5900///
5901/// Returns true if the runtime is non-fragile.
5902ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5903 ArgStringList &cmdArgs,
5904 RewriteKind rewriteKind) const {
5905 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005906 Arg *runtimeArg =
5907 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5908 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005909
5910 // Just forward -fobjc-runtime= to the frontend. This supercedes
5911 // options about fragility.
5912 if (runtimeArg &&
5913 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5914 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005915 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005916 if (runtime.tryParse(value)) {
5917 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005918 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005919 }
5920
5921 runtimeArg->render(args, cmdArgs);
5922 return runtime;
5923 }
5924
5925 // Otherwise, we'll need the ABI "version". Version numbers are
5926 // slightly confusing for historical reasons:
5927 // 1 - Traditional "fragile" ABI
5928 // 2 - Non-fragile ABI, version 1
5929 // 3 - Non-fragile ABI, version 2
5930 unsigned objcABIVersion = 1;
5931 // If -fobjc-abi-version= is present, use that to set the version.
5932 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005933 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005934 if (value == "1")
5935 objcABIVersion = 1;
5936 else if (value == "2")
5937 objcABIVersion = 2;
5938 else if (value == "3")
5939 objcABIVersion = 3;
5940 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005941 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005942 } else {
5943 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005944 bool nonFragileABIIsDefault =
5945 (rewriteKind == RK_NonFragile ||
5946 (rewriteKind == RK_None &&
5947 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005948 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5949 options::OPT_fno_objc_nonfragile_abi,
5950 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005951// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005952#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5953 unsigned nonFragileABIVersion = 1;
5954#else
5955 unsigned nonFragileABIVersion = 2;
5956#endif
5957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005958 if (Arg *abiArg =
5959 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005960 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005961 if (value == "1")
5962 nonFragileABIVersion = 1;
5963 else if (value == "2")
5964 nonFragileABIVersion = 2;
5965 else
5966 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005967 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005968 }
5969
5970 objcABIVersion = 1 + nonFragileABIVersion;
5971 } else {
5972 objcABIVersion = 1;
5973 }
5974 }
5975
5976 // We don't actually care about the ABI version other than whether
5977 // it's non-fragile.
5978 bool isNonFragile = objcABIVersion != 1;
5979
5980 // If we have no runtime argument, ask the toolchain for its default runtime.
5981 // However, the rewriter only really supports the Mac runtime, so assume that.
5982 ObjCRuntime runtime;
5983 if (!runtimeArg) {
5984 switch (rewriteKind) {
5985 case RK_None:
5986 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5987 break;
5988 case RK_Fragile:
5989 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5990 break;
5991 case RK_NonFragile:
5992 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5993 break;
5994 }
5995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005996 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005997 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5998 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005999 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00006000 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
6001
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006002 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00006003 } else {
6004 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
6005 }
6006
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006007 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00006008 } else {
6009 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00006010 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00006011 // non-fragile mode or the GCC runtime in fragile mode.
6012 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006013 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00006014 else
6015 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00006016 }
6017
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006018 cmdArgs.push_back(
6019 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00006020 return runtime;
6021}
6022
Reid Klecknerc542d372014-06-27 17:02:02 +00006023static bool maybeConsumeDash(const std::string &EH, size_t &I) {
6024 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
6025 I += HaveDash;
6026 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00006027}
Reid Klecknerc542d372014-06-27 17:02:02 +00006028
Benjamin Kramere003ca22015-10-28 13:54:16 +00006029namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00006030struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00006031 bool Synch = false;
6032 bool Asynch = false;
6033 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00006034};
Benjamin Kramere003ca22015-10-28 13:54:16 +00006035} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00006036
6037/// /EH controls whether to run destructor cleanups when exceptions are
6038/// thrown. There are three modifiers:
6039/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
6040/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
6041/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00006042/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00006043/// The default is /EHs-c-, meaning cleanups are disabled.
6044static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
6045 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006047 std::vector<std::string> EHArgs =
6048 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00006049 for (auto EHVal : EHArgs) {
6050 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
6051 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006052 case 'a':
6053 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006054 if (EH.Asynch)
6055 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006056 continue;
6057 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00006058 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006059 continue;
6060 case 's':
6061 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00006062 if (EH.Synch)
6063 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006064 continue;
6065 default:
6066 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006067 }
6068 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6069 break;
6070 }
6071 }
David Majnemerb8809092016-02-20 09:23:44 +00006072 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006073 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006074 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006075 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6076 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006077 EH.Synch = true;
6078 EH.NoUnwindC = true;
6079 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006080
Reid Klecknerc542d372014-06-27 17:02:02 +00006081 return EH;
6082}
6083
David Majnemercd5855e2016-02-29 01:40:36 +00006084void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6085 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006086 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006087 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006088 unsigned RTOptionID = options::OPT__SLASH_MT;
6089
Hans Wennborgf1a74252013-09-10 20:18:04 +00006090 if (Args.hasArg(options::OPT__SLASH_LDd))
6091 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6092 // but defining _DEBUG is sticky.
6093 RTOptionID = options::OPT__SLASH_MTd;
6094
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006095 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006096 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006097
David Majnemere2afb472015-07-24 06:49:13 +00006098 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006099 switch (RTOptionID) {
6100 case options::OPT__SLASH_MD:
6101 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006102 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006103 CmdArgs.push_back("-D_MT");
6104 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006105 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 break;
6107 case options::OPT__SLASH_MDd:
6108 CmdArgs.push_back("-D_DEBUG");
6109 CmdArgs.push_back("-D_MT");
6110 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006111 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006112 break;
6113 case options::OPT__SLASH_MT:
6114 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006115 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006116 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006117 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006118 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006119 break;
6120 case options::OPT__SLASH_MTd:
6121 CmdArgs.push_back("-D_DEBUG");
6122 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006123 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006124 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006125 break;
6126 default:
6127 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006128 }
6129
David Majnemere2afb472015-07-24 06:49:13 +00006130 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6131 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6132 } else {
6133 CmdArgs.push_back(FlagForCRT.data());
6134
6135 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6136 // users want. The /Za flag to cl.exe turns this off, but it's not
6137 // implemented in clang.
6138 CmdArgs.push_back("--dependent-lib=oldnames");
6139 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006140
Hans Wennborg8858a032014-07-21 23:42:07 +00006141 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6142 // would produce interleaved output, so ignore /showIncludes in such cases.
6143 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6144 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6145 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006146
David Majnemerf6072342014-07-01 22:24:56 +00006147 // This controls whether or not we emit RTTI data for polymorphic types.
6148 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6149 /*default=*/false))
6150 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006151
Reid Kleckner124955a2015-08-05 18:51:13 +00006152 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006153 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006154 if (*EmitCodeView)
6155 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006156 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006157 CmdArgs.push_back("-gcodeview");
6158
Reid Klecknerc542d372014-06-27 17:02:02 +00006159 const Driver &D = getToolChain().getDriver();
6160 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006161 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006162 if (types::isCXX(InputType))
6163 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006164 CmdArgs.push_back("-fexceptions");
6165 }
David Majnemercd5855e2016-02-29 01:40:36 +00006166 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6167 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006168
Hans Wennborge50cec32014-06-13 20:59:54 +00006169 // /EP should expand to -E -P.
6170 if (Args.hasArg(options::OPT__SLASH_EP)) {
6171 CmdArgs.push_back("-E");
6172 CmdArgs.push_back("-P");
6173 }
6174
David Majnemera5b195a2015-02-14 01:35:12 +00006175 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006176 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6177 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006178 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6179 else
6180 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6181
6182 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6183 VolatileOptionID = A->getOption().getID();
6184
6185 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6186 CmdArgs.push_back("-fms-volatile");
6187
David Majnemer86c318f2014-02-11 21:05:00 +00006188 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6189 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6190 if (MostGeneralArg && BestCaseArg)
6191 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6192 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6193
6194 if (MostGeneralArg) {
6195 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6196 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6197 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6198
6199 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6200 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6201 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6202 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6203 << FirstConflict->getAsString(Args)
6204 << SecondConflict->getAsString(Args);
6205
6206 if (SingleArg)
6207 CmdArgs.push_back("-fms-memptr-rep=single");
6208 else if (MultipleArg)
6209 CmdArgs.push_back("-fms-memptr-rep=multiple");
6210 else
6211 CmdArgs.push_back("-fms-memptr-rep=virtual");
6212 }
6213
Alexey Bataeva7547182016-05-18 09:06:38 +00006214 if (Args.getLastArg(options::OPT__SLASH_Gd))
6215 CmdArgs.push_back("-fdefault-calling-conv=cdecl");
6216 else if (Args.getLastArg(options::OPT__SLASH_Gr))
6217 CmdArgs.push_back("-fdefault-calling-conv=fastcall");
6218 else if (Args.getLastArg(options::OPT__SLASH_Gz))
6219 CmdArgs.push_back("-fdefault-calling-conv=stdcall");
6220 else if (Args.getLastArg(options::OPT__SLASH_Gv))
6221 CmdArgs.push_back("-fdefault-calling-conv=vectorcall");
6222
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006223 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6224 A->render(Args, CmdArgs);
6225
Hans Wennborg81f74482013-09-10 01:07:07 +00006226 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6227 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006228 if (Args.hasArg(options::OPT__SLASH_fallback))
6229 CmdArgs.push_back("msvc-fallback");
6230 else
6231 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006232 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006233}
6234
Douglas Katzman95354292015-06-23 20:42:09 +00006235visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006236 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006237 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006238 return CLFallback.get();
6239}
6240
Daniel Sanders7f933f42015-01-30 17:35:23 +00006241void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6242 ArgStringList &CmdArgs) const {
6243 StringRef CPUName;
6244 StringRef ABIName;
6245 const llvm::Triple &Triple = getToolChain().getTriple();
6246 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6247
6248 CmdArgs.push_back("-target-abi");
6249 CmdArgs.push_back(ABIName.data());
6250}
6251
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006252void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006253 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006254 const ArgList &Args,
6255 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006256 ArgStringList CmdArgs;
6257
6258 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6259 const InputInfo &Input = Inputs[0];
6260
James Y Knight2db38f32015-08-15 03:45:25 +00006261 std::string TripleStr =
6262 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6263 const llvm::Triple Triple(TripleStr);
6264
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006265 // Don't warn about "clang -w -c foo.s"
6266 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006267 // and "clang -emit-llvm -c foo.s"
6268 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006269
Rafael Espindola577637a2015-01-03 00:06:04 +00006270 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006271
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006272 // Invoke ourselves in -cc1as mode.
6273 //
6274 // FIXME: Implement custom jobs for internal actions.
6275 CmdArgs.push_back("-cc1as");
6276
6277 // Add the "effective" target triple.
6278 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006279 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6280
6281 // Set the output mode, we currently only expect to be used as a real
6282 // assembler.
6283 CmdArgs.push_back("-filetype");
6284 CmdArgs.push_back("obj");
6285
Eric Christopher45f2e712012-12-18 00:31:10 +00006286 // Set the main file name, so that debug info works even with
6287 // -save-temps or preprocessed assembly.
6288 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006289 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006290
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006291 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006292 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006293 if (!CPU.empty()) {
6294 CmdArgs.push_back("-target-cpu");
6295 CmdArgs.push_back(Args.MakeArgString(CPU));
6296 }
6297
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006298 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006299 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006300
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006301 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006302 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006303
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006304 // Pass along any -I options so we get proper .include search paths.
6305 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6306
Eric Christopherfc3ee562012-01-10 00:38:01 +00006307 // Determine the original source input.
6308 const Action *SourceAction = &JA;
6309 while (SourceAction->getKind() != Action::InputClass) {
6310 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6311 SourceAction = SourceAction->getInputs()[0];
6312 }
6313
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006314 // Forward -g and handle debug info related flags, assuming we are dealing
6315 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006316 bool WantDebug = false;
6317 unsigned DwarfVersion = 0;
6318 Args.ClaimAllArgs(options::OPT_g_Group);
6319 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6320 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6321 !A->getOption().matches(options::OPT_ggdb0);
6322 if (WantDebug)
6323 DwarfVersion = DwarfVersionNum(A->getSpelling());
6324 }
6325 if (DwarfVersion == 0)
6326 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6327
6328 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6329
Eric Christopherfc3ee562012-01-10 00:38:01 +00006330 if (SourceAction->getType() == types::TY_Asm ||
6331 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006332 // You might think that it would be ok to set DebugInfoKind outside of
6333 // the guard for source type, however there is a test which asserts
6334 // that some assembler invocation receives no -debug-info-kind,
6335 // and it's not clear whether that test is just overly restrictive.
6336 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6337 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006338 // Add the -fdebug-compilation-dir flag if needed.
6339 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006340
6341 // Set the AT_producer to the clang version when using the integrated
6342 // assembler on assembly source files.
6343 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006344 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006345
6346 // And pass along -I options
6347 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006348 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006349 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6350 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006351
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006352 // Handle -fPIC et al -- the relocation-model affects the assembler
6353 // for some targets.
6354 llvm::Reloc::Model RelocationModel;
6355 unsigned PICLevel;
6356 bool IsPIE;
6357 std::tie(RelocationModel, PICLevel, IsPIE) =
6358 ParsePICArgs(getToolChain(), Triple, Args);
6359
6360 const char *RMName = RelocationModelName(RelocationModel);
6361 if (RMName) {
6362 CmdArgs.push_back("-mrelocation-model");
6363 CmdArgs.push_back(RMName);
6364 }
6365
Kevin Enderby292dc082011-12-22 19:31:58 +00006366 // Optionally embed the -cc1as level arguments into the debug info, for build
6367 // analysis.
6368 if (getToolChain().UseDwarfDebugFlags()) {
6369 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006370 for (const auto &Arg : Args)
6371 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006372
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006373 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006374 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6375 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006376 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006377 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006378 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006379 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006380 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006381 }
6382 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006383 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006384 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006385
6386 // FIXME: Add -static support, once we have it.
6387
Daniel Sanders7f933f42015-01-30 17:35:23 +00006388 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006389 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006390 default:
6391 break;
6392
6393 case llvm::Triple::mips:
6394 case llvm::Triple::mipsel:
6395 case llvm::Triple::mips64:
6396 case llvm::Triple::mips64el:
6397 AddMIPSTargetArgs(Args, CmdArgs);
6398 break;
6399 }
6400
David Blaikie372d9502014-01-17 03:17:40 +00006401 // Consume all the warning flags. Usually this would be handled more
6402 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6403 // doesn't handle that so rather than warning about unused flags that are
6404 // actually used, we'll lie by omission instead.
6405 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006406 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006407
David Blaikie9260ed62013-07-25 21:19:01 +00006408 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6409 getToolChain().getDriver());
6410
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006411 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006412
6413 assert(Output.isFilename() && "Unexpected lipo output.");
6414 CmdArgs.push_back("-o");
6415 CmdArgs.push_back(Output.getFilename());
6416
Daniel Dunbarb440f562010-08-02 02:38:21 +00006417 assert(Input.isFilename() && "Invalid input.");
6418 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006419
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006420 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006421 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006422
6423 // Handle the debug info splitting at object creation time if we're
6424 // creating an object.
6425 // TODO: Currently only works on linux with newer objcopy.
6426 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006427 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006428 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006429 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006430}
6431
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006432void GnuTool::anchor() {}
6433
Daniel Dunbara3246a02009-03-18 08:07:30 +00006434void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006435 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006436 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006437 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006438 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006439 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006440
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006441 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006442 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006443 // It is unfortunate that we have to claim here, as this means
6444 // we will basically never report anything interesting for
6445 // platforms using a generic gcc, even if we are just using gcc
6446 // to get to the assembler.
6447 A->claim();
6448
Daniel Dunbar939c1212010-08-03 16:14:14 +00006449 // Don't forward any -g arguments to assembly steps.
6450 if (isa<AssembleJobAction>(JA) &&
6451 A->getOption().matches(options::OPT_g_Group))
6452 continue;
6453
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006454 // Don't forward any -W arguments to assembly and link steps.
6455 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6456 A->getOption().matches(options::OPT_W_Group))
6457 continue;
6458
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006459 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006460 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006461 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006462
Daniel Dunbar4e295052010-01-25 22:35:08 +00006463 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006464
6465 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006466 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006467 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006468 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006469 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006470 }
6471
Daniel Dunbar5716d872009-05-02 21:41:52 +00006472 // Try to force gcc to match the tool chain we want, if we recognize
6473 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006474 //
6475 // FIXME: The triple class should directly provide the information we want
6476 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006477 switch (getToolChain().getArch()) {
6478 default:
6479 break;
6480 case llvm::Triple::x86:
6481 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006482 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006483 break;
6484 case llvm::Triple::x86_64:
6485 case llvm::Triple::ppc64:
6486 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006487 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006488 break;
6489 case llvm::Triple::sparcel:
6490 CmdArgs.push_back("-EL");
6491 break;
6492 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006493
Daniel Dunbarb440f562010-08-02 02:38:21 +00006494 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006495 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006496 CmdArgs.push_back(Output.getFilename());
6497 } else {
6498 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006499 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006500 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006502 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006503
6504 // Only pass -x if gcc will understand it; otherwise hope gcc
6505 // understands the suffix correctly. The main use case this would go
6506 // wrong in is for linker inputs if they happened to have an odd
6507 // suffix; really the only way to get this to happen is a command
6508 // like '-x foobar a.c' which will treat a.c like a linker input.
6509 //
6510 // FIXME: For the linker case specifically, can we safely convert
6511 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006512 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006513 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006514 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006515 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006516 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006517 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006518 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006519 else if (II.getType() == types::TY_ModuleFile)
6520 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006521 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006522
Daniel Dunbara3246a02009-03-18 08:07:30 +00006523 if (types::canTypeBeUserSpecified(II.getType())) {
6524 CmdArgs.push_back("-x");
6525 CmdArgs.push_back(types::getTypeName(II.getType()));
6526 }
6527
Daniel Dunbarb440f562010-08-02 02:38:21 +00006528 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006529 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006530 else {
6531 const Arg &A = II.getInputArg();
6532
6533 // Reverse translate some rewritten options.
6534 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6535 CmdArgs.push_back("-lstdc++");
6536 continue;
6537 }
6538
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006539 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006540 A.render(Args, CmdArgs);
6541 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006542 }
6543
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006544 const std::string customGCCName = D.getCCCGenericGCCName();
6545 const char *GCCName;
6546 if (!customGCCName.empty())
6547 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006548 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006549 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006550 } else
6551 GCCName = "gcc";
6552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006553 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006554 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006555}
6556
Douglas Katzman95354292015-06-23 20:42:09 +00006557void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6558 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006559 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006560}
6561
Douglas Katzman95354292015-06-23 20:42:09 +00006562void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6563 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006564 const Driver &D = getToolChain().getDriver();
6565
Eric Christophercc7ff502015-01-29 00:56:17 +00006566 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006567 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006568 case types::TY_LLVM_IR:
6569 case types::TY_LTO_IR:
6570 case types::TY_LLVM_BC:
6571 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006572 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006573 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006574 // We assume we've got an "integrated" assembler in that gcc will produce an
6575 // object file itself.
6576 case types::TY_Object:
6577 CmdArgs.push_back("-c");
6578 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006579 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006580 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006581 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006582 case types::TY_Nothing:
6583 CmdArgs.push_back("-fsyntax-only");
6584 break;
6585 default:
6586 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006587 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006588}
6589
Douglas Katzman95354292015-06-23 20:42:09 +00006590void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6591 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006592 // The types are (hopefully) good enough.
6593}
6594
Tony Linthicum76329bf2011-12-12 21:14:55 +00006595// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006596void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006597 ArgStringList &CmdArgs) const {
6598}
6599
Douglas Katzman95354292015-06-23 20:42:09 +00006600void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6601 const InputInfo &Output,
6602 const InputInfoList &Inputs,
6603 const ArgList &Args,
6604 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006605 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006606
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006607 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6608 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006609 ArgStringList CmdArgs;
6610
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006611 std::string MArchString = "-march=hexagon";
6612 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006613
6614 RenderExtraToolArgs(JA, CmdArgs);
6615
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006616 std::string AsName = "hexagon-llvm-mc";
6617 std::string MCpuString = "-mcpu=hexagon" +
6618 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6619 CmdArgs.push_back("-filetype=obj");
6620 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6621
Tony Linthicum76329bf2011-12-12 21:14:55 +00006622 if (Output.isFilename()) {
6623 CmdArgs.push_back("-o");
6624 CmdArgs.push_back(Output.getFilename());
6625 } else {
6626 assert(Output.isNothing() && "Unexpected output");
6627 CmdArgs.push_back("-fsyntax-only");
6628 }
6629
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6631 std::string N = llvm::utostr(G.getValue());
6632 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6633 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006634
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006635 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006636
Tony Linthicum76329bf2011-12-12 21:14:55 +00006637 // Only pass -x if gcc will understand it; otherwise hope gcc
6638 // understands the suffix correctly. The main use case this would go
6639 // wrong in is for linker inputs if they happened to have an odd
6640 // suffix; really the only way to get this to happen is a command
6641 // like '-x foobar a.c' which will treat a.c like a linker input.
6642 //
6643 // FIXME: For the linker case specifically, can we safely convert
6644 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006645 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006646 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006647 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006648 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006649 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006650 else if (II.getType() == types::TY_AST)
6651 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006652 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006653 else if (II.getType() == types::TY_ModuleFile)
6654 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006655 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006656
6657 if (II.isFilename())
6658 CmdArgs.push_back(II.getFilename());
6659 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006660 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006661 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006662 II.getInputArg().render(Args, CmdArgs);
6663 }
6664
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006665 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006666 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006667}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006668
Douglas Katzman95354292015-06-23 20:42:09 +00006669void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6670 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006671}
6672
Douglas Katzman54366072015-07-27 16:53:08 +00006673static void
6674constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006675 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006676 const InputInfo &Output, const InputInfoList &Inputs,
6677 const ArgList &Args, ArgStringList &CmdArgs,
6678 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006679
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006680 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006681
Matthew Curtise689b052012-12-06 15:46:07 +00006682 //----------------------------------------------------------------------------
6683 //
6684 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006685 bool IsStatic = Args.hasArg(options::OPT_static);
6686 bool IsShared = Args.hasArg(options::OPT_shared);
6687 bool IsPIE = Args.hasArg(options::OPT_pie);
6688 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6689 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6690 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6691 bool UseG0 = false;
6692 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006693
Matthew Curtise689b052012-12-06 15:46:07 +00006694 //----------------------------------------------------------------------------
6695 // Silence warnings for various options
6696 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006697 Args.ClaimAllArgs(options::OPT_g_Group);
6698 Args.ClaimAllArgs(options::OPT_emit_llvm);
6699 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6700 // handled somewhere else.
6701 Args.ClaimAllArgs(options::OPT_static_libgcc);
6702
6703 //----------------------------------------------------------------------------
6704 //
6705 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006706 if (Args.hasArg(options::OPT_s))
6707 CmdArgs.push_back("-s");
6708
6709 if (Args.hasArg(options::OPT_r))
6710 CmdArgs.push_back("-r");
6711
6712 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006713 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006714
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006715 CmdArgs.push_back("-march=hexagon");
6716 std::string CpuVer =
6717 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6718 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6719 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006720
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006721 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006722 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006723 // The following should be the default, but doing as hexagon-gcc does.
6724 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006725 }
6726
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006727 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006728 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006729
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006730 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006731 CmdArgs.push_back("-pie");
6732
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006733 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6734 std::string N = llvm::utostr(G.getValue());
6735 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6736 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006737 }
6738
Matthew Curtise689b052012-12-06 15:46:07 +00006739 //----------------------------------------------------------------------------
6740 //
6741 //----------------------------------------------------------------------------
6742 CmdArgs.push_back("-o");
6743 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006744
Matthew Curtise689b052012-12-06 15:46:07 +00006745 //----------------------------------------------------------------------------
6746 // moslib
6747 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006748 std::vector<std::string> OsLibs;
6749 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006750
Sean Silva14facf32015-06-09 01:57:17 +00006751 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6752 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006753 OsLibs.emplace_back(A->getValue());
6754 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006755 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006756 if (OsLibs.empty()) {
6757 OsLibs.push_back("standalone");
6758 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006759 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006760
Matthew Curtise689b052012-12-06 15:46:07 +00006761 //----------------------------------------------------------------------------
6762 // Start Files
6763 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006764 const std::string MCpuSuffix = "/" + CpuVer;
6765 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6766 const std::string RootDir =
6767 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6768 const std::string StartSubDir =
6769 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006770
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006771 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6772 const char *Name) -> std::string {
6773 std::string RelName = SubDir + Name;
6774 std::string P = HTC.GetFilePath(RelName.c_str());
6775 if (llvm::sys::fs::exists(P))
6776 return P;
6777 return RootDir + RelName;
6778 };
6779
6780 if (IncStdLib && IncStartFiles) {
6781 if (!IsShared) {
6782 if (HasStandalone) {
6783 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6784 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006785 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006786 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6787 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006788 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006789 std::string Init = UseShared
6790 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6791 : Find(RootDir, StartSubDir, "/init.o");
6792 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006793 }
6794
6795 //----------------------------------------------------------------------------
6796 // Library Search Paths
6797 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006798 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6799 for (const auto &LibPath : LibPaths)
6800 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006801
6802 //----------------------------------------------------------------------------
6803 //
6804 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006805 Args.AddAllArgs(CmdArgs,
6806 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6807 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006808
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006809 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006810
6811 //----------------------------------------------------------------------------
6812 // Libraries
6813 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006814 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006815 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006816 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006817 CmdArgs.push_back("-lm");
6818 }
6819
6820 CmdArgs.push_back("--start-group");
6821
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006822 if (!IsShared) {
6823 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006824 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006825 CmdArgs.push_back("-lc");
6826 }
6827 CmdArgs.push_back("-lgcc");
6828
6829 CmdArgs.push_back("--end-group");
6830 }
6831
6832 //----------------------------------------------------------------------------
6833 // End files
6834 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006835 if (IncStdLib && IncStartFiles) {
6836 std::string Fini = UseShared
6837 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6838 : Find(RootDir, StartSubDir, "/fini.o");
6839 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006840 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006841}
6842
Douglas Katzman95354292015-06-23 20:42:09 +00006843void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6844 const InputInfo &Output,
6845 const InputInfoList &Inputs,
6846 const ArgList &Args,
6847 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006848 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006849
6850 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006851 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006852 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006853
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006854 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006855 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006856 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006857}
6858// Hexagon tools end.
6859
Tom Stellard8fa33092015-07-18 01:49:05 +00006860void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6861 const InputInfo &Output,
6862 const InputInfoList &Inputs,
6863 const ArgList &Args,
6864 const char *LinkingOutput) const {
6865
6866 std::string Linker = getToolChain().GetProgramPath(getShortName());
6867 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006868 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00006869 CmdArgs.push_back("-shared");
6870 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00006871 CmdArgs.push_back(Output.getFilename());
6872 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6873 CmdArgs, Inputs));
6874}
6875// AMDGPU tools end.
6876
Dan Gohman52816862015-12-16 23:30:41 +00006877wasm::Linker::Linker(const ToolChain &TC)
6878 : GnuTool("wasm::Linker", "lld", TC) {}
6879
6880bool wasm::Linker::isLinkJob() const {
6881 return true;
6882}
6883
6884bool wasm::Linker::hasIntegratedCPP() const {
6885 return false;
6886}
6887
6888void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6889 const InputInfo &Output,
6890 const InputInfoList &Inputs,
6891 const ArgList &Args,
6892 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006893
6894 const ToolChain &ToolChain = getToolChain();
6895 const Driver &D = ToolChain.getDriver();
6896 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006897 ArgStringList CmdArgs;
6898 CmdArgs.push_back("-flavor");
6899 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006900
6901 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006902 // size is of particular importance. This is significantly facilitated by
6903 // the enabling of -ffunction-sections and -fdata-sections in
6904 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006905 if (areOptimizationsEnabled(Args))
6906 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006907
Dan Gohman57b62c52016-02-22 19:26:15 +00006908 if (Args.hasArg(options::OPT_rdynamic))
6909 CmdArgs.push_back("-export-dynamic");
6910 if (Args.hasArg(options::OPT_s))
6911 CmdArgs.push_back("--strip-all");
6912 if (Args.hasArg(options::OPT_shared))
6913 CmdArgs.push_back("-shared");
6914 if (Args.hasArg(options::OPT_static))
6915 CmdArgs.push_back("-Bstatic");
6916
6917 Args.AddAllArgs(CmdArgs, options::OPT_L);
6918 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6919
6920 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6921 if (Args.hasArg(options::OPT_shared))
6922 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6923 else if (Args.hasArg(options::OPT_pie))
6924 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6925 else
6926 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6927
6928 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6929 }
6930
6931 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6932
6933 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6934 if (D.CCCIsCXX())
6935 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6936
6937 if (Args.hasArg(options::OPT_pthread))
6938 CmdArgs.push_back("-lpthread");
6939
6940 CmdArgs.push_back("-lc");
6941 CmdArgs.push_back("-lcompiler_rt");
6942 }
6943
6944 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6945 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6946
Dan Gohman52816862015-12-16 23:30:41 +00006947 CmdArgs.push_back("-o");
6948 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006949
Dan Gohman52816862015-12-16 23:30:41 +00006950 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6951}
6952
Renato Golin7c542b42015-07-27 23:44:45 +00006953const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006954 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006955 if (!Arch.empty())
6956 MArch = Arch;
6957 else
Bernard Ogden31561762013-12-12 13:27:11 +00006958 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006959 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006960
6961 // Handle -march=native.
6962 if (MArch == "native") {
6963 std::string CPU = llvm::sys::getHostCPUName();
6964 if (CPU != "generic") {
6965 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006966 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006967 // If there is no valid architecture suffix for this CPU we don't know how
6968 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006969 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006970 MArch = "";
6971 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006972 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006973 }
6974 }
6975
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006976 return MArch;
6977}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006978
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006979/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006980StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006981 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006982 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6983 // here means an -march=native that we can't handle, so instead return no CPU.
6984 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006985 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006986
John Brawna95c1a82015-05-08 12:52:18 +00006987 // We need to return an empty string here on invalid MArch values as the
6988 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006989 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006990}
6991
6992/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006993std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006994 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006995 // FIXME: Warn on inconsistent use of -mcpu and -march.
6996 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006997 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006998 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006999 // Handle -mcpu=native.
7000 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00007001 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00007002 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00007003 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00007004 }
7005
Renato Goline17c5802015-07-27 23:44:42 +00007006 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00007007}
7008
7009/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007010/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00007011// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007012StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
7013 const llvm::Triple &Triple) {
7014 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007015 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00007016 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007017 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007018 if (ArchKind == llvm::ARM::AK_INVALID)
7019 // In case of generic Arch, i.e. "arm",
7020 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00007021 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007022 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00007023 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
7024 // armv7k triple if it's actually been specified via "-arch armv7k".
7025 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00007026 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00007027 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00007028 }
Renato Golin3c007252015-05-28 15:05:53 +00007029 if (ArchKind == llvm::ARM::AK_INVALID)
7030 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00007031 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00007032}
7033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007034void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00007035 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007036 if (Args.hasArg(options::OPT_r))
7037 return;
7038
John Brawn94fd9632015-05-21 12:19:49 +00007039 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
7040 // to generate BE-8 executables.
7041 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
7042 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00007043}
7044
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007045mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00007046 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
7047 // was first introduced in Release 3. However, other compilers have
7048 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007049 return (NanEncoding)llvm::StringSwitch<int>(CPU)
7050 .Case("mips1", NanLegacy)
7051 .Case("mips2", NanLegacy)
7052 .Case("mips3", NanLegacy)
7053 .Case("mips4", NanLegacy)
7054 .Case("mips5", NanLegacy)
7055 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007056 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007057 .Case("mips32r3", NanLegacy | Nan2008)
7058 .Case("mips32r5", NanLegacy | Nan2008)
7059 .Case("mips32r6", Nan2008)
7060 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00007061 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00007062 .Case("mips64r3", NanLegacy | Nan2008)
7063 .Case("mips64r5", NanLegacy | Nan2008)
7064 .Case("mips64r6", Nan2008)
7065 .Default(NanLegacy);
7066}
7067
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007068bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
7069 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
7070 return A && (A->getValue() == StringRef(Value));
7071}
7072
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007073bool mips::isUCLibc(const ArgList &Args) {
7074 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007075 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007076}
7077
Daniel Sanders2bf13662014-07-10 14:40:57 +00007078bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007079 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7080 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007081 .Case("2008", true)
7082 .Case("legacy", false)
7083 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007084
7085 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007086 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007087 .Cases("mips32r6", "mips64r6", true)
7088 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007089
7090 return false;
7091}
7092
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007093bool mips::isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName) {
7094 if (!Triple.isAndroid())
7095 return false;
7096
7097 // Android MIPS32R6 defaults to FP64A.
7098 return llvm::StringSwitch<bool>(CPUName)
7099 .Case("mips32r6", true)
7100 .Default(false);
7101}
7102
Daniel Sanders379d44b2014-07-16 11:52:23 +00007103bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007104 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007105 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Petar Jovanovic3ca16222016-05-18 12:46:06 +00007106 Triple.getVendor() != llvm::Triple::MipsTechnologies &&
7107 !Triple.isAndroid())
Daniel Sanders379d44b2014-07-16 11:52:23 +00007108 return false;
7109
7110 if (ABIName != "32")
7111 return false;
7112
Toma Tabacu94ea6862015-06-16 13:54:13 +00007113 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7114 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007115 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007116 return false;
7117
Daniel Sanders379d44b2014-07-16 11:52:23 +00007118 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007119 .Cases("mips2", "mips3", "mips4", "mips5", true)
7120 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7121 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7122 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007123}
7124
Toma Tabacu94ea6862015-06-16 13:54:13 +00007125bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7126 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007127 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007128 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7129
7130 // FPXX shouldn't be used if -msingle-float is present.
7131 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7132 options::OPT_mdouble_float))
7133 if (A->getOption().matches(options::OPT_msingle_float))
7134 UseFPXX = false;
7135
7136 return UseFPXX;
7137}
7138
Tim Northover157d9112014-01-16 08:48:16 +00007139llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007140 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7141 // archs which Darwin doesn't use.
7142
7143 // The matching this routine does is fairly pointless, since it is neither the
7144 // complete architecture list, nor a reasonable subset. The problem is that
7145 // historically the driver driver accepts this and also ties its -march=
7146 // handling to the architecture name, so we need to be careful before removing
7147 // support for it.
7148
7149 // This code must be kept in sync with Clang's Darwin specific argument
7150 // translation.
7151
7152 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007153 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7154 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7155 .Case("ppc64", llvm::Triple::ppc64)
7156 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7157 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7158 llvm::Triple::x86)
7159 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7160 // This is derived from the driver driver.
7161 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7162 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7163 .Cases("armv7s", "xscale", llvm::Triple::arm)
7164 .Case("arm64", llvm::Triple::aarch64)
7165 .Case("r600", llvm::Triple::r600)
7166 .Case("amdgcn", llvm::Triple::amdgcn)
7167 .Case("nvptx", llvm::Triple::nvptx)
7168 .Case("nvptx64", llvm::Triple::nvptx64)
7169 .Case("amdil", llvm::Triple::amdil)
7170 .Case("spir", llvm::Triple::spir)
7171 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007172}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007173
Tim Northover157d9112014-01-16 08:48:16 +00007174void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007175 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007176 T.setArch(Arch);
7177
7178 if (Str == "x86_64h")
7179 T.setArchName(Str);
7180 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7181 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007182 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007183 }
7184}
7185
Bob Wilsondecc03e2012-11-23 06:14:39 +00007186const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007187 const InputInfo &Input) {
7188 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007189}
7190
Bob Wilsondecc03e2012-11-23 06:14:39 +00007191const char *Clang::getBaseInputStem(const ArgList &Args,
7192 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007193 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007194
Chris Lattner906bb902011-01-16 08:14:11 +00007195 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007196 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007197
7198 return Str;
7199}
7200
Bob Wilsondecc03e2012-11-23 06:14:39 +00007201const char *Clang::getDependencyFileName(const ArgList &Args,
7202 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007203 // FIXME: Think about this more.
7204 std::string Res;
7205
7206 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007207 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007208 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007209 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007210 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007211 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007212 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007213}
7214
Douglas Katzman95354292015-06-23 20:42:09 +00007215void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7216 const InputInfo &Output,
7217 const InputInfoList &Inputs,
7218 const ArgList &Args,
7219 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007220 const ToolChain &ToolChain = getToolChain();
7221 const Driver &D = ToolChain.getDriver();
7222 ArgStringList CmdArgs;
7223
7224 // Silence warning for "clang -g foo.o -o foo"
7225 Args.ClaimAllArgs(options::OPT_g_Group);
7226 // and "clang -emit-llvm foo.o -o foo"
7227 Args.ClaimAllArgs(options::OPT_emit_llvm);
7228 // and for "clang -w foo.o -o foo". Other warning options are already
7229 // handled somewhere else.
7230 Args.ClaimAllArgs(options::OPT_w);
7231
7232 if (!D.SysRoot.empty())
7233 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7234
7235 // CloudABI only supports static linkage.
7236 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007237
7238 // CloudABI uses Position Independent Executables exclusively.
7239 CmdArgs.push_back("-pie");
7240 CmdArgs.push_back("--no-dynamic-linker");
7241 CmdArgs.push_back("-zrelro");
7242
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007243 CmdArgs.push_back("--eh-frame-hdr");
7244 CmdArgs.push_back("--gc-sections");
7245
7246 if (Output.isFilename()) {
7247 CmdArgs.push_back("-o");
7248 CmdArgs.push_back(Output.getFilename());
7249 } else {
7250 assert(Output.isNothing() && "Invalid output.");
7251 }
7252
Douglas Katzman78b37b02015-11-17 20:28:07 +00007253 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007254 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7255 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7256 }
7257
7258 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007259 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007260 Args.AddAllArgs(CmdArgs,
7261 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7262 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007263
Teresa Johnson945bc502015-10-15 20:35:53 +00007264 if (D.isUsingLTO())
7265 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007266
7267 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7268
Douglas Katzman78b37b02015-11-17 20:28:07 +00007269 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007270 if (D.CCCIsCXX())
7271 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7272 CmdArgs.push_back("-lc");
7273 CmdArgs.push_back("-lcompiler_rt");
7274 }
7275
Douglas Katzman78b37b02015-11-17 20:28:07 +00007276 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007277 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7278
7279 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007280 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007281}
7282
Douglas Katzman95354292015-06-23 20:42:09 +00007283void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7284 const InputInfo &Output,
7285 const InputInfoList &Inputs,
7286 const ArgList &Args,
7287 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007288 ArgStringList CmdArgs;
7289
7290 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7291 const InputInfo &Input = Inputs[0];
7292
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007293 // Determine the original source input.
7294 const Action *SourceAction = &JA;
7295 while (SourceAction->getKind() != Action::InputClass) {
7296 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7297 SourceAction = SourceAction->getInputs()[0];
7298 }
7299
Eric Christopherf5a8f492015-12-08 00:10:10 +00007300 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007301 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007302 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7303 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007304 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007305 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007306 const llvm::Triple &T(getToolChain().getTriple());
7307 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007308 CmdArgs.push_back("-Q");
7309 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007310
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007311 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007312 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007313 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007314 if (Args.hasArg(options::OPT_gstabs))
7315 CmdArgs.push_back("--gstabs");
7316 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007317 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007318 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007319
Daniel Dunbarbe220842009-03-20 16:06:39 +00007320 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007321 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007322
Daniel Dunbar6d484762010-07-22 01:47:22 +00007323 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007324 if (getToolChain().getArch() == llvm::Triple::x86 ||
7325 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007326 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7327 CmdArgs.push_back("-force_cpusubtype_ALL");
7328
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007329 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007330 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007331 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007332 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007333 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007334 CmdArgs.push_back("-static");
7335
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007336 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007337
7338 assert(Output.isFilename() && "Unexpected lipo output.");
7339 CmdArgs.push_back("-o");
7340 CmdArgs.push_back(Output.getFilename());
7341
Daniel Dunbarb440f562010-08-02 02:38:21 +00007342 assert(Input.isFilename() && "Invalid input.");
7343 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007344
7345 // asm_final spec is empty.
7346
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007347 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007348 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007349}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007350
Tim Northover157d9112014-01-16 08:48:16 +00007351void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007352
Tim Northover157d9112014-01-16 08:48:16 +00007353void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7354 ArgStringList &CmdArgs) const {
7355 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007356
Daniel Dunbarc1964212009-03-26 16:23:12 +00007357 // Derived from darwin_arch spec.
7358 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007359 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007360
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007361 // FIXME: Is this needed anymore?
7362 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007363 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007364}
7365
Douglas Katzman95354292015-06-23 20:42:09 +00007366bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007367 // We only need to generate a temp path for LTO if we aren't compiling object
7368 // files. When compiling source files, we run 'dsymutil' after linking. We
7369 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007370 for (const auto &Input : Inputs)
7371 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007372 return true;
7373
7374 return false;
7375}
7376
Douglas Katzman95354292015-06-23 20:42:09 +00007377void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7378 ArgStringList &CmdArgs,
7379 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007380 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007381 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007382
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007383 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007384 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007385 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007386 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007387 }
7388
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007389 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007390 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007391 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7392 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007393
Bob Wilson3d27dad2013-08-02 22:25:34 +00007394 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7395 CmdArgs.push_back("-export_dynamic");
7396
Bob Wilsonb111ec92015-03-02 19:01:14 +00007397 // If we are using App Extension restrictions, pass a flag to the linker
7398 // telling it that the compiled code has been audited.
7399 if (Args.hasFlag(options::OPT_fapplication_extension,
7400 options::OPT_fno_application_extension, false))
7401 CmdArgs.push_back("-application_extension");
7402
Teresa Johnson945bc502015-10-15 20:35:53 +00007403 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007404 // If we are using LTO, then automatically create a temporary file path for
7405 // the linker to use, so that it's lifetime will extend past a possible
7406 // dsymutil step.
7407 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7408 const char *TmpPath = C.getArgs().MakeArgString(
7409 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7410 C.addTempFile(TmpPath);
7411 CmdArgs.push_back("-object_path_lto");
7412 CmdArgs.push_back(TmpPath);
7413 }
7414
7415 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7416 // it in clang installed libraries. If not found, the option is not used
7417 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7418 if (Version[0] >= 133) {
7419 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7420 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7421 SmallString<128> LibLTOPath(P);
7422 llvm::sys::path::append(LibLTOPath, "lib");
7423 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7424 if (llvm::sys::fs::exists(LibLTOPath)) {
7425 CmdArgs.push_back("-lto_library");
7426 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7427 } else {
7428 D.Diag(diag::warn_drv_lto_libpath);
7429 }
7430 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007431 }
7432
Daniel Dunbarc1964212009-03-26 16:23:12 +00007433 // Derived from the "link" spec.
7434 Args.AddAllArgs(CmdArgs, options::OPT_static);
7435 if (!Args.hasArg(options::OPT_static))
7436 CmdArgs.push_back("-dynamic");
7437 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7438 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7439 // here. How do we wish to handle such things?
7440 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007441
Daniel Dunbarc1964212009-03-26 16:23:12 +00007442 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007443 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007444 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007445 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007446
7447 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7448 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7449 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7450
7451 Arg *A;
7452 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7453 (A = Args.getLastArg(options::OPT_current__version)) ||
7454 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007455 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7456 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007457
7458 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7459 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7460 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7461 } else {
7462 CmdArgs.push_back("-dylib");
7463
7464 Arg *A;
7465 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7466 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7467 (A = Args.getLastArg(options::OPT_client__name)) ||
7468 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7469 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7470 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007471 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7472 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007473
Daniel Dunbarc1964212009-03-26 16:23:12 +00007474 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7475 "-dylib_compatibility_version");
7476 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7477 "-dylib_current_version");
7478
Tim Northover157d9112014-01-16 08:48:16 +00007479 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007480
7481 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7482 "-dylib_install_name");
7483 }
7484
7485 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7486 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7487 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007488 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007489 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007490 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7491 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7492 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7493 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7494 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7495 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007496 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007497 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7498 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7499 Args.AddAllArgs(CmdArgs, options::OPT_init);
7500
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007501 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007502 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007503
Daniel Dunbarc1964212009-03-26 16:23:12 +00007504 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7505 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7506 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7507 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7508 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007510 if (const Arg *A =
7511 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7512 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007513 if (A->getOption().matches(options::OPT_fpie) ||
7514 A->getOption().matches(options::OPT_fPIE))
7515 CmdArgs.push_back("-pie");
7516 else
7517 CmdArgs.push_back("-no_pie");
7518 }
Steven Wu574b0f22016-03-01 01:07:58 +00007519 // for embed-bitcode, use -bitcode_bundle in linker command
7520 if (C.getDriver().embedBitcodeEnabled() ||
7521 C.getDriver().embedBitcodeMarkerOnly()) {
7522 // Check if the toolchain supports bitcode build flow.
7523 if (MachOTC.SupportsEmbeddedBitcode())
7524 CmdArgs.push_back("-bitcode_bundle");
7525 else
7526 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7527 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007528
7529 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7530 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7531 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7532 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7533 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7534 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7535 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7536 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7537 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7538 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7539 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7540 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7541 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7542 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7543 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7544 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007545
Daniel Dunbar84384642011-05-02 21:03:47 +00007546 // Give --sysroot= preference, over the Apple specific behavior to also use
7547 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007548 StringRef sysroot = C.getSysRoot();
7549 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007550 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007551 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007552 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7553 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007554 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007555 }
7556
Daniel Dunbarc1964212009-03-26 16:23:12 +00007557 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7558 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7559 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7560 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7561 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007562 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007563 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7564 Args.AddAllArgs(CmdArgs, options::OPT_y);
7565 Args.AddLastArg(CmdArgs, options::OPT_w);
7566 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7567 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7568 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7569 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7570 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7571 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7572 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7573 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7574 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7575 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7576 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7577 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7578}
7579
Douglas Katzman95354292015-06-23 20:42:09 +00007580void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7581 const InputInfo &Output,
7582 const InputInfoList &Inputs,
7583 const ArgList &Args,
7584 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007585 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007586
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007587 // If the number of arguments surpasses the system limits, we will encode the
7588 // input files in a separate file, shortening the command line. To this end,
7589 // build a list of input file names that can be passed via a file with the
7590 // -filelist linker option.
7591 llvm::opt::ArgStringList InputFileList;
7592
Daniel Dunbarc1964212009-03-26 16:23:12 +00007593 // The logic here is derived from gcc's behavior; most of which
7594 // comes from specs (starting with link_command). Consult gcc for
7595 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007596 ArgStringList CmdArgs;
7597
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007598 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7599 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7600 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007601 for (const auto &Arg : Args)
7602 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007603 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007604 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007605 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007606 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007607 return;
7608 }
7609
Daniel Dunbarc1964212009-03-26 16:23:12 +00007610 // I'm not sure why this particular decomposition exists in gcc, but
7611 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007612 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007613
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007614 // It seems that the 'e' option is completely ignored for dynamic executables
7615 // (the default), and with static executables, the last one wins, as expected.
7616 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7617 options::OPT_Z_Flag, options::OPT_u_Group,
7618 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007619
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007620 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7621 // members of static archive libraries which implement Objective-C classes or
7622 // categories.
7623 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7624 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007625
Daniel Dunbarc1964212009-03-26 16:23:12 +00007626 CmdArgs.push_back("-o");
7627 CmdArgs.push_back(Output.getFilename());
7628
Douglas Katzman78b37b02015-11-17 20:28:07 +00007629 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007630 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007631
Peter Collingbournec4122c12015-06-15 21:08:13 +00007632 // SafeStack requires its own runtime libraries
7633 // These libraries should be linked first, to make sure the
7634 // __safestack_init constructor executes before everything else
7635 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7636 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7637 "libclang_rt.safestack_osx.a",
7638 /*AlwaysLink=*/true);
7639 }
7640
Daniel Dunbarc1964212009-03-26 16:23:12 +00007641 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007642
Douglas Gregor9295df02012-05-15 21:00:27 +00007643 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007644 // Build the input file for -filelist (list of linker input files) in case we
7645 // need it later
7646 for (const auto &II : Inputs) {
7647 if (!II.isFilename()) {
7648 // This is a linker input argument.
7649 // We cannot mix input arguments and file names in a -filelist input, thus
7650 // we prematurely stop our list (remaining files shall be passed as
7651 // arguments).
7652 if (InputFileList.size() > 0)
7653 break;
7654
7655 continue;
7656 }
7657
7658 InputFileList.push_back(II.getFilename());
7659 }
7660
Douglas Katzman78b37b02015-11-17 20:28:07 +00007661 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007662 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7663
Douglas Katzman78b37b02015-11-17 20:28:07 +00007664 if (isObjCRuntimeLinked(Args) &&
7665 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007666 // We use arclite library for both ARC and subscripting support.
7667 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7668
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007669 CmdArgs.push_back("-framework");
7670 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007671 // Link libobj.
7672 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007673 }
John McCall31168b02011-06-15 23:02:42 +00007674
Daniel Dunbarc1964212009-03-26 16:23:12 +00007675 if (LinkingOutput) {
7676 CmdArgs.push_back("-arch_multiple");
7677 CmdArgs.push_back("-final_output");
7678 CmdArgs.push_back(LinkingOutput);
7679 }
7680
Daniel Dunbarc1964212009-03-26 16:23:12 +00007681 if (Args.hasArg(options::OPT_fnested_functions))
7682 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007683
Justin Bognerc7701242015-05-12 05:44:36 +00007684 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7685
Douglas Katzman78b37b02015-11-17 20:28:07 +00007686 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007687 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007688 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007689
Daniel Dunbarc1964212009-03-26 16:23:12 +00007690 // link_ssp spec is empty.
7691
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007692 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007693 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007694 }
7695
Douglas Katzman78b37b02015-11-17 20:28:07 +00007696 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007697 // endfile_spec is empty.
7698 }
7699
7700 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7701 Args.AddAllArgs(CmdArgs, options::OPT_F);
7702
Steven Wu3ffb61b2015-02-06 18:08:29 +00007703 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007704 for (const Arg *A : Args.filtered(options::OPT_iframework))
7705 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007706
Douglas Katzman78b37b02015-11-17 20:28:07 +00007707 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007708 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7709 if (A->getValue() == StringRef("Accelerate")) {
7710 CmdArgs.push_back("-framework");
7711 CmdArgs.push_back("Accelerate");
7712 }
7713 }
7714 }
7715
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007716 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007717 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007718 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007719 Cmd->setInputFileList(std::move(InputFileList));
7720 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007721}
7722
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007723void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007724 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007725 const InputInfoList &Inputs,
7726 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007727 const char *LinkingOutput) const {
7728 ArgStringList CmdArgs;
7729
7730 CmdArgs.push_back("-create");
7731 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007732
7733 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007734 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007735
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007736 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007737 assert(II.isFilename() && "Unexpected lipo input.");
7738 CmdArgs.push_back(II.getFilename());
7739 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007740
7741 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007742 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007743}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007744
Daniel Dunbar88299622010-06-04 18:28:36 +00007745void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007746 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007747 const InputInfoList &Inputs,
7748 const ArgList &Args,
7749 const char *LinkingOutput) const {
7750 ArgStringList CmdArgs;
7751
Daniel Dunbareb86b042011-05-09 17:23:16 +00007752 CmdArgs.push_back("-o");
7753 CmdArgs.push_back(Output.getFilename());
7754
Daniel Dunbar88299622010-06-04 18:28:36 +00007755 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7756 const InputInfo &Input = Inputs[0];
7757 assert(Input.isFilename() && "Unexpected dsymutil input.");
7758 CmdArgs.push_back(Input.getFilename());
7759
Daniel Dunbar88299622010-06-04 18:28:36 +00007760 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007761 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007762 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007763}
7764
Eric Christopher551ef452011-08-23 17:56:55 +00007765void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007766 const InputInfo &Output,
7767 const InputInfoList &Inputs,
7768 const ArgList &Args,
7769 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007770 ArgStringList CmdArgs;
7771 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007772 CmdArgs.push_back("--debug-info");
7773 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007774 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007775
7776 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7777 const InputInfo &Input = Inputs[0];
7778 assert(Input.isFilename() && "Unexpected verify input");
7779
7780 // Grabbing the output of the earlier dsymutil run.
7781 CmdArgs.push_back(Input.getFilename());
7782
7783 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007784 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007785 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007786}
7787
Douglas Katzman95354292015-06-23 20:42:09 +00007788void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007789 const InputInfo &Output,
7790 const InputInfoList &Inputs,
7791 const ArgList &Args,
7792 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007793 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007794 ArgStringList CmdArgs;
7795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007796 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007797
7798 CmdArgs.push_back("-o");
7799 CmdArgs.push_back(Output.getFilename());
7800
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007801 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007802 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007803
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007804 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007805 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007806}
7807
Douglas Katzman95354292015-06-23 20:42:09 +00007808void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7809 const InputInfo &Output,
7810 const InputInfoList &Inputs,
7811 const ArgList &Args,
7812 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007813 ArgStringList CmdArgs;
7814
David Chisnall272a0712012-02-29 15:06:12 +00007815 // Demangle C++ names in errors
7816 CmdArgs.push_back("-C");
7817
Douglas Katzman78b37b02015-11-17 20:28:07 +00007818 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007819 CmdArgs.push_back("-e");
7820 CmdArgs.push_back("_start");
7821 }
7822
7823 if (Args.hasArg(options::OPT_static)) {
7824 CmdArgs.push_back("-Bstatic");
7825 CmdArgs.push_back("-dn");
7826 } else {
7827 CmdArgs.push_back("-Bdynamic");
7828 if (Args.hasArg(options::OPT_shared)) {
7829 CmdArgs.push_back("-shared");
7830 } else {
7831 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007832 CmdArgs.push_back(
7833 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007834 }
7835 }
7836
7837 if (Output.isFilename()) {
7838 CmdArgs.push_back("-o");
7839 CmdArgs.push_back(Output.getFilename());
7840 } else {
7841 assert(Output.isNothing() && "Invalid output.");
7842 }
7843
Douglas Katzman78b37b02015-11-17 20:28:07 +00007844 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007845 if (!Args.hasArg(options::OPT_shared))
7846 CmdArgs.push_back(
7847 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7848
7849 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7850 CmdArgs.push_back(
7851 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7852 CmdArgs.push_back(
7853 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007854 }
7855
Douglas Katzman6059ef92015-11-17 17:41:23 +00007856 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007857
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007858 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7859 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007860
7861 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7862
Douglas Katzman78b37b02015-11-17 20:28:07 +00007863 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007864 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007865 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007866 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007867 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007868 if (!Args.hasArg(options::OPT_shared)) {
7869 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007870 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007871 }
David Chisnallf571cde2012-02-15 13:39:01 +00007872 }
7873
Douglas Katzman78b37b02015-11-17 20:28:07 +00007874 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007875 CmdArgs.push_back(
7876 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007877 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007878 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007879
Xinliang David Li69306c02015-10-22 06:15:31 +00007880 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007881
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007882 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007883 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007884}
7885
Douglas Katzman95354292015-06-23 20:42:09 +00007886void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7887 const InputInfo &Output,
7888 const InputInfoList &Inputs,
7889 const ArgList &Args,
7890 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007891 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007892 ArgStringList CmdArgs;
7893
Rafael Espindolacc126272014-02-28 01:55:21 +00007894 switch (getToolChain().getArch()) {
7895 case llvm::Triple::x86:
7896 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7897 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007898 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007899 break;
7900
7901 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007902 CmdArgs.push_back("-mppc");
7903 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007904 break;
7905
7906 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007907 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007908 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007909 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7910 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7911 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007912 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007913 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007914
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007915 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007916 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007917 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7918 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7919 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007920 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007921 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007922
7923 case llvm::Triple::mips64:
7924 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007925 StringRef CPUName;
7926 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007927 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007928
7929 CmdArgs.push_back("-mabi");
7930 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7931
7932 if (getToolChain().getArch() == llvm::Triple::mips64)
7933 CmdArgs.push_back("-EB");
7934 else
7935 CmdArgs.push_back("-EL");
7936
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007937 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007938 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007939 }
7940
Rafael Espindolacc126272014-02-28 01:55:21 +00007941 default:
7942 break;
7943 }
7944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007945 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007946
7947 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007948 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007949
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007950 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007951 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007953 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007954 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007955}
7956
Douglas Katzman95354292015-06-23 20:42:09 +00007957void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7958 const InputInfo &Output,
7959 const InputInfoList &Inputs,
7960 const ArgList &Args,
7961 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007962 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007963 ArgStringList CmdArgs;
7964
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007965 // Silence warning for "clang -g foo.o -o foo"
7966 Args.ClaimAllArgs(options::OPT_g_Group);
7967 // and "clang -emit-llvm foo.o -o foo"
7968 Args.ClaimAllArgs(options::OPT_emit_llvm);
7969 // and for "clang -w foo.o -o foo". Other warning options are already
7970 // handled somewhere else.
7971 Args.ClaimAllArgs(options::OPT_w);
7972
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007973 if (getToolChain().getArch() == llvm::Triple::mips64)
7974 CmdArgs.push_back("-EB");
7975 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7976 CmdArgs.push_back("-EL");
7977
Douglas Katzman78b37b02015-11-17 20:28:07 +00007978 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007979 CmdArgs.push_back("-e");
7980 CmdArgs.push_back("__start");
7981 }
7982
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007983 if (Args.hasArg(options::OPT_static)) {
7984 CmdArgs.push_back("-Bstatic");
7985 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007986 if (Args.hasArg(options::OPT_rdynamic))
7987 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007988 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007989 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007990 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007991 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007992 } else {
7993 CmdArgs.push_back("-dynamic-linker");
7994 CmdArgs.push_back("/usr/libexec/ld.so");
7995 }
7996 }
7997
Rafael Espindola044f7832013-06-05 04:28:55 +00007998 if (Args.hasArg(options::OPT_nopie))
7999 CmdArgs.push_back("-nopie");
8000
Daniel Dunbarb440f562010-08-02 02:38:21 +00008001 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008002 CmdArgs.push_back("-o");
8003 CmdArgs.push_back(Output.getFilename());
8004 } else {
8005 assert(Output.isNothing() && "Invalid output.");
8006 }
8007
Douglas Katzman78b37b02015-11-17 20:28:07 +00008008 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008009 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008010 if (Args.hasArg(options::OPT_pg))
8011 CmdArgs.push_back(
8012 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00008013 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008014 CmdArgs.push_back(
8015 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8016 CmdArgs.push_back(
8017 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008018 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008019 CmdArgs.push_back(
8020 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008021 }
8022 }
8023
Edward O'Callaghan5c521462009-10-28 15:13:08 +00008024 std::string Triple = getToolChain().getTripleString();
8025 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00008026 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008027 CmdArgs.push_back(
8028 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008029
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008030 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
8031 options::OPT_e, options::OPT_s, options::OPT_t,
8032 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008033
Daniel Dunbar54423b22010-09-17 00:24:54 +00008034 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008035
Douglas Katzman78b37b02015-11-17 20:28:07 +00008036 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008037 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008038 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008039 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00008040 CmdArgs.push_back("-lm_p");
8041 else
8042 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00008043 }
8044
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008045 // FIXME: For some reason GCC passes -lgcc before adding
8046 // the default system libraries. Just mimic this for now.
8047 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008048
Eric Christopher17674ec2012-09-13 06:32:34 +00008049 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008050 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
8051 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00008052 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008053 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00008054 }
8055
Chandler Carruth45661652011-12-17 22:32:42 +00008056 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00008057 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008058 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00008059 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008060 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00008061 }
Eric Christopher17674ec2012-09-13 06:32:34 +00008062
Daniel Dunbara8888ac2009-08-03 01:28:59 +00008063 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008064 }
8065
Douglas Katzman78b37b02015-11-17 20:28:07 +00008066 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008067 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008068 CmdArgs.push_back(
8069 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008070 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008071 CmdArgs.push_back(
8072 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008073 }
8074
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008075 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008076 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00008077}
Ed Schoutene33194b2009-04-02 19:13:12 +00008078
Douglas Katzman95354292015-06-23 20:42:09 +00008079void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8080 const InputInfo &Output,
8081 const InputInfoList &Inputs,
8082 const ArgList &Args,
8083 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008084 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008085 ArgStringList CmdArgs;
8086
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008087 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008088
8089 CmdArgs.push_back("-o");
8090 CmdArgs.push_back(Output.getFilename());
8091
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008092 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008093 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008094
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008095 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008096 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008097}
8098
Douglas Katzman95354292015-06-23 20:42:09 +00008099void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8100 const InputInfo &Output,
8101 const InputInfoList &Inputs,
8102 const ArgList &Args,
8103 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008104 const Driver &D = getToolChain().getDriver();
8105 ArgStringList CmdArgs;
8106
Douglas Katzman78b37b02015-11-17 20:28:07 +00008107 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008108 CmdArgs.push_back("-e");
8109 CmdArgs.push_back("__start");
8110 }
8111
8112 if (Args.hasArg(options::OPT_static)) {
8113 CmdArgs.push_back("-Bstatic");
8114 } else {
8115 if (Args.hasArg(options::OPT_rdynamic))
8116 CmdArgs.push_back("-export-dynamic");
8117 CmdArgs.push_back("--eh-frame-hdr");
8118 CmdArgs.push_back("-Bdynamic");
8119 if (Args.hasArg(options::OPT_shared)) {
8120 CmdArgs.push_back("-shared");
8121 } else {
8122 CmdArgs.push_back("-dynamic-linker");
8123 CmdArgs.push_back("/usr/libexec/ld.so");
8124 }
8125 }
8126
8127 if (Output.isFilename()) {
8128 CmdArgs.push_back("-o");
8129 CmdArgs.push_back(Output.getFilename());
8130 } else {
8131 assert(Output.isNothing() && "Invalid output.");
8132 }
8133
Douglas Katzman78b37b02015-11-17 20:28:07 +00008134 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008135 if (!Args.hasArg(options::OPT_shared)) {
8136 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008137 CmdArgs.push_back(
8138 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008139 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008140 CmdArgs.push_back(
8141 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8142 CmdArgs.push_back(
8143 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008144 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008145 CmdArgs.push_back(
8146 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008147 }
8148 }
8149
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008150 Args.AddAllArgs(CmdArgs,
8151 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008152
8153 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8154
Douglas Katzman78b37b02015-11-17 20:28:07 +00008155 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008156 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008157 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8158 if (Args.hasArg(options::OPT_pg))
8159 CmdArgs.push_back("-lm_p");
8160 else
8161 CmdArgs.push_back("-lm");
8162 }
8163
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008164 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008165 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008166 CmdArgs.push_back("-lpthread_p");
8167 else
8168 CmdArgs.push_back("-lpthread");
8169 }
8170
Eli Friedman9fa28852012-08-08 23:57:20 +00008171 if (!Args.hasArg(options::OPT_shared)) {
8172 if (Args.hasArg(options::OPT_pg))
8173 CmdArgs.push_back("-lc_p");
8174 else
8175 CmdArgs.push_back("-lc");
8176 }
8177
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008178 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008179 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008180 case llvm::Triple::arm:
8181 MyArch = "arm";
8182 break;
8183 case llvm::Triple::x86:
8184 MyArch = "i386";
8185 break;
8186 case llvm::Triple::x86_64:
8187 MyArch = "amd64";
8188 break;
8189 default:
8190 llvm_unreachable("Unsupported architecture");
8191 }
8192 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008193 }
8194
Douglas Katzman78b37b02015-11-17 20:28:07 +00008195 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008196 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008197 CmdArgs.push_back(
8198 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008199 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008200 CmdArgs.push_back(
8201 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008202 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008204 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008205 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008206}
8207
Douglas Katzman95354292015-06-23 20:42:09 +00008208void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8209 const InputInfo &Output,
8210 const InputInfoList &Inputs,
8211 const ArgList &Args,
8212 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008213 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008214 ArgStringList CmdArgs;
8215
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008216 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8217 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008218 switch (getToolChain().getArch()) {
8219 default:
8220 break;
8221 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008222 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008223 break;
8224 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008225 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008226 break;
8227 case llvm::Triple::mips:
8228 case llvm::Triple::mipsel:
8229 case llvm::Triple::mips64:
8230 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008231 StringRef CPUName;
8232 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008233 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008234
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008235 CmdArgs.push_back("-march");
8236 CmdArgs.push_back(CPUName.data());
8237
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008238 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008239 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008240
8241 if (getToolChain().getArch() == llvm::Triple::mips ||
8242 getToolChain().getArch() == llvm::Triple::mips64)
8243 CmdArgs.push_back("-EB");
8244 else
8245 CmdArgs.push_back("-EL");
8246
Dimitry Andric46f338c2015-12-27 10:36:44 +00008247 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8248 StringRef v = A->getValue();
8249 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8250 A->claim();
8251 }
8252
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008253 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008254 break;
8255 }
8256 case llvm::Triple::arm:
8257 case llvm::Triple::armeb:
8258 case llvm::Triple::thumb:
8259 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008260 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008261
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008262 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008263 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008264 else
Renato Golinf4421f72014-02-19 10:44:07 +00008265 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008266
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008267 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008268 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008269 case llvm::Triple::GNUEABI:
8270 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008271 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008272 break;
8273
8274 default:
8275 CmdArgs.push_back("-matpcs");
8276 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008277 break;
8278 }
8279 case llvm::Triple::sparc:
8280 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008281 case llvm::Triple::sparcv9: {
8282 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8283 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008284 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008285 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008286 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008287 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008288
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008289 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008290
8291 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008292 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008293
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008294 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008295 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008296
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008297 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008298 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008299}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008300
Douglas Katzman95354292015-06-23 20:42:09 +00008301void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8302 const InputInfo &Output,
8303 const InputInfoList &Inputs,
8304 const ArgList &Args,
8305 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008306 const toolchains::FreeBSD &ToolChain =
8307 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008308 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008309 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008310 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008311 !Args.hasArg(options::OPT_shared) &&
8312 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008313 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008314
8315 // Silence warning for "clang -g foo.o -o foo"
8316 Args.ClaimAllArgs(options::OPT_g_Group);
8317 // and "clang -emit-llvm foo.o -o foo"
8318 Args.ClaimAllArgs(options::OPT_emit_llvm);
8319 // and for "clang -w foo.o -o foo". Other warning options are already
8320 // handled somewhere else.
8321 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008322
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008323 if (!D.SysRoot.empty())
8324 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8325
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008326 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008327 CmdArgs.push_back("-pie");
8328
Ed Maste1bc232d2016-04-12 21:11:46 +00008329 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008330 if (Args.hasArg(options::OPT_static)) {
8331 CmdArgs.push_back("-Bstatic");
8332 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008333 if (Args.hasArg(options::OPT_rdynamic))
8334 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008335 if (Args.hasArg(options::OPT_shared)) {
8336 CmdArgs.push_back("-Bshareable");
8337 } else {
8338 CmdArgs.push_back("-dynamic-linker");
8339 CmdArgs.push_back("/libexec/ld-elf.so.1");
8340 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008341 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008342 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8343 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8344 CmdArgs.push_back("--hash-style=both");
8345 }
8346 }
8347 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008348 }
8349
8350 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8351 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008352 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008353 CmdArgs.push_back("-m");
8354 CmdArgs.push_back("elf_i386_fbsd");
8355 }
8356
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008357 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008358 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008359 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008360 }
8361
Dimitry Andric904895f2015-12-27 06:47:09 +00008362 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8363 if (ToolChain.getArch() == llvm::Triple::mips ||
8364 ToolChain.getArch() == llvm::Triple::mipsel ||
8365 ToolChain.getArch() == llvm::Triple::mips64 ||
8366 ToolChain.getArch() == llvm::Triple::mips64el) {
8367 StringRef v = A->getValue();
8368 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8369 A->claim();
8370 }
8371 }
8372
Daniel Dunbarb440f562010-08-02 02:38:21 +00008373 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008374 CmdArgs.push_back("-o");
8375 CmdArgs.push_back(Output.getFilename());
8376 } else {
8377 assert(Output.isNothing() && "Invalid output.");
8378 }
8379
Douglas Katzman78b37b02015-11-17 20:28:07 +00008380 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008381 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008382 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008383 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008384 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008385 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008386 crt1 = "Scrt1.o";
8387 else
8388 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008389 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008390 if (crt1)
8391 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8392
8393 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8394
Craig Topper92fc2df2014-05-17 16:56:41 +00008395 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008396 if (Args.hasArg(options::OPT_static))
8397 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008398 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008399 crtbegin = "crtbeginS.o";
8400 else
8401 crtbegin = "crtbegin.o";
8402
8403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008404 }
8405
8406 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008407 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008408 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8409 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008410 Args.AddAllArgs(CmdArgs, options::OPT_s);
8411 Args.AddAllArgs(CmdArgs, options::OPT_t);
8412 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8413 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008414
Teresa Johnson945bc502015-10-15 20:35:53 +00008415 if (D.isUsingLTO())
8416 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008417
Alexey Samsonov52550342014-09-15 19:58:40 +00008418 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008419 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008420
Douglas Katzman78b37b02015-11-17 20:28:07 +00008421 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008422 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008423 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008424 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008425 if (Args.hasArg(options::OPT_pg))
8426 CmdArgs.push_back("-lm_p");
8427 else
8428 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008429 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008430 if (NeedsSanitizerDeps)
8431 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008432 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8433 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008434 if (Args.hasArg(options::OPT_pg))
8435 CmdArgs.push_back("-lgcc_p");
8436 else
8437 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008438 if (Args.hasArg(options::OPT_static)) {
8439 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008440 } else if (Args.hasArg(options::OPT_pg)) {
8441 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008442 } else {
8443 CmdArgs.push_back("--as-needed");
8444 CmdArgs.push_back("-lgcc_s");
8445 CmdArgs.push_back("--no-as-needed");
8446 }
8447
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008448 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008449 if (Args.hasArg(options::OPT_pg))
8450 CmdArgs.push_back("-lpthread_p");
8451 else
8452 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008453 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008454
Roman Divacky66f22762011-02-10 16:59:40 +00008455 if (Args.hasArg(options::OPT_pg)) {
8456 if (Args.hasArg(options::OPT_shared))
8457 CmdArgs.push_back("-lc");
8458 else
8459 CmdArgs.push_back("-lc_p");
8460 CmdArgs.push_back("-lgcc_p");
8461 } else {
8462 CmdArgs.push_back("-lc");
8463 CmdArgs.push_back("-lgcc");
8464 }
8465
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008466 if (Args.hasArg(options::OPT_static)) {
8467 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008468 } else if (Args.hasArg(options::OPT_pg)) {
8469 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008470 } else {
8471 CmdArgs.push_back("--as-needed");
8472 CmdArgs.push_back("-lgcc_s");
8473 CmdArgs.push_back("--no-as-needed");
8474 }
8475 }
8476
Douglas Katzman78b37b02015-11-17 20:28:07 +00008477 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008478 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008479 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008480 else
8481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008482 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008483 }
8484
Xinliang David Li69306c02015-10-22 06:15:31 +00008485 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008486
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008487 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008488 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008489}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008490
Douglas Katzman95354292015-06-23 20:42:09 +00008491void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008492 const InputInfo &Output,
8493 const InputInfoList &Inputs,
8494 const ArgList &Args,
8495 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008496 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008497 ArgStringList CmdArgs;
8498
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008499 // GNU as needs different flags for creating the correct output format
8500 // on architectures with different ABIs or optional feature sets.
8501 switch (getToolChain().getArch()) {
8502 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008503 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008504 break;
8505 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008506 case llvm::Triple::armeb:
8507 case llvm::Triple::thumb:
8508 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008509 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008510 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8511 std::string Arch =
8512 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008513 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008514 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008515 }
8516
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008517 case llvm::Triple::mips:
8518 case llvm::Triple::mipsel:
8519 case llvm::Triple::mips64:
8520 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008521 StringRef CPUName;
8522 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008523 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008524
8525 CmdArgs.push_back("-march");
8526 CmdArgs.push_back(CPUName.data());
8527
8528 CmdArgs.push_back("-mabi");
8529 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8530
8531 if (getToolChain().getArch() == llvm::Triple::mips ||
8532 getToolChain().getArch() == llvm::Triple::mips64)
8533 CmdArgs.push_back("-EB");
8534 else
8535 CmdArgs.push_back("-EL");
8536
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008537 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008538 break;
8539 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008540
8541 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008542 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008543 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008544 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8545 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008546 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008547 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008548 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008549
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008550 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008551 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008552 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8553 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008554 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008555 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008556 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008557
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008558 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008559 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008560 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008561
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008562 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008563
8564 CmdArgs.push_back("-o");
8565 CmdArgs.push_back(Output.getFilename());
8566
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008567 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008568 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008569
David Chisnallddbd68f2011-09-27 22:03:18 +00008570 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008571 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008572}
8573
Douglas Katzman95354292015-06-23 20:42:09 +00008574void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8575 const InputInfo &Output,
8576 const InputInfoList &Inputs,
8577 const ArgList &Args,
8578 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008579 const Driver &D = getToolChain().getDriver();
8580 ArgStringList CmdArgs;
8581
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008582 if (!D.SysRoot.empty())
8583 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8584
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008585 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008586 if (Args.hasArg(options::OPT_static)) {
8587 CmdArgs.push_back("-Bstatic");
8588 } else {
8589 if (Args.hasArg(options::OPT_rdynamic))
8590 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008591 if (Args.hasArg(options::OPT_shared)) {
8592 CmdArgs.push_back("-Bshareable");
8593 } else {
8594 CmdArgs.push_back("-dynamic-linker");
8595 CmdArgs.push_back("/libexec/ld.elf_so");
8596 }
8597 }
8598
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008599 // Many NetBSD architectures support more than one ABI.
8600 // Determine the correct emulation for ld.
8601 switch (getToolChain().getArch()) {
8602 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008603 CmdArgs.push_back("-m");
8604 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008605 break;
8606 case llvm::Triple::arm:
8607 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008608 CmdArgs.push_back("-m");
8609 switch (getToolChain().getTriple().getEnvironment()) {
8610 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008611 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008612 CmdArgs.push_back("armelf_nbsd_eabi");
8613 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008614 case llvm::Triple::EABIHF:
8615 case llvm::Triple::GNUEABIHF:
8616 CmdArgs.push_back("armelf_nbsd_eabihf");
8617 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008618 default:
8619 CmdArgs.push_back("armelf_nbsd");
8620 break;
8621 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008622 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008623 case llvm::Triple::armeb:
8624 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008625 arm::appendEBLinkFlags(
8626 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008627 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008628 CmdArgs.push_back("-m");
8629 switch (getToolChain().getTriple().getEnvironment()) {
8630 case llvm::Triple::EABI:
8631 case llvm::Triple::GNUEABI:
8632 CmdArgs.push_back("armelfb_nbsd_eabi");
8633 break;
8634 case llvm::Triple::EABIHF:
8635 case llvm::Triple::GNUEABIHF:
8636 CmdArgs.push_back("armelfb_nbsd_eabihf");
8637 break;
8638 default:
8639 CmdArgs.push_back("armelfb_nbsd");
8640 break;
8641 }
8642 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008643 case llvm::Triple::mips64:
8644 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008645 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008646 CmdArgs.push_back("-m");
8647 if (getToolChain().getArch() == llvm::Triple::mips64)
8648 CmdArgs.push_back("elf32btsmip");
8649 else
8650 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008651 } else if (mips::hasMipsAbiArg(Args, "64")) {
8652 CmdArgs.push_back("-m");
8653 if (getToolChain().getArch() == llvm::Triple::mips64)
8654 CmdArgs.push_back("elf64btsmip");
8655 else
8656 CmdArgs.push_back("elf64ltsmip");
8657 }
8658 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008659 case llvm::Triple::ppc:
8660 CmdArgs.push_back("-m");
8661 CmdArgs.push_back("elf32ppc_nbsd");
8662 break;
8663
8664 case llvm::Triple::ppc64:
8665 case llvm::Triple::ppc64le:
8666 CmdArgs.push_back("-m");
8667 CmdArgs.push_back("elf64ppc");
8668 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008669
8670 case llvm::Triple::sparc:
8671 CmdArgs.push_back("-m");
8672 CmdArgs.push_back("elf32_sparc");
8673 break;
8674
8675 case llvm::Triple::sparcv9:
8676 CmdArgs.push_back("-m");
8677 CmdArgs.push_back("elf64_sparc");
8678 break;
8679
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008680 default:
8681 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008682 }
8683
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008684 if (Output.isFilename()) {
8685 CmdArgs.push_back("-o");
8686 CmdArgs.push_back(Output.getFilename());
8687 } else {
8688 assert(Output.isNothing() && "Invalid output.");
8689 }
8690
Douglas Katzman78b37b02015-11-17 20:28:07 +00008691 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008692 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008693 CmdArgs.push_back(
8694 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8695 CmdArgs.push_back(
8696 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8697 CmdArgs.push_back(
8698 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008699 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008700 CmdArgs.push_back(
8701 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8702 CmdArgs.push_back(
8703 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008704 }
8705 }
8706
8707 Args.AddAllArgs(CmdArgs, options::OPT_L);
8708 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8709 Args.AddAllArgs(CmdArgs, options::OPT_e);
8710 Args.AddAllArgs(CmdArgs, options::OPT_s);
8711 Args.AddAllArgs(CmdArgs, options::OPT_t);
8712 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8713 Args.AddAllArgs(CmdArgs, options::OPT_r);
8714
8715 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8716
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008717 unsigned Major, Minor, Micro;
8718 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8719 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008720 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008721 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008722 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008723 case llvm::Triple::arm:
8724 case llvm::Triple::armeb:
8725 case llvm::Triple::thumb:
8726 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008727 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008728 case llvm::Triple::ppc64:
8729 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008730 case llvm::Triple::sparc:
8731 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008732 case llvm::Triple::x86:
8733 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008734 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008735 break;
8736 default:
8737 break;
8738 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008739 }
8740
Douglas Katzman78b37b02015-11-17 20:28:07 +00008741 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008742 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008743 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008744 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8745 CmdArgs.push_back("-lm");
8746 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008747 if (Args.hasArg(options::OPT_pthread))
8748 CmdArgs.push_back("-lpthread");
8749 CmdArgs.push_back("-lc");
8750
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008751 if (useLibgcc) {
8752 if (Args.hasArg(options::OPT_static)) {
8753 // libgcc_eh depends on libc, so resolve as much as possible,
8754 // pull in any new requirements from libc and then get the rest
8755 // of libgcc.
8756 CmdArgs.push_back("-lgcc_eh");
8757 CmdArgs.push_back("-lc");
8758 CmdArgs.push_back("-lgcc");
8759 } else {
8760 CmdArgs.push_back("-lgcc");
8761 CmdArgs.push_back("--as-needed");
8762 CmdArgs.push_back("-lgcc_s");
8763 CmdArgs.push_back("--no-as-needed");
8764 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008765 }
8766 }
8767
Douglas Katzman78b37b02015-11-17 20:28:07 +00008768 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008769 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008770 CmdArgs.push_back(
8771 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008772 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008773 CmdArgs.push_back(
8774 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8775 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008776 }
8777
Xinliang David Li69306c02015-10-22 06:15:31 +00008778 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008779
Logan Chieneb9162f2014-06-26 14:23:45 +00008780 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008781 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008782}
8783
Douglas Katzman95354292015-06-23 20:42:09 +00008784void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8785 const InputInfo &Output,
8786 const InputInfoList &Inputs,
8787 const ArgList &Args,
8788 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008789 claimNoWarnArgs(Args);
8790
James Y Knight2db38f32015-08-15 03:45:25 +00008791 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8792 llvm::Triple Triple = llvm::Triple(TripleStr);
8793
Rafael Espindola92b00932010-08-10 00:25:48 +00008794 ArgStringList CmdArgs;
8795
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008796 llvm::Reloc::Model RelocationModel;
8797 unsigned PICLevel;
8798 bool IsPIE;
8799 std::tie(RelocationModel, PICLevel, IsPIE) =
8800 ParsePICArgs(getToolChain(), Triple, Args);
8801
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008802 switch (getToolChain().getArch()) {
8803 default:
8804 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008805 // Add --32/--64 to make sure we get the format we want.
8806 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008807 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008808 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008809 break;
8810 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008811 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8812 CmdArgs.push_back("--x32");
8813 else
8814 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008815 break;
8816 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008817 CmdArgs.push_back("-a32");
8818 CmdArgs.push_back("-mppc");
8819 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008820 break;
8821 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008822 CmdArgs.push_back("-a64");
8823 CmdArgs.push_back("-mppc64");
8824 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008825 break;
8826 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008827 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008828 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008829 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008830 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008831 break;
8832 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008833 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008834 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008835 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8836 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8837 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008838 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008839 }
8840 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008841 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008842 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8843 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8844 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008845 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008846 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008847 case llvm::Triple::arm:
8848 case llvm::Triple::armeb:
8849 case llvm::Triple::thumb:
8850 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008851 const llvm::Triple &Triple2 = getToolChain().getTriple();
8852 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008853 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008854 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008855 break;
8856 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008857 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008858 break;
8859 default:
8860 break;
8861 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008862
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008863 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008864 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8865 case arm::FloatABI::Soft:
8866 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8867 break;
8868 case arm::FloatABI::SoftFP:
8869 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8870 break;
8871 case arm::FloatABI::Hard:
8872 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8873 break;
8874 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008875
8876 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008877
8878 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008879 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008880 // march from being picked in the absence of a cpu flag.
8881 Arg *A;
8882 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008883 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008884 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008885 else
8886 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008887 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008888 break;
8889 }
8890 case llvm::Triple::mips:
8891 case llvm::Triple::mipsel:
8892 case llvm::Triple::mips64:
8893 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008894 StringRef CPUName;
8895 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008896 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008897 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008898
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008899 CmdArgs.push_back("-march");
8900 CmdArgs.push_back(CPUName.data());
8901
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008902 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008903 CmdArgs.push_back(ABIName.data());
8904
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008905 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8906 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008907 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008908 CmdArgs.push_back("-mno-shared");
8909
Daniel Sanders379d44b2014-07-16 11:52:23 +00008910 // LLVM doesn't support -mplt yet and acts as if it is always given.
8911 // However, -mplt has no effect with the N64 ABI.
8912 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008913
8914 if (getToolChain().getArch() == llvm::Triple::mips ||
8915 getToolChain().getArch() == llvm::Triple::mips64)
8916 CmdArgs.push_back("-EB");
8917 else
8918 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008919
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008920 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8921 if (StringRef(A->getValue()) == "2008")
8922 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8923 }
8924
Daniel Sanders379d44b2014-07-16 11:52:23 +00008925 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8926 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8927 options::OPT_mfp64)) {
8928 A->claim();
8929 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008930 } else if (mips::shouldUseFPXX(
8931 Args, getToolChain().getTriple(), CPUName, ABIName,
8932 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008933 CmdArgs.push_back("-mfpxx");
8934
8935 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8936 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008937 if (Arg *A =
8938 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008939 if (A->getOption().matches(options::OPT_mips16)) {
8940 A->claim();
8941 A->render(Args, CmdArgs);
8942 } else {
8943 A->claim();
8944 CmdArgs.push_back("-no-mips16");
8945 }
8946 }
8947
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008948 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8949 options::OPT_mno_micromips);
8950 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8951 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8952
Simon Atanasyanbd986632013-11-26 11:58:04 +00008953 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8954 // Do not use AddLastArg because not all versions of MIPS assembler
8955 // support -mmsa / -mno-msa options.
8956 if (A->getOption().matches(options::OPT_mmsa))
8957 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8958 }
8959
Daniel Sanders379d44b2014-07-16 11:52:23 +00008960 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8961 options::OPT_msoft_float);
8962
Toma Tabacub36d6102015-06-11 12:13:18 +00008963 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8964 options::OPT_msingle_float);
8965
Daniel Sanders379d44b2014-07-16 11:52:23 +00008966 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8967 options::OPT_mno_odd_spreg);
8968
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008969 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008970 break;
8971 }
8972 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008973 // Always pass an -march option, since our default of z10 is later
8974 // than the GNU assembler's default.
8975 StringRef CPUName = getSystemZTargetCPU(Args);
8976 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008977 break;
8978 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008979 }
8980
Renato Golina74bbc72015-07-22 15:32:36 +00008981 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008982 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008983
8984 CmdArgs.push_back("-o");
8985 CmdArgs.push_back(Output.getFilename());
8986
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008987 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008988 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008989
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008990 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008991 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008992
8993 // Handle the debug info splitting at object creation time if we're
8994 // creating an object.
8995 // TODO: Currently only works on linux with newer objcopy.
8996 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008997 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008998 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008999 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00009000}
9001
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00009002static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009003 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009004 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00009005 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00009006 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
9007 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00009008 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009009 CmdArgs.push_back("-lgcc");
9010
Logan Chien3d3373c2012-11-19 12:04:11 +00009011 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009012 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009013 CmdArgs.push_back("-lgcc");
9014 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00009015 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009016 CmdArgs.push_back("--as-needed");
9017 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00009018 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00009019 CmdArgs.push_back("--no-as-needed");
9020 }
9021
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009022 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00009023 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00009024 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00009025 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00009026
9027 // According to Android ABI, we have to link with libdl if we are
9028 // linking with non-static libgcc.
9029 //
9030 // NOTE: This fixes a link error on Android MIPS as well. The non-static
9031 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
9032 if (isAndroid && !StaticLibgcc)
9033 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00009034}
9035
Renato Golinc4b49242014-02-13 10:01:16 +00009036static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009037 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009038 // Make use of compiler-rt if --rtlib option is used
9039 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9040
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009041 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009042 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009043 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009044 default:
9045 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009046 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009047 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009048 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009049 break;
9050 }
Renato Golinc4b49242014-02-13 10:01:16 +00009051 break;
9052 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009053 // Make sure libgcc is not used under MSVC environment by default
9054 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9055 // Issue error diagnostic if libgcc is explicitly specified
9056 // through command line as --rtlib option argument.
9057 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9058 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9059 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9060 }
9061 } else
9062 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009063 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009064 }
9065}
9066
Rafael Espindola1e085772014-08-15 17:14:35 +00009067static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9068 switch (T.getArch()) {
9069 case llvm::Triple::x86:
9070 return "elf_i386";
9071 case llvm::Triple::aarch64:
9072 return "aarch64linux";
9073 case llvm::Triple::aarch64_be:
9074 return "aarch64_be_linux";
9075 case llvm::Triple::arm:
9076 case llvm::Triple::thumb:
9077 return "armelf_linux_eabi";
9078 case llvm::Triple::armeb:
9079 case llvm::Triple::thumbeb:
9080 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9081 case llvm::Triple::ppc:
9082 return "elf32ppclinux";
9083 case llvm::Triple::ppc64:
9084 return "elf64ppc";
9085 case llvm::Triple::ppc64le:
9086 return "elf64lppc";
9087 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009088 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009089 return "elf32_sparc";
9090 case llvm::Triple::sparcv9:
9091 return "elf64_sparc";
9092 case llvm::Triple::mips:
9093 return "elf32btsmip";
9094 case llvm::Triple::mipsel:
9095 return "elf32ltsmip";
9096 case llvm::Triple::mips64:
9097 if (mips::hasMipsAbiArg(Args, "n32"))
9098 return "elf32btsmipn32";
9099 return "elf64btsmip";
9100 case llvm::Triple::mips64el:
9101 if (mips::hasMipsAbiArg(Args, "n32"))
9102 return "elf32ltsmipn32";
9103 return "elf64ltsmip";
9104 case llvm::Triple::systemz:
9105 return "elf64_s390";
9106 case llvm::Triple::x86_64:
9107 if (T.getEnvironment() == llvm::Triple::GNUX32)
9108 return "elf32_x86_64";
9109 return "elf_x86_64";
9110 default:
9111 llvm_unreachable("Unexpected arch");
9112 }
9113}
9114
Douglas Katzman95354292015-06-23 20:42:09 +00009115void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9116 const InputInfo &Output,
9117 const InputInfoList &Inputs,
9118 const ArgList &Args,
9119 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009120 const toolchains::Linux &ToolChain =
9121 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009122 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009123
9124 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9125 llvm::Triple Triple = llvm::Triple(TripleStr);
9126
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009127 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009128 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009129 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009130 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9131 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009132 const bool HasCRTBeginEndFiles =
9133 ToolChain.getTriple().hasEnvironment() ||
9134 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009135
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009136 ArgStringList CmdArgs;
9137
Rafael Espindolad1002f62010-11-15 18:28:16 +00009138 // Silence warning for "clang -g foo.o -o foo"
9139 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009140 // and "clang -emit-llvm foo.o -o foo"
9141 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009142 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009143 // handled somewhere else.
9144 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009145
Peter Collingbourne39719a72015-11-20 20:49:39 +00009146 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9147 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009148 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009149 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009150 CmdArgs.push_back("-target");
9151 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9152 }
9153
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009154 if (!D.SysRoot.empty())
9155 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009156
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009157 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009158 CmdArgs.push_back("-pie");
9159
Rafael Espindola1c76c592010-11-07 22:57:16 +00009160 if (Args.hasArg(options::OPT_rdynamic))
9161 CmdArgs.push_back("-export-dynamic");
9162
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009163 if (Args.hasArg(options::OPT_s))
9164 CmdArgs.push_back("-s");
9165
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009166 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009167 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009168
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009169 for (const auto &Opt : ToolChain.ExtraOpts)
9170 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009171
9172 if (!Args.hasArg(options::OPT_static)) {
9173 CmdArgs.push_back("--eh-frame-hdr");
9174 }
9175
9176 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009177 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009178
9179 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009180 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9181 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009182 CmdArgs.push_back("-Bstatic");
9183 else
9184 CmdArgs.push_back("-static");
9185 } else if (Args.hasArg(options::OPT_shared)) {
9186 CmdArgs.push_back("-shared");
9187 }
9188
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009189 if (!Args.hasArg(options::OPT_static)) {
9190 if (Args.hasArg(options::OPT_rdynamic))
9191 CmdArgs.push_back("-export-dynamic");
9192
9193 if (!Args.hasArg(options::OPT_shared)) {
9194 const std::string Loader =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00009195 D.DyldPrefix + ToolChain.getDynamicLinker(Args);
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009196 CmdArgs.push_back("-dynamic-linker");
9197 CmdArgs.push_back(Args.MakeArgString(Loader));
9198 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009199 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009200
9201 CmdArgs.push_back("-o");
9202 CmdArgs.push_back(Output.getFilename());
9203
Douglas Katzman78b37b02015-11-17 20:28:07 +00009204 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009205 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009206 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009207 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009208 if (Args.hasArg(options::OPT_pg))
9209 crt1 = "gcrt1.o";
9210 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009211 crt1 = "Scrt1.o";
9212 else
9213 crt1 = "crt1.o";
9214 }
9215 if (crt1)
9216 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009217
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009218 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9219 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009220
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009221 const char *crtbegin;
9222 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009223 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009224 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009225 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009226 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009227 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009228 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009229 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009230
9231 if (HasCRTBeginEndFiles)
9232 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009233
9234 // Add crtfastmath.o if available and fast math is enabled.
9235 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009236 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009237
9238 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009239 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009240
Douglas Katzman6059ef92015-11-17 17:41:23 +00009241 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009242
Teresa Johnson945bc502015-10-15 20:35:53 +00009243 if (D.isUsingLTO())
9244 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009245
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009246 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9247 CmdArgs.push_back("--no-demangle");
9248
Alexey Samsonov52550342014-09-15 19:58:40 +00009249 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009250 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009251 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009252 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009253
Douglas Katzman78b37b02015-11-17 20:28:07 +00009254 if (D.CCCIsCXX() &&
9255 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009256 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009257 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009258 if (OnlyLibstdcxxStatic)
9259 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009260 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009261 if (OnlyLibstdcxxStatic)
9262 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009263 CmdArgs.push_back("-lm");
9264 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009265 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9266 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009267
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009268 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009269 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9270 if (Args.hasArg(options::OPT_static))
9271 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009272
Alexey Samsonov52550342014-09-15 19:58:40 +00009273 if (NeedsSanitizerDeps)
9274 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9275
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009276 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9277 Args.hasArg(options::OPT_pthreads);
9278
9279 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9280 options::OPT_fno_openmp, false)) {
9281 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9282 // FIXME: Does this really make sense for all GNU toolchains?
9283 WantPthread = true;
9284
9285 // Also link the particular OpenMP runtimes.
9286 switch (getOpenMPRuntime(ToolChain, Args)) {
9287 case OMPRT_OMP:
9288 CmdArgs.push_back("-lomp");
9289 break;
9290 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009291 CmdArgs.push_back("-lgomp");
9292
9293 // FIXME: Exclude this for platforms with libgomp that don't require
9294 // librt. Most modern Linux platforms require it, but some may not.
9295 CmdArgs.push_back("-lrt");
9296 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009297 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009298 CmdArgs.push_back("-liomp5");
9299 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009300 case OMPRT_Unknown:
9301 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009302 break;
9303 }
Chandler Carruth01538002013-01-17 13:19:29 +00009304 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009305
Renato Golinc4b49242014-02-13 10:01:16 +00009306 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009307
Richard Smith31d1de22015-05-20 22:48:44 +00009308 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009309 CmdArgs.push_back("-lpthread");
9310
Rafael Espindolab17bc532016-01-25 18:29:16 +00009311 if (Args.hasArg(options::OPT_fsplit_stack))
9312 CmdArgs.push_back("--wrap=pthread_create");
9313
Chandler Carruth94a32012012-05-14 18:31:18 +00009314 CmdArgs.push_back("-lc");
9315
9316 if (Args.hasArg(options::OPT_static))
9317 CmdArgs.push_back("--end-group");
9318 else
Renato Golinc4b49242014-02-13 10:01:16 +00009319 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009320 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009321
Rafael Espindola81937ec2010-12-01 01:52:43 +00009322 if (!Args.hasArg(options::OPT_nostartfiles)) {
9323 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009324 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009325 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009326 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009327 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009328 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009329 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009330
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009331 if (HasCRTBeginEndFiles)
9332 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009333 if (!isAndroid)
9334 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009335 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009336 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009337
Peter Collingbourne39719a72015-11-20 20:49:39 +00009338 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009339}
9340
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009341// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9342// for the various SFI requirements like register masking. The assembly tool
9343// inserts the file containing the macros as an input into all the assembly
9344// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009345void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9346 const InputInfo &Output,
9347 const InputInfoList &Inputs,
9348 const ArgList &Args,
9349 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009350 const toolchains::NaClToolChain &ToolChain =
9351 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009352 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009353 "nacl-arm-macros.s");
9354 InputInfoList NewInputs;
9355 NewInputs.push_back(NaClMacros);
9356 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009357 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9358 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009359}
9360
Douglas Katzman750cfc52015-06-29 18:42:16 +00009361// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009362// we use static by default, do not yet support sanitizers or LTO, and a few
9363// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009364// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009365void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9366 const InputInfo &Output,
9367 const InputInfoList &Inputs,
9368 const ArgList &Args,
9369 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009370
Douglas Katzman54366072015-07-27 16:53:08 +00009371 const toolchains::NaClToolChain &ToolChain =
9372 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009373 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009374 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009375 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009376 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009377
9378 ArgStringList CmdArgs;
9379
9380 // Silence warning for "clang -g foo.o -o foo"
9381 Args.ClaimAllArgs(options::OPT_g_Group);
9382 // and "clang -emit-llvm foo.o -o foo"
9383 Args.ClaimAllArgs(options::OPT_emit_llvm);
9384 // and for "clang -w foo.o -o foo". Other warning options are already
9385 // handled somewhere else.
9386 Args.ClaimAllArgs(options::OPT_w);
9387
9388 if (!D.SysRoot.empty())
9389 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9390
9391 if (Args.hasArg(options::OPT_rdynamic))
9392 CmdArgs.push_back("-export-dynamic");
9393
9394 if (Args.hasArg(options::OPT_s))
9395 CmdArgs.push_back("-s");
9396
Douglas Katzman54366072015-07-27 16:53:08 +00009397 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9398 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009399 CmdArgs.push_back("--build-id");
9400
9401 if (!IsStatic)
9402 CmdArgs.push_back("--eh-frame-hdr");
9403
9404 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009405 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009406 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009407 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009408 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009409 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009410 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009411 else if (Arch == llvm::Triple::mipsel)
9412 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009413 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009414 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9415 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009416
9417 if (IsStatic)
9418 CmdArgs.push_back("-static");
9419 else if (Args.hasArg(options::OPT_shared))
9420 CmdArgs.push_back("-shared");
9421
9422 CmdArgs.push_back("-o");
9423 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009424 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009425 if (!Args.hasArg(options::OPT_shared))
9426 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9427 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9428
9429 const char *crtbegin;
9430 if (IsStatic)
9431 crtbegin = "crtbeginT.o";
9432 else if (Args.hasArg(options::OPT_shared))
9433 crtbegin = "crtbeginS.o";
9434 else
9435 crtbegin = "crtbegin.o";
9436 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9437 }
9438
9439 Args.AddAllArgs(CmdArgs, options::OPT_L);
9440 Args.AddAllArgs(CmdArgs, options::OPT_u);
9441
Douglas Katzman6059ef92015-11-17 17:41:23 +00009442 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009443
9444 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9445 CmdArgs.push_back("--no-demangle");
9446
9447 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9448
Douglas Katzman78b37b02015-11-17 20:28:07 +00009449 if (D.CCCIsCXX() &&
9450 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009451 bool OnlyLibstdcxxStatic =
9452 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009453 if (OnlyLibstdcxxStatic)
9454 CmdArgs.push_back("-Bstatic");
9455 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9456 if (OnlyLibstdcxxStatic)
9457 CmdArgs.push_back("-Bdynamic");
9458 CmdArgs.push_back("-lm");
9459 }
9460
9461 if (!Args.hasArg(options::OPT_nostdlib)) {
9462 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9463 // Always use groups, since it has no effect on dynamic libraries.
9464 CmdArgs.push_back("--start-group");
9465 CmdArgs.push_back("-lc");
9466 // NaCl's libc++ currently requires libpthread, so just always include it
9467 // in the group for C++.
9468 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009469 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009470 // Gold, used by Mips, handles nested groups differently than ld, and
9471 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9472 // which is not a desired behaviour here.
9473 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9474 if (getToolChain().getArch() == llvm::Triple::mipsel)
9475 CmdArgs.push_back("-lnacl");
9476
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009477 CmdArgs.push_back("-lpthread");
9478 }
9479
9480 CmdArgs.push_back("-lgcc");
9481 CmdArgs.push_back("--as-needed");
9482 if (IsStatic)
9483 CmdArgs.push_back("-lgcc_eh");
9484 else
9485 CmdArgs.push_back("-lgcc_s");
9486 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009487
9488 // Mips needs to create and use pnacl_legacy library that contains
9489 // definitions from bitcode/pnaclmm.c and definitions for
9490 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9491 if (getToolChain().getArch() == llvm::Triple::mipsel)
9492 CmdArgs.push_back("-lpnacl_legacy");
9493
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009494 CmdArgs.push_back("--end-group");
9495 }
9496
9497 if (!Args.hasArg(options::OPT_nostartfiles)) {
9498 const char *crtend;
9499 if (Args.hasArg(options::OPT_shared))
9500 crtend = "crtendS.o";
9501 else
9502 crtend = "crtend.o";
9503
9504 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9505 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9506 }
9507 }
9508
Peter Collingbourne39719a72015-11-20 20:49:39 +00009509 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9510 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009511}
9512
Douglas Katzman95354292015-06-23 20:42:09 +00009513void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9514 const InputInfo &Output,
9515 const InputInfoList &Inputs,
9516 const ArgList &Args,
9517 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009518 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009519 ArgStringList CmdArgs;
9520
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009521 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009522
9523 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009524 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009525
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009526 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009527 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009528
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009529 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009530 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009531}
9532
Douglas Katzman95354292015-06-23 20:42:09 +00009533void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9534 const InputInfo &Output,
9535 const InputInfoList &Inputs,
9536 const ArgList &Args,
9537 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009538 const Driver &D = getToolChain().getDriver();
9539 ArgStringList CmdArgs;
9540
Daniel Dunbarb440f562010-08-02 02:38:21 +00009541 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009542 CmdArgs.push_back("-o");
9543 CmdArgs.push_back(Output.getFilename());
9544 } else {
9545 assert(Output.isNothing() && "Invalid output.");
9546 }
9547
Douglas Katzman78b37b02015-11-17 20:28:07 +00009548 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009549 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9550 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9551 CmdArgs.push_back(
9552 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9553 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009554 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009555
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009556 Args.AddAllArgs(CmdArgs,
9557 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009558
Daniel Dunbar54423b22010-09-17 00:24:54 +00009559 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009560
Xinliang David Li69306c02015-10-22 06:15:31 +00009561 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009562
Douglas Katzman78b37b02015-11-17 20:28:07 +00009563 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009564 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009565 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009566 CmdArgs.push_back("-lm");
9567 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009568 }
9569
Douglas Katzman78b37b02015-11-17 20:28:07 +00009570 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009571 if (Args.hasArg(options::OPT_pthread))
9572 CmdArgs.push_back("-lpthread");
9573 CmdArgs.push_back("-lc");
9574 CmdArgs.push_back("-lCompilerRT-Generic");
9575 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9576 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009577 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009578 }
9579
Logan Chieneb9162f2014-06-26 14:23:45 +00009580 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009581 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009582}
9583
Daniel Dunbarcc912342009-05-02 18:28:39 +00009584/// DragonFly Tools
9585
9586// For now, DragonFly Assemble does just about the same as for
9587// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009588void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9589 const InputInfo &Output,
9590 const InputInfoList &Inputs,
9591 const ArgList &Args,
9592 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009593 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009594 ArgStringList CmdArgs;
9595
9596 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9597 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009598 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009599 CmdArgs.push_back("--32");
9600
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009601 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009602
9603 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009604 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009605
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009606 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009607 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009608
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009609 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009610 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009611}
9612
Douglas Katzman95354292015-06-23 20:42:09 +00009613void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9614 const InputInfo &Output,
9615 const InputInfoList &Inputs,
9616 const ArgList &Args,
9617 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009618 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009619 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009620
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009621 if (!D.SysRoot.empty())
9622 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9623
John McCall65b8da02013-04-11 22:55:55 +00009624 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009625 if (Args.hasArg(options::OPT_static)) {
9626 CmdArgs.push_back("-Bstatic");
9627 } else {
John McCall65b8da02013-04-11 22:55:55 +00009628 if (Args.hasArg(options::OPT_rdynamic))
9629 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009630 if (Args.hasArg(options::OPT_shared))
9631 CmdArgs.push_back("-Bshareable");
9632 else {
9633 CmdArgs.push_back("-dynamic-linker");
9634 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9635 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009636 CmdArgs.push_back("--hash-style=gnu");
9637 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009638 }
9639
9640 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9641 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009642 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009643 CmdArgs.push_back("-m");
9644 CmdArgs.push_back("elf_i386");
9645 }
9646
Daniel Dunbarb440f562010-08-02 02:38:21 +00009647 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009648 CmdArgs.push_back("-o");
9649 CmdArgs.push_back(Output.getFilename());
9650 } else {
9651 assert(Output.isNothing() && "Invalid output.");
9652 }
9653
Douglas Katzman78b37b02015-11-17 20:28:07 +00009654 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009655 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009656 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009657 CmdArgs.push_back(
9658 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009659 else {
9660 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009661 CmdArgs.push_back(
9662 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009663 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009664 CmdArgs.push_back(
9665 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009666 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009667 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009668 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009669 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009670 CmdArgs.push_back(
9671 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009672 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009673 CmdArgs.push_back(
9674 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009675 }
9676
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009677 Args.AddAllArgs(CmdArgs,
9678 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009679
Daniel Dunbar54423b22010-09-17 00:24:54 +00009680 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009681
Douglas Katzman78b37b02015-11-17 20:28:07 +00009682 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009683 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009684
9685 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009686 CmdArgs.push_back("-rpath");
9687 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009688 }
9689
Hans Wennborg70850d82013-07-18 20:29:38 +00009690 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009691 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009692 CmdArgs.push_back("-lm");
9693 }
9694
Daniel Dunbarcc912342009-05-02 18:28:39 +00009695 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009696 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009697
9698 if (!Args.hasArg(options::OPT_nolibc)) {
9699 CmdArgs.push_back("-lc");
9700 }
9701
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009702 if (Args.hasArg(options::OPT_static) ||
9703 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009704 CmdArgs.push_back("-lgcc");
9705 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009706 } else {
9707 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009708 CmdArgs.push_back("-lgcc_pic");
9709 if (!Args.hasArg(options::OPT_shared))
9710 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009711 } else {
John McCall65b8da02013-04-11 22:55:55 +00009712 CmdArgs.push_back("-lgcc");
9713 CmdArgs.push_back("--as-needed");
9714 CmdArgs.push_back("-lgcc_pic");
9715 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009716 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009717 }
9718 }
9719
Douglas Katzman78b37b02015-11-17 20:28:07 +00009720 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009721 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009722 CmdArgs.push_back(
9723 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009724 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009725 CmdArgs.push_back(
9726 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9727 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009728 }
9729
Xinliang David Li69306c02015-10-22 06:15:31 +00009730 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009731
Logan Chieneb9162f2014-06-26 14:23:45 +00009732 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009734}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009735
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009736// Try to find Exe from a Visual Studio distribution. This first tries to find
9737// an installed copy of Visual Studio and, failing that, looks in the PATH,
9738// making sure that whatever executable that's found is not a same-named exe
9739// from clang itself to prevent clang from falling back to itself.
9740static std::string FindVisualStudioExecutable(const ToolChain &TC,
9741 const char *Exe,
9742 const char *ClangProgramPath) {
9743 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9744 std::string visualStudioBinDir;
9745 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9746 visualStudioBinDir)) {
9747 SmallString<128> FilePath(visualStudioBinDir);
9748 llvm::sys::path::append(FilePath, Exe);
9749 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9750 return FilePath.str();
9751 }
9752
9753 return Exe;
9754}
9755
Douglas Katzman95354292015-06-23 20:42:09 +00009756void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9757 const InputInfo &Output,
9758 const InputInfoList &Inputs,
9759 const ArgList &Args,
9760 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009761 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009762 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009763
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009764 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9765 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009766 CmdArgs.push_back(
9767 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009768
Douglas Katzman78b37b02015-11-17 20:28:07 +00009769 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9770 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009771 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009772
Zachary Turner10d75b22014-10-22 20:40:43 +00009773 if (!llvm::sys::Process::GetEnv("LIB")) {
9774 // If the VC environment hasn't been configured (perhaps because the user
9775 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009776 // the environment variable is set however, assume the user knows what
9777 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009778 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009779 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009780 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9781 SmallString<128> LibDir(VisualStudioDir);
9782 llvm::sys::path::append(LibDir, "VC", "lib");
9783 switch (MSVC.getArch()) {
9784 case llvm::Triple::x86:
9785 // x86 just puts the libraries directly in lib
9786 break;
9787 case llvm::Triple::x86_64:
9788 llvm::sys::path::append(LibDir, "amd64");
9789 break;
9790 case llvm::Triple::arm:
9791 llvm::sys::path::append(LibDir, "arm");
9792 break;
9793 default:
9794 break;
9795 }
9796 CmdArgs.push_back(
9797 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009798
9799 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9800 std::string UniversalCRTLibPath;
9801 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9802 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9803 UniversalCRTLibPath.c_str()));
9804 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009805 }
9806
9807 std::string WindowsSdkLibPath;
9808 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9809 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9810 WindowsSdkLibPath.c_str()));
9811 }
9812
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009813 CmdArgs.push_back("-nologo");
9814
Reid Kleckner124955a2015-08-05 18:51:13 +00009815 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009816 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009817
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009818 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009819 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009820 if (DLL) {
9821 CmdArgs.push_back(Args.MakeArgString("-dll"));
9822
9823 SmallString<128> ImplibName(Output.getFilename());
9824 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009825 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009826 }
9827
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009828 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009829 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009830 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009831 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009832 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9833 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009834 // Make sure the dynamic runtime thunk is not optimized out at link time
9835 // to ensure proper SEH handling.
9836 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009837 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009838 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009839 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009840 for (const auto &Lib : {"asan", "asan_cxx"})
9841 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009842 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009843 }
9844
Hans Wennborg2e274592013-08-13 23:38:57 +00009845 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009846
Alexey Bataevc7e84352015-08-19 04:49:01 +00009847 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9848 options::OPT_fno_openmp, false)) {
9849 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9850 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9851 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9852 TC.getDriver().Dir + "/../lib"));
9853 switch (getOpenMPRuntime(getToolChain(), Args)) {
9854 case OMPRT_OMP:
9855 CmdArgs.push_back("-defaultlib:libomp.lib");
9856 break;
9857 case OMPRT_IOMP5:
9858 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9859 break;
9860 case OMPRT_GOMP:
9861 break;
9862 case OMPRT_Unknown:
9863 // Already diagnosed.
9864 break;
9865 }
9866 }
9867
Andrey Turetskiya4868572016-03-14 11:19:43 +00009868 // Add compiler-rt lib in case if it was explicitly
9869 // specified as an argument for --rtlib option.
9870 if (!Args.hasArg(options::OPT_nostdlib)) {
9871 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9872 }
9873
Reid Kleckner337188f2014-09-16 19:22:00 +00009874 // Add filenames, libraries, and other linker inputs.
9875 for (const auto &Input : Inputs) {
9876 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009877 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009878 continue;
9879 }
9880
9881 const Arg &A = Input.getInputArg();
9882
9883 // Render -l options differently for the MSVC linker.
9884 if (A.getOption().matches(options::OPT_l)) {
9885 StringRef Lib = A.getValue();
9886 const char *LinkLibArg;
9887 if (Lib.endswith(".lib"))
9888 LinkLibArg = Args.MakeArgString(Lib);
9889 else
9890 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9891 CmdArgs.push_back(LinkLibArg);
9892 continue;
9893 }
9894
9895 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9896 // or -L. Render it, even if MSVC doesn't understand it.
9897 A.renderAsInput(Args, CmdArgs);
9898 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009899
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009900 TC.addProfileRTLibs(Args, CmdArgs);
9901
Zachary Turner719f58c2014-12-01 23:06:47 +00009902 // We need to special case some linker paths. In the case of lld, we need to
9903 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9904 // linker, we need to use a special search algorithm.
9905 llvm::SmallString<128> linkPath;
9906 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9907 if (Linker.equals_lower("lld"))
9908 Linker = "lld-link";
9909
9910 if (Linker.equals_lower("link")) {
9911 // If we're using the MSVC linker, it's not sufficient to just use link
9912 // from the program PATH, because other environments like GnuWin32 install
9913 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009914 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009915 C.getDriver().getClangProgramPath());
9916 } else {
9917 linkPath = Linker;
9918 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009919 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009920 }
9921
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009922 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009923 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009924}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009925
Douglas Katzman95354292015-06-23 20:42:09 +00009926void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9927 const InputInfo &Output,
9928 const InputInfoList &Inputs,
9929 const ArgList &Args,
9930 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009931 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9932}
9933
Douglas Katzman95354292015-06-23 20:42:09 +00009934std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009935 Compilation &C, const JobAction &JA, const InputInfo &Output,
9936 const InputInfoList &Inputs, const ArgList &Args,
9937 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009938 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009939 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009940 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009941 CmdArgs.push_back("/W0"); // No warnings.
9942
9943 // The goal is to be able to invoke this tool correctly based on
9944 // any flag accepted by clang-cl.
9945
9946 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009947 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009948
9949 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009950 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9951 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9952 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009953 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9954 if (A->getOption().getID() == options::OPT_O0) {
9955 CmdArgs.push_back("/Od");
9956 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009957 CmdArgs.push_back("/Og");
9958
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009959 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009960 if (OptLevel == "s" || OptLevel == "z")
9961 CmdArgs.push_back("/Os");
9962 else
9963 CmdArgs.push_back("/Ot");
9964
9965 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009966 }
9967 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009968 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9969 options::OPT_fno_omit_frame_pointer))
9970 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9971 ? "/Oy"
9972 : "/Oy-");
9973 if (!Args.hasArg(options::OPT_fwritable_strings))
9974 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009975
Nico Weber3f8dafb2015-03-12 19:37:10 +00009976 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009977 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9978
David Majnemerf6072342014-07-01 22:24:56 +00009979 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9980 /*default=*/false))
9981 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009982 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9983 options::OPT_fno_function_sections))
9984 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9985 ? "/Gy"
9986 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009987 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9988 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009989 CmdArgs.push_back(
9990 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009991 if (Args.hasArg(options::OPT_fsyntax_only))
9992 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009993 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9994 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009995 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009996
Nico Weber3f8dafb2015-03-12 19:37:10 +00009997 std::vector<std::string> Includes =
9998 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009999 for (const auto &Include : Includes)
10000 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +000010001
Hans Wennborg87cfa712013-09-19 20:32:16 +000010002 // Flags that can simply be passed through.
10003 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
10004 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +000010005 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
10006 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +000010007 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +000010008 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010009
10010 // The order of these flags is relevant, so pick the last one.
10011 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
10012 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
10013 A->render(Args, CmdArgs);
10014
Ehsan Akhgarid8518332016-01-25 21:14:52 +000010015 // Pass through all unknown arguments so that the fallback command can see
10016 // them too.
10017 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10018
Hans Wennborg87cfa712013-09-19 20:32:16 +000010019 // Input filename.
10020 assert(Inputs.size() == 1);
10021 const InputInfo &II = Inputs[0];
10022 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10023 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10024 if (II.isFilename())
10025 CmdArgs.push_back(II.getFilename());
10026 else
10027 II.getInputArg().renderAsInput(Args, CmdArgs);
10028
10029 // Output filename.
10030 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010031 const char *Fo =
10032 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010033 CmdArgs.push_back(Fo);
10034
Hans Wennborg188382e2013-09-20 18:16:35 +000010035 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010036 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10037 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010038 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010039 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010040}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010041
Yaron Keren1c0070c2015-07-02 04:45:27 +000010042/// MinGW Tools
10043void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10044 const InputInfo &Output,
10045 const InputInfoList &Inputs,
10046 const ArgList &Args,
10047 const char *LinkingOutput) const {
10048 claimNoWarnArgs(Args);
10049 ArgStringList CmdArgs;
10050
10051 if (getToolChain().getArch() == llvm::Triple::x86) {
10052 CmdArgs.push_back("--32");
10053 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10054 CmdArgs.push_back("--64");
10055 }
10056
10057 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10058
10059 CmdArgs.push_back("-o");
10060 CmdArgs.push_back(Output.getFilename());
10061
10062 for (const auto &II : Inputs)
10063 CmdArgs.push_back(II.getFilename());
10064
10065 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010066 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010067
10068 if (Args.hasArg(options::OPT_gsplit_dwarf))
10069 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10070 SplitDebugName(Args, Inputs[0]));
10071}
10072
10073void MinGW::Linker::AddLibGCC(const ArgList &Args,
10074 ArgStringList &CmdArgs) const {
10075 if (Args.hasArg(options::OPT_mthreads))
10076 CmdArgs.push_back("-lmingwthrd");
10077 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010078
Yaron Kerenaa281332015-08-09 00:24:07 +000010079 // Make use of compiler-rt if --rtlib option is used
10080 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10081 if (RLT == ToolChain::RLT_Libgcc) {
10082 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10083 Args.hasArg(options::OPT_static);
10084 bool Shared = Args.hasArg(options::OPT_shared);
10085 bool CXX = getToolChain().getDriver().CCCIsCXX();
10086
10087 if (Static || (!CXX && !Shared)) {
10088 CmdArgs.push_back("-lgcc");
10089 CmdArgs.push_back("-lgcc_eh");
10090 } else {
10091 CmdArgs.push_back("-lgcc_s");
10092 CmdArgs.push_back("-lgcc");
10093 }
10094 } else {
10095 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10096 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010097
Yaron Keren1c0070c2015-07-02 04:45:27 +000010098 CmdArgs.push_back("-lmoldname");
10099 CmdArgs.push_back("-lmingwex");
10100 CmdArgs.push_back("-lmsvcrt");
10101}
10102
10103void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10104 const InputInfo &Output,
10105 const InputInfoList &Inputs,
10106 const ArgList &Args,
10107 const char *LinkingOutput) const {
10108 const ToolChain &TC = getToolChain();
10109 const Driver &D = TC.getDriver();
10110 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10111
10112 ArgStringList CmdArgs;
10113
10114 // Silence warning for "clang -g foo.o -o foo"
10115 Args.ClaimAllArgs(options::OPT_g_Group);
10116 // and "clang -emit-llvm foo.o -o foo"
10117 Args.ClaimAllArgs(options::OPT_emit_llvm);
10118 // and for "clang -w foo.o -o foo". Other warning options are already
10119 // handled somewhere else.
10120 Args.ClaimAllArgs(options::OPT_w);
10121
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010122 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10123 if (LinkerName.equals_lower("lld")) {
10124 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010125 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010126 } else if (!LinkerName.equals_lower("ld")) {
10127 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010128 }
10129
Yaron Keren1c0070c2015-07-02 04:45:27 +000010130 if (!D.SysRoot.empty())
10131 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10132
10133 if (Args.hasArg(options::OPT_s))
10134 CmdArgs.push_back("-s");
10135
10136 CmdArgs.push_back("-m");
10137 if (TC.getArch() == llvm::Triple::x86)
10138 CmdArgs.push_back("i386pe");
10139 if (TC.getArch() == llvm::Triple::x86_64)
10140 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010141 if (TC.getArch() == llvm::Triple::arm)
10142 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010143
10144 if (Args.hasArg(options::OPT_mwindows)) {
10145 CmdArgs.push_back("--subsystem");
10146 CmdArgs.push_back("windows");
10147 } else if (Args.hasArg(options::OPT_mconsole)) {
10148 CmdArgs.push_back("--subsystem");
10149 CmdArgs.push_back("console");
10150 }
10151
10152 if (Args.hasArg(options::OPT_static))
10153 CmdArgs.push_back("-Bstatic");
10154 else {
10155 if (Args.hasArg(options::OPT_mdll))
10156 CmdArgs.push_back("--dll");
10157 else if (Args.hasArg(options::OPT_shared))
10158 CmdArgs.push_back("--shared");
10159 CmdArgs.push_back("-Bdynamic");
10160 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10161 CmdArgs.push_back("-e");
10162 if (TC.getArch() == llvm::Triple::x86)
10163 CmdArgs.push_back("_DllMainCRTStartup@12");
10164 else
10165 CmdArgs.push_back("DllMainCRTStartup");
10166 CmdArgs.push_back("--enable-auto-image-base");
10167 }
10168 }
10169
10170 CmdArgs.push_back("-o");
10171 CmdArgs.push_back(Output.getFilename());
10172
10173 Args.AddAllArgs(CmdArgs, options::OPT_e);
10174 // FIXME: add -N, -n flags
10175 Args.AddLastArg(CmdArgs, options::OPT_r);
10176 Args.AddLastArg(CmdArgs, options::OPT_s);
10177 Args.AddLastArg(CmdArgs, options::OPT_t);
10178 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10179 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10180
Douglas Katzman78b37b02015-11-17 20:28:07 +000010181 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010182 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10183 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10184 } else {
10185 if (Args.hasArg(options::OPT_municode))
10186 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10187 else
10188 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10189 }
10190 if (Args.hasArg(options::OPT_pg))
10191 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10192 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10193 }
10194
10195 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010196 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010197 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10198
10199 // TODO: Add ASan stuff here
10200
10201 // TODO: Add profile stuff here
10202
Douglas Katzman78b37b02015-11-17 20:28:07 +000010203 if (D.CCCIsCXX() &&
10204 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010205 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10206 !Args.hasArg(options::OPT_static);
10207 if (OnlyLibstdcxxStatic)
10208 CmdArgs.push_back("-Bstatic");
10209 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10210 if (OnlyLibstdcxxStatic)
10211 CmdArgs.push_back("-Bdynamic");
10212 }
10213
10214 if (!Args.hasArg(options::OPT_nostdlib)) {
10215 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10216 if (Args.hasArg(options::OPT_static))
10217 CmdArgs.push_back("--start-group");
10218
10219 if (Args.hasArg(options::OPT_fstack_protector) ||
10220 Args.hasArg(options::OPT_fstack_protector_strong) ||
10221 Args.hasArg(options::OPT_fstack_protector_all)) {
10222 CmdArgs.push_back("-lssp_nonshared");
10223 CmdArgs.push_back("-lssp");
10224 }
10225 if (Args.hasArg(options::OPT_fopenmp))
10226 CmdArgs.push_back("-lgomp");
10227
10228 AddLibGCC(Args, CmdArgs);
10229
10230 if (Args.hasArg(options::OPT_pg))
10231 CmdArgs.push_back("-lgmon");
10232
Yaron Kerenadce68e2015-07-06 18:52:19 +000010233 if (Args.hasArg(options::OPT_pthread))
10234 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010235
10236 // add system libraries
10237 if (Args.hasArg(options::OPT_mwindows)) {
10238 CmdArgs.push_back("-lgdi32");
10239 CmdArgs.push_back("-lcomdlg32");
10240 }
10241 CmdArgs.push_back("-ladvapi32");
10242 CmdArgs.push_back("-lshell32");
10243 CmdArgs.push_back("-luser32");
10244 CmdArgs.push_back("-lkernel32");
10245
10246 if (Args.hasArg(options::OPT_static))
10247 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010248 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010249 AddLibGCC(Args, CmdArgs);
10250 }
10251
10252 if (!Args.hasArg(options::OPT_nostartfiles)) {
10253 // Add crtfastmath.o if available and fast math is enabled.
10254 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10255
10256 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10257 }
10258 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010259 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010261}
10262
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010263/// XCore Tools
10264// We pass assemble and link construction to the xcc tool.
10265
Douglas Katzman95354292015-06-23 20:42:09 +000010266void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10267 const InputInfo &Output,
10268 const InputInfoList &Inputs,
10269 const ArgList &Args,
10270 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010271 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010272 ArgStringList CmdArgs;
10273
10274 CmdArgs.push_back("-o");
10275 CmdArgs.push_back(Output.getFilename());
10276
10277 CmdArgs.push_back("-c");
10278
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010279 if (Args.hasArg(options::OPT_v))
10280 CmdArgs.push_back("-v");
10281
Robert Lytton894d25c2014-05-02 09:33:25 +000010282 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10283 if (!A->getOption().matches(options::OPT_g0))
10284 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010285
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010286 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10287 false))
10288 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010289
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010290 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010291
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010292 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010293 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010294
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010295 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010296 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010297}
10298
Douglas Katzman95354292015-06-23 20:42:09 +000010299void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10300 const InputInfo &Output,
10301 const InputInfoList &Inputs,
10302 const ArgList &Args,
10303 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010304 ArgStringList CmdArgs;
10305
10306 if (Output.isFilename()) {
10307 CmdArgs.push_back("-o");
10308 CmdArgs.push_back(Output.getFilename());
10309 } else {
10310 assert(Output.isNothing() && "Invalid output.");
10311 }
10312
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010313 if (Args.hasArg(options::OPT_v))
10314 CmdArgs.push_back("-v");
10315
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010316 // Pass -fexceptions through to the linker if it was present.
10317 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10318 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010319 CmdArgs.push_back("-fexceptions");
10320
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010321 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10322
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010323 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010324 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010325}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010326
Douglas Katzman95354292015-06-23 20:42:09 +000010327void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10328 const InputInfo &Output,
10329 const InputInfoList &Inputs,
10330 const ArgList &Args,
10331 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010332 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010333 const auto &TC =
10334 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10335 ArgStringList CmdArgs;
10336 const char *Exec;
10337
10338 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010339 default:
10340 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010341 case llvm::Triple::arm:
10342 case llvm::Triple::thumb:
10343 break;
10344 case llvm::Triple::x86:
10345 CmdArgs.push_back("--32");
10346 break;
10347 case llvm::Triple::x86_64:
10348 CmdArgs.push_back("--64");
10349 break;
10350 }
10351
10352 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10353
10354 CmdArgs.push_back("-o");
10355 CmdArgs.push_back(Output.getFilename());
10356
10357 for (const auto &Input : Inputs)
10358 CmdArgs.push_back(Input.getFilename());
10359
10360 const std::string Assembler = TC.GetProgramPath("as");
10361 Exec = Args.MakeArgString(Assembler);
10362
Justin Bognerd3371d82015-07-17 03:35:54 +000010363 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010364}
10365
Douglas Katzman95354292015-06-23 20:42:09 +000010366void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10367 const InputInfo &Output,
10368 const InputInfoList &Inputs,
10369 const ArgList &Args,
10370 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010371 const auto &TC =
10372 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10373 const llvm::Triple &T = TC.getTriple();
10374 const Driver &D = TC.getDriver();
10375 SmallString<128> EntryPoint;
10376 ArgStringList CmdArgs;
10377 const char *Exec;
10378
10379 // Silence warning for "clang -g foo.o -o foo"
10380 Args.ClaimAllArgs(options::OPT_g_Group);
10381 // and "clang -emit-llvm foo.o -o foo"
10382 Args.ClaimAllArgs(options::OPT_emit_llvm);
10383 // and for "clang -w foo.o -o foo"
10384 Args.ClaimAllArgs(options::OPT_w);
10385 // Other warning options are already handled somewhere else.
10386
10387 if (!D.SysRoot.empty())
10388 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10389
10390 if (Args.hasArg(options::OPT_pie))
10391 CmdArgs.push_back("-pie");
10392 if (Args.hasArg(options::OPT_rdynamic))
10393 CmdArgs.push_back("-export-dynamic");
10394 if (Args.hasArg(options::OPT_s))
10395 CmdArgs.push_back("--strip-all");
10396
10397 CmdArgs.push_back("-m");
10398 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010399 default:
10400 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010401 case llvm::Triple::arm:
10402 case llvm::Triple::thumb:
10403 // FIXME: this is incorrect for WinCE
10404 CmdArgs.push_back("thumb2pe");
10405 break;
10406 case llvm::Triple::x86:
10407 CmdArgs.push_back("i386pe");
10408 EntryPoint.append("_");
10409 break;
10410 case llvm::Triple::x86_64:
10411 CmdArgs.push_back("i386pep");
10412 break;
10413 }
10414
10415 if (Args.hasArg(options::OPT_shared)) {
10416 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010417 default:
10418 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010419 case llvm::Triple::arm:
10420 case llvm::Triple::thumb:
10421 case llvm::Triple::x86_64:
10422 EntryPoint.append("_DllMainCRTStartup");
10423 break;
10424 case llvm::Triple::x86:
10425 EntryPoint.append("_DllMainCRTStartup@12");
10426 break;
10427 }
10428
10429 CmdArgs.push_back("-shared");
10430 CmdArgs.push_back("-Bdynamic");
10431
10432 CmdArgs.push_back("--enable-auto-image-base");
10433
10434 CmdArgs.push_back("--entry");
10435 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10436 } else {
10437 EntryPoint.append("mainCRTStartup");
10438
10439 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10440 : "-Bdynamic");
10441
Douglas Katzman78b37b02015-11-17 20:28:07 +000010442 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010443 CmdArgs.push_back("--entry");
10444 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10445 }
10446
10447 // FIXME: handle subsystem
10448 }
10449
10450 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010451 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010452
10453 CmdArgs.push_back("-o");
10454 CmdArgs.push_back(Output.getFilename());
10455
10456 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10457 SmallString<261> ImpLib(Output.getFilename());
10458 llvm::sys::path::replace_extension(ImpLib, ".lib");
10459
10460 CmdArgs.push_back("--out-implib");
10461 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10462 }
10463
Douglas Katzman78b37b02015-11-17 20:28:07 +000010464 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010465 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10466 const char *CRTBegin;
10467
10468 CRTBegin =
10469 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10470 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10471 }
10472
10473 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010474 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010475 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10476
10477 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10478 !Args.hasArg(options::OPT_nodefaultlibs)) {
10479 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10480 !Args.hasArg(options::OPT_static);
10481 if (StaticCXX)
10482 CmdArgs.push_back("-Bstatic");
10483 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10484 if (StaticCXX)
10485 CmdArgs.push_back("-Bdynamic");
10486 }
10487
10488 if (!Args.hasArg(options::OPT_nostdlib)) {
10489 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10490 // TODO handle /MT[d] /MD[d]
10491 CmdArgs.push_back("-lmsvcrt");
10492 AddRunTimeLibs(TC, D, CmdArgs, Args);
10493 }
10494 }
10495
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010496 if (TC.getSanitizerArgs().needsAsanRt()) {
10497 // TODO handle /MT[d] /MD[d]
10498 if (Args.hasArg(options::OPT_shared)) {
10499 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10500 } else {
10501 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10502 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010503 // Make sure the dynamic runtime thunk is not optimized out at link time
10504 // to ensure proper SEH handling.
10505 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10506 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10507 ? "___asan_seh_interceptor"
10508 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010509 }
10510 }
10511
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010512 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010513
Justin Bognerd3371d82015-07-17 03:35:54 +000010514 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010515}
Douglas Katzman84a75642015-06-19 14:55:19 +000010516
Douglas Katzman95354292015-06-23 20:42:09 +000010517void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10518 const InputInfo &Output,
10519 const InputInfoList &Inputs,
10520 const ArgList &Args,
10521 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010522 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010523 assert(Inputs.size() == 1);
10524 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010525 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10526 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010527
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010528 if (JA.getKind() == Action::PreprocessJobClass) {
10529 Args.ClaimAllArgs();
10530 CmdArgs.push_back("-E");
10531 } else {
10532 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10533 CmdArgs.push_back("-S");
10534 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10535 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010536 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010537
Douglas Katzmanf6071112015-08-03 14:34:22 +000010538 // Append all -I, -iquote, -isystem paths, defines/undefines,
10539 // 'f' flags, optimize flags, and warning options.
10540 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010541 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010542 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010543 options::OPT_f_Group, options::OPT_f_clang_Group,
10544 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010545 options::OPT_O_Group, options::OPT_W_Group,
10546 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010547
10548 // If we're producing a dependency file, and assembly is the final action,
10549 // then the name of the target in the dependency file should be the '.o'
10550 // file, not the '.s' file produced by this step. For example, instead of
10551 // /tmp/mumble.s: mumble.c .../someheader.h
10552 // the filename on the lefthand side should be "mumble.o"
10553 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10554 C.getActions().size() == 1 &&
10555 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10556 Arg *A = Args.getLastArg(options::OPT_o);
10557 if (A) {
10558 CmdArgs.push_back("-MT");
10559 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10560 }
10561 }
10562
Douglas Katzman84a75642015-06-19 14:55:19 +000010563 CmdArgs.push_back(II.getFilename());
10564 CmdArgs.push_back("-o");
10565 CmdArgs.push_back(Output.getFilename());
10566
10567 std::string Exec =
10568 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010569 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10570 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010571}
10572
Douglas Katzman95354292015-06-23 20:42:09 +000010573void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10574 const InputInfo &Output,
10575 const InputInfoList &Inputs,
10576 const ArgList &Args,
10577 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010578 ArgStringList CmdArgs;
10579
10580 assert(Inputs.size() == 1);
10581 const InputInfo &II = Inputs[0];
10582 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10583 assert(Output.getType() == types::TY_Object);
10584
10585 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010586 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10587 if (CPUArg)
10588 CmdArgs.push_back(
10589 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010590 CmdArgs.push_back("-noSPrefixing");
10591 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010592 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10593 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10594 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010595 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010596 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010597 }
10598 CmdArgs.push_back("-elf"); // Output format.
10599 CmdArgs.push_back(II.getFilename());
10600 CmdArgs.push_back(
10601 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10602
10603 std::string Exec =
10604 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010605 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10606 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010607}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010608
10609void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10610 const InputInfo &Output,
10611 const InputInfoList &Inputs,
10612 const ArgList &Args,
10613 const char *LinkingOutput) const {
10614 const auto &TC =
10615 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10616 const llvm::Triple &T = TC.getTriple();
10617 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010618 bool UseStartfiles =
10619 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010620 bool UseDefaultLibs =
10621 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010622
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010623 if (T.getArch() == llvm::Triple::sparc)
10624 CmdArgs.push_back("-EB");
10625 else // SHAVE assumes little-endian, and sparcel is expressly so.
10626 CmdArgs.push_back("-EL");
10627
10628 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10629 // but we never pass through a --sysroot option and various other bits.
10630 // For example, there are no sanitizers (yet) nor gold linker.
10631
10632 // Eat some arguments that may be present but have no effect.
10633 Args.ClaimAllArgs(options::OPT_g_Group);
10634 Args.ClaimAllArgs(options::OPT_w);
10635 Args.ClaimAllArgs(options::OPT_static_libgcc);
10636
10637 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10638 CmdArgs.push_back("-s");
10639
10640 CmdArgs.push_back("-o");
10641 CmdArgs.push_back(Output.getFilename());
10642
10643 if (UseStartfiles) {
10644 // If you want startfiles, it means you want the builtin crti and crtbegin,
10645 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010646 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10647 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010648 }
10649
10650 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10651 options::OPT_e, options::OPT_s, options::OPT_t,
10652 options::OPT_Z_Flag, options::OPT_r});
10653
Douglas Katzman674a3122015-11-18 16:24:46 +000010654 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010655
10656 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10657
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010658 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010659 if (C.getDriver().CCCIsCXX())
10660 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010661 if (T.getOS() == llvm::Triple::RTEMS) {
10662 CmdArgs.push_back("--start-group");
10663 CmdArgs.push_back("-lc");
10664 // You must provide your own "-L" option to enable finding these.
10665 CmdArgs.push_back("-lrtemscpu");
10666 CmdArgs.push_back("-lrtemsbsp");
10667 CmdArgs.push_back("--end-group");
10668 } else {
10669 CmdArgs.push_back("-lc");
10670 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010671 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010672 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010673 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010674 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10675 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010676 }
10677
10678 std::string Exec =
10679 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10680 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10681 CmdArgs, Inputs));
10682}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010683
10684void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10685 const InputInfo &Output,
10686 const InputInfoList &Inputs,
10687 const ArgList &Args,
10688 const char *LinkingOutput) const {
10689 claimNoWarnArgs(Args);
10690 ArgStringList CmdArgs;
10691
10692 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10693
10694 CmdArgs.push_back("-o");
10695 CmdArgs.push_back(Output.getFilename());
10696
10697 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10698 const InputInfo &Input = Inputs[0];
10699 assert(Input.isFilename() && "Invalid input.");
10700 CmdArgs.push_back(Input.getFilename());
10701
10702 const char *Exec =
Paul Robinson9d613612016-05-16 17:22:25 +000010703 Args.MakeArgString(getToolChain().GetProgramPath("orbis-as"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010704 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10705}
10706
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010707static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10708 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10709 if (SanArgs.needsUbsanRt()) {
10710 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10711 }
10712 if (SanArgs.needsAsanRt()) {
10713 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10714 }
10715}
10716
10717static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10718 const JobAction &JA, const InputInfo &Output,
10719 const InputInfoList &Inputs,
10720 const ArgList &Args,
10721 const char *LinkingOutput) {
10722 const toolchains::FreeBSD &ToolChain =
10723 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10724 const Driver &D = ToolChain.getDriver();
10725 ArgStringList CmdArgs;
10726
10727 // Silence warning for "clang -g foo.o -o foo"
10728 Args.ClaimAllArgs(options::OPT_g_Group);
10729 // and "clang -emit-llvm foo.o -o foo"
10730 Args.ClaimAllArgs(options::OPT_emit_llvm);
10731 // and for "clang -w foo.o -o foo". Other warning options are already
10732 // handled somewhere else.
10733 Args.ClaimAllArgs(options::OPT_w);
10734
10735 if (!D.SysRoot.empty())
10736 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10737
10738 if (Args.hasArg(options::OPT_pie))
10739 CmdArgs.push_back("-pie");
10740
10741 if (Args.hasArg(options::OPT_rdynamic))
10742 CmdArgs.push_back("-export-dynamic");
10743 if (Args.hasArg(options::OPT_shared))
10744 CmdArgs.push_back("--oformat=so");
10745
10746 if (Output.isFilename()) {
10747 CmdArgs.push_back("-o");
10748 CmdArgs.push_back(Output.getFilename());
10749 } else {
10750 assert(Output.isNothing() && "Invalid output.");
10751 }
10752
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010753 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10754
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010755 Args.AddAllArgs(CmdArgs, options::OPT_L);
10756 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10757 Args.AddAllArgs(CmdArgs, options::OPT_e);
10758 Args.AddAllArgs(CmdArgs, options::OPT_s);
10759 Args.AddAllArgs(CmdArgs, options::OPT_t);
10760 Args.AddAllArgs(CmdArgs, options::OPT_r);
10761
10762 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10763 CmdArgs.push_back("--no-demangle");
10764
10765 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10766
10767 if (Args.hasArg(options::OPT_pthread)) {
10768 CmdArgs.push_back("-lpthread");
10769 }
10770
Paul Robinson9d613612016-05-16 17:22:25 +000010771 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010772
10773 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10774}
10775
10776static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10777 const JobAction &JA, const InputInfo &Output,
10778 const InputInfoList &Inputs,
10779 const ArgList &Args,
10780 const char *LinkingOutput) {
10781 const toolchains::FreeBSD &ToolChain =
10782 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10783 const Driver &D = ToolChain.getDriver();
10784 ArgStringList CmdArgs;
10785
10786 // Silence warning for "clang -g foo.o -o foo"
10787 Args.ClaimAllArgs(options::OPT_g_Group);
10788 // and "clang -emit-llvm foo.o -o foo"
10789 Args.ClaimAllArgs(options::OPT_emit_llvm);
10790 // and for "clang -w foo.o -o foo". Other warning options are already
10791 // handled somewhere else.
10792 Args.ClaimAllArgs(options::OPT_w);
10793
10794 if (!D.SysRoot.empty())
10795 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10796
10797 if (Args.hasArg(options::OPT_pie))
10798 CmdArgs.push_back("-pie");
10799
10800 if (Args.hasArg(options::OPT_static)) {
10801 CmdArgs.push_back("-Bstatic");
10802 } else {
10803 if (Args.hasArg(options::OPT_rdynamic))
10804 CmdArgs.push_back("-export-dynamic");
10805 CmdArgs.push_back("--eh-frame-hdr");
10806 if (Args.hasArg(options::OPT_shared)) {
10807 CmdArgs.push_back("-Bshareable");
10808 } else {
10809 CmdArgs.push_back("-dynamic-linker");
10810 CmdArgs.push_back("/libexec/ld-elf.so.1");
10811 }
10812 CmdArgs.push_back("--enable-new-dtags");
10813 }
10814
10815 if (Output.isFilename()) {
10816 CmdArgs.push_back("-o");
10817 CmdArgs.push_back(Output.getFilename());
10818 } else {
10819 assert(Output.isNothing() && "Invalid output.");
10820 }
10821
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010822 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10823
Douglas Katzman78b37b02015-11-17 20:28:07 +000010824 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010825 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010826 if (!Args.hasArg(options::OPT_shared)) {
10827 if (Args.hasArg(options::OPT_pg))
10828 crt1 = "gcrt1.o";
10829 else if (Args.hasArg(options::OPT_pie))
10830 crt1 = "Scrt1.o";
10831 else
10832 crt1 = "crt1.o";
10833 }
10834 if (crt1)
10835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10836
10837 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10838
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010839 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010840 if (Args.hasArg(options::OPT_static))
10841 crtbegin = "crtbeginT.o";
10842 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10843 crtbegin = "crtbeginS.o";
10844 else
10845 crtbegin = "crtbegin.o";
10846
10847 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10848 }
10849
10850 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010851 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010852 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10853 Args.AddAllArgs(CmdArgs, options::OPT_e);
10854 Args.AddAllArgs(CmdArgs, options::OPT_s);
10855 Args.AddAllArgs(CmdArgs, options::OPT_t);
10856 Args.AddAllArgs(CmdArgs, options::OPT_r);
10857
10858 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10859 CmdArgs.push_back("--no-demangle");
10860
10861 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10862
Douglas Katzman78b37b02015-11-17 20:28:07 +000010863 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010864 // For PS4, we always want to pass libm, libstdc++ and libkernel
10865 // libraries for both C and C++ compilations.
10866 CmdArgs.push_back("-lkernel");
10867 if (D.CCCIsCXX()) {
10868 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10869 if (Args.hasArg(options::OPT_pg))
10870 CmdArgs.push_back("-lm_p");
10871 else
10872 CmdArgs.push_back("-lm");
10873 }
10874 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10875 // the default system libraries. Just mimic this for now.
10876 if (Args.hasArg(options::OPT_pg))
10877 CmdArgs.push_back("-lgcc_p");
10878 else
10879 CmdArgs.push_back("-lcompiler_rt");
10880 if (Args.hasArg(options::OPT_static)) {
10881 CmdArgs.push_back("-lstdc++");
10882 } else if (Args.hasArg(options::OPT_pg)) {
10883 CmdArgs.push_back("-lgcc_eh_p");
10884 } else {
10885 CmdArgs.push_back("--as-needed");
10886 CmdArgs.push_back("-lstdc++");
10887 CmdArgs.push_back("--no-as-needed");
10888 }
10889
10890 if (Args.hasArg(options::OPT_pthread)) {
10891 if (Args.hasArg(options::OPT_pg))
10892 CmdArgs.push_back("-lpthread_p");
10893 else
10894 CmdArgs.push_back("-lpthread");
10895 }
10896
10897 if (Args.hasArg(options::OPT_pg)) {
10898 if (Args.hasArg(options::OPT_shared))
10899 CmdArgs.push_back("-lc");
10900 else {
10901 if (Args.hasArg(options::OPT_static)) {
10902 CmdArgs.push_back("--start-group");
10903 CmdArgs.push_back("-lc_p");
10904 CmdArgs.push_back("-lpthread_p");
10905 CmdArgs.push_back("--end-group");
10906 } else {
10907 CmdArgs.push_back("-lc_p");
10908 }
10909 }
10910 CmdArgs.push_back("-lgcc_p");
10911 } else {
10912 if (Args.hasArg(options::OPT_static)) {
10913 CmdArgs.push_back("--start-group");
10914 CmdArgs.push_back("-lc");
10915 CmdArgs.push_back("-lpthread");
10916 CmdArgs.push_back("--end-group");
10917 } else {
10918 CmdArgs.push_back("-lc");
10919 }
10920 CmdArgs.push_back("-lcompiler_rt");
10921 }
10922
10923 if (Args.hasArg(options::OPT_static)) {
10924 CmdArgs.push_back("-lstdc++");
10925 } else if (Args.hasArg(options::OPT_pg)) {
10926 CmdArgs.push_back("-lgcc_eh_p");
10927 } else {
10928 CmdArgs.push_back("--as-needed");
10929 CmdArgs.push_back("-lstdc++");
10930 CmdArgs.push_back("--no-as-needed");
10931 }
10932 }
10933
Douglas Katzman78b37b02015-11-17 20:28:07 +000010934 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010935 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10936 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10937 else
10938 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10939 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10940 }
10941
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010942 const char *Exec =
10943#ifdef LLVM_ON_WIN32
Paul Robinson9d613612016-05-16 17:22:25 +000010944 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010945#else
Paul Robinson9d613612016-05-16 17:22:25 +000010946 Args.MakeArgString(ToolChain.GetProgramPath("orbis-ld"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010947#endif
10948
10949 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10950}
10951
10952void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10953 const InputInfo &Output,
10954 const InputInfoList &Inputs,
10955 const ArgList &Args,
10956 const char *LinkingOutput) const {
10957 const toolchains::FreeBSD &ToolChain =
10958 static_cast<const toolchains::FreeBSD &>(getToolChain());
10959 const Driver &D = ToolChain.getDriver();
10960 bool PS4Linker;
10961 StringRef LinkerOptName;
10962 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10963 LinkerOptName = A->getValue();
10964 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10965 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10966 }
10967
10968 if (LinkerOptName == "gold")
10969 PS4Linker = false;
10970 else if (LinkerOptName == "ps4")
10971 PS4Linker = true;
10972 else
10973 PS4Linker = !Args.hasArg(options::OPT_shared);
10974
10975 if (PS4Linker)
10976 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10977 else
10978 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10979}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010980
10981void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10982 const InputInfo &Output,
10983 const InputInfoList &Inputs,
10984 const ArgList &Args,
10985 const char *LinkingOutput) const {
10986 const auto &TC =
10987 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010988 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010989
10990 std::vector<std::string> gpu_archs =
10991 Args.getAllArgValues(options::OPT_march_EQ);
10992 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10993 const std::string& gpu_arch = gpu_archs[0];
10994
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010995 ArgStringList CmdArgs;
10996 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000010997 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
10998 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010999 // ptxas does not accept -g option if optimization is enabled, so
11000 // we ignore the compiler's -O* options if we want debug info.
11001 CmdArgs.push_back("-g");
11002 CmdArgs.push_back("--dont-merge-basicblocks");
11003 CmdArgs.push_back("--return-at-end");
11004 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
11005 // Map the -O we received to -O{0,1,2,3}.
11006 //
11007 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
11008 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011009
Justin Lebar2836dcd2016-01-19 19:52:21 +000011010 // -O3 seems like the least-bad option when -Osomething is specified to
11011 // clang but it isn't handled below.
11012 StringRef OOpt = "3";
11013 if (A->getOption().matches(options::OPT_O4) ||
11014 A->getOption().matches(options::OPT_Ofast))
11015 OOpt = "3";
11016 else if (A->getOption().matches(options::OPT_O0))
11017 OOpt = "0";
11018 else if (A->getOption().matches(options::OPT_O)) {
11019 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11020 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11021 .Case("1", "1")
11022 .Case("2", "2")
11023 .Case("3", "3")
11024 .Case("s", "2")
11025 .Case("z", "2")
11026 .Default("2");
11027 }
11028 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11029 } else {
11030 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11031 // to no optimizations, but ptxas's default is -O3.
11032 CmdArgs.push_back("-O0");
11033 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011034
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011035 CmdArgs.push_back("--gpu-name");
11036 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11037 CmdArgs.push_back("--output-file");
11038 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11039 for (const auto& II : Inputs)
11040 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11041
11042 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11043 CmdArgs.push_back(Args.MakeArgString(A));
11044
11045 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11046 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11047}
11048
11049// All inputs to this linker must be from CudaDeviceActions, as we need to look
11050// at the Inputs' Actions in order to figure out which GPU architecture they
11051// correspond to.
11052void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11053 const InputInfo &Output,
11054 const InputInfoList &Inputs,
11055 const ArgList &Args,
11056 const char *LinkingOutput) const {
11057 const auto &TC =
11058 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011059 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011060
11061 ArgStringList CmdArgs;
11062 CmdArgs.push_back("--cuda");
11063 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11064 CmdArgs.push_back(Args.MakeArgString("--create"));
11065 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11066
11067 for (const auto& II : Inputs) {
11068 auto* A = cast<const CudaDeviceAction>(II.getAction());
11069 // We need to pass an Arch of the form "sm_XX" for cubin files and
11070 // "compute_XX" for ptx.
11071 const char *Arch = (II.getType() == types::TY_PP_Asm)
11072 ? A->getComputeArchName()
11073 : A->getGpuArchName();
11074 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11075 Arch + ",file=" + II.getFilename()));
11076 }
11077
11078 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11079 CmdArgs.push_back(Args.MakeArgString(A));
11080
11081 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11082 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11083}