blob: 824ee72dcd241ff76fbd2592dbf3314adfd15f97 [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.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000806 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000807 if (Triple.getOS() != llvm::Triple::UnknownOS ||
808 !Triple.isOSBinFormatMachO())
809 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000810 break;
811 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000812 }
813 }
814
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000815 assert(ABI != FloatABI::Invalid && "must select an ABI");
816 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817}
818
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000819static void getARMTargetFeatures(const ToolChain &TC,
820 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000821 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000822 std::vector<const char *> &Features,
823 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824 const Driver &D = TC.getDriver();
825
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000826 bool KernelOrKext =
827 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000828 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
830 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
831
Nico Weber6e0ebae2015-04-29 21:16:40 +0000832 if (!ForAS) {
833 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
834 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
835 // stripped out by the ARM target. We should probably pass this a new
836 // -target-option, which is handled by the -cc1/-cc1as invocation.
837 //
838 // FIXME2: For consistency, it would be ideal if we set up the target
839 // machine state the same when using the frontend or the assembler. We don't
840 // currently do that for the assembler, we pass the options directly to the
841 // backend and never even instantiate the frontend TargetInfo. If we did,
842 // and used its handleTargetFeatures hook, then we could ensure the
843 // assembler and the frontend behave the same.
844
845 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000846 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000847 Features.push_back("+soft-float");
848
849 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000850 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000851 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000852 } else {
853 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
854 // to the assembler correctly.
855 for (const Arg *A :
856 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
857 StringRef Value = A->getValue();
858 if (Value.startswith("-mfpu=")) {
859 WaFPU = A;
860 } else if (Value.startswith("-mcpu=")) {
861 WaCPU = A;
862 } else if (Value.startswith("-mhwdiv=")) {
863 WaHDiv = A;
864 } else if (Value.startswith("-march=")) {
865 WaArch = A;
866 }
867 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000868 }
869
Renato Golin7c542b42015-07-27 23:44:45 +0000870 // Check -march. ClangAs gives preference to -Wa,-march=.
871 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000872 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000873 if (WaArch) {
874 if (ArchArg)
875 D.Diag(clang::diag::warn_drv_unused_argument)
876 << ArchArg->getAsString(Args);
877 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000878 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000879 // FIXME: Set Arch.
880 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
881 } else if (ArchArg) {
882 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000884 }
885
Renato Golin7c542b42015-07-27 23:44:45 +0000886 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
887 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000888 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000889 if (WaCPU) {
890 if (CPUArg)
891 D.Diag(clang::diag::warn_drv_unused_argument)
892 << CPUArg->getAsString(Args);
893 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000895 } else if (CPUArg) {
896 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000897 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000898 }
John Brawna95c1a82015-05-08 12:52:18 +0000899
Renato Golin23459c62015-07-30 16:40:17 +0000900 // Add CPU features for generic CPUs
901 if (CPUName == "native") {
902 llvm::StringMap<bool> HostFeatures;
903 if (llvm::sys::getHostCPUFeatures(HostFeatures))
904 for (auto &F : HostFeatures)
905 Features.push_back(
906 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
907 }
908
909 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
910 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
911 if (WaFPU) {
912 if (FPUArg)
913 D.Diag(clang::diag::warn_drv_unused_argument)
914 << FPUArg->getAsString(Args);
915 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
916 Features);
917 } else if (FPUArg) {
918 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
919 }
920
921 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
922 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
923 if (WaHDiv) {
924 if (HDivArg)
925 D.Diag(clang::diag::warn_drv_unused_argument)
926 << HDivArg->getAsString(Args);
927 getARMHWDivFeatures(D, WaHDiv, Args,
928 StringRef(WaHDiv->getValue()).substr(8), Features);
929 } else if (HDivArg)
930 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
931
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 // Setting -msoft-float effectively disables NEON because of the GCC
933 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000934 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000935 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000936 // Also need to explicitly disable features which imply NEON.
937 Features.push_back("-crypto");
938 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000939
Eric Christopher269c2a22015-04-04 03:34:43 +0000940 // En/disable crc code generation.
941 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000942 if (A->getOption().matches(options::OPT_mcrc))
943 Features.push_back("+crc");
944 else
945 Features.push_back("-crc");
946 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000947
Akira Hatanakac2694822015-07-07 08:28:42 +0000948 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
949 // neither options are specified, see if we are compiling for kernel/kext and
950 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000951 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
952 options::OPT_mno_long_calls)) {
953 if (A->getOption().matches(options::OPT_mlong_calls))
954 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000955 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
956 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000957 Features.push_back("+long-calls");
958 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000959
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000960 // Kernel code has more strict alignment requirements.
961 if (KernelOrKext)
962 Features.push_back("+strict-align");
963 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
964 options::OPT_munaligned_access)) {
965 if (A->getOption().matches(options::OPT_munaligned_access)) {
966 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
967 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
968 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000969 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
970 // access either.
971 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
972 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000973 } else
974 Features.push_back("+strict-align");
975 } else {
976 // Assume pre-ARMv6 doesn't support unaligned accesses.
977 //
978 // ARMv6 may or may not support unaligned accesses depending on the
979 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
980 // Darwin and NetBSD targets support unaligned accesses, and others don't.
981 //
982 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
983 // which raises an alignment fault on unaligned accesses. Linux
984 // defaults this bit to 0 and handles it as a system-wide (not
985 // per-process) setting. It is therefore safe to assume that ARMv7+
986 // Linux targets support unaligned accesses. The same goes for NaCl.
987 //
988 // The above behavior is consistent with GCC.
989 int VersionNum = getARMSubArchVersionNumber(Triple);
990 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000991 if (VersionNum < 6 ||
992 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000993 Features.push_back("+strict-align");
994 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
995 if (VersionNum < 7)
996 Features.push_back("+strict-align");
997 } else
998 Features.push_back("+strict-align");
999 }
1000
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001001 // llvm does not support reserving registers in general. There is support
1002 // for reserving r9 on ARM though (defined as a platform-specific register
1003 // in ARM EABI).
1004 if (Args.hasArg(options::OPT_ffixed_r9))
1005 Features.push_back("+reserve-r9");
1006
Dimitry Andric08107392016-01-06 07:42:18 +00001007 // The kext linker doesn't know how to deal with movw/movt.
1008 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001009 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001010}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001012void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1013 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001014 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001015 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001016 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001017 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001019 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001020 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001021 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001022 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001023 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001024 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001025 } else {
1026 ABIName = "apcs-gnu";
1027 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001028 } else if (Triple.isOSWindows()) {
1029 // FIXME: this is invalid for WindowsCE
1030 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001031 } else {
1032 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001034 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001035 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001036 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001037 ABIName = "aapcs-linux";
1038 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001039 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::EABI:
1041 ABIName = "aapcs";
1042 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001043 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001044 if (Triple.getOS() == llvm::Triple::NetBSD)
1045 ABIName = "apcs-gnu";
1046 else
1047 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001049 }
1050 }
1051 CmdArgs.push_back("-target-abi");
1052 CmdArgs.push_back(ABIName);
1053
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001055 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001056 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001057 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001058 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001059 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001060 CmdArgs.push_back("-mfloat-abi");
1061 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001062 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001064 CmdArgs.push_back("-mfloat-abi");
1065 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001066 } else {
1067 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001068 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001072
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1075 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001076 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001077 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 CmdArgs.push_back("-arm-global-merge=false");
1079 else
1080 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001081 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001082
Bob Wilson9c8af452013-04-11 18:53:25 +00001083 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001085 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001086}
Renato Goline17c5802015-07-27 23:44:42 +00001087// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001088
Tim Northover573cbee2014-05-24 12:52:07 +00001089/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1090/// targeting.
1091static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001092 Arg *A;
1093 std::string CPU;
1094 // If we have -mtune or -mcpu, use that.
1095 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001096 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001098 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001099 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001100 }
1101
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 // Handle CPU name is 'native'.
1103 if (CPU == "native")
1104 return llvm::sys::getHostCPUName();
1105 else if (CPU.size())
1106 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001107
James Molloy9b1586b2014-04-17 12:51:17 +00001108 // Make sure we pick "cyclone" if -arch is used.
1109 // FIXME: Should this be picked by checking the target triple instead?
1110 if (Args.getLastArg(options::OPT_arch))
1111 return "cyclone";
1112
1113 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001114}
1115
Tim Northover573cbee2014-05-24 12:52:07 +00001116void Clang::AddAArch64TargetArgs(const ArgList &Args,
1117 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001118 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1119 llvm::Triple Triple(TripleStr);
1120
1121 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1122 Args.hasArg(options::OPT_mkernel) ||
1123 Args.hasArg(options::OPT_fapple_kext))
1124 CmdArgs.push_back("-disable-red-zone");
1125
1126 if (!Args.hasFlag(options::OPT_mimplicit_float,
1127 options::OPT_mno_implicit_float, true))
1128 CmdArgs.push_back("-no-implicit-float");
1129
Craig Topper92fc2df2014-05-17 16:56:41 +00001130 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001131 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1132 ABIName = A->getValue();
1133 else if (Triple.isOSDarwin())
1134 ABIName = "darwinpcs";
1135 else
1136 ABIName = "aapcs";
1137
1138 CmdArgs.push_back("-target-abi");
1139 CmdArgs.push_back(ABIName);
1140
Bradley Smith9ff64332014-10-13 10:16:06 +00001141 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1142 options::OPT_mno_fix_cortex_a53_835769)) {
1143 CmdArgs.push_back("-backend-option");
1144 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1145 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1146 else
1147 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001148 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001149 // Enabled A53 errata (835769) workaround by default on android
1150 CmdArgs.push_back("-backend-option");
1151 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001152 }
1153
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001154 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1156 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001157 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001158 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 CmdArgs.push_back("-aarch64-global-merge=false");
1160 else
1161 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001162 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001163}
1164
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001165// Get CPU and ABI names. They are not independent
1166// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001167void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1168 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001169 const char *DefMips32CPU = "mips32r2";
1170 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001171
Daniel Sanders2bf13662014-07-10 14:40:57 +00001172 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1173 // default for mips64(el)?-img-linux-gnu.
1174 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1175 Triple.getEnvironment() == llvm::Triple::GNU) {
1176 DefMips32CPU = "mips32r6";
1177 DefMips64CPU = "mips64r6";
1178 }
Renato Golin7c542b42015-07-27 23:44:45 +00001179
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001180 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001181 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001182 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001183
Brad Smithba26f582015-01-06 02:53:17 +00001184 // MIPS3 is the default for mips64*-unknown-openbsd.
1185 if (Triple.getOS() == llvm::Triple::OpenBSD)
1186 DefMips64CPU = "mips3";
1187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001188 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001189 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001190
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001191 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001192 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001193 // Convert a GNU style Mips ABI name to the name
1194 // accepted by LLVM Mips backend.
1195 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001196 .Case("32", "o32")
1197 .Case("64", "n64")
1198 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001199 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001200
1201 // Setup default CPU and ABI names.
1202 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001203 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001204 default:
1205 llvm_unreachable("Unexpected triple arch name");
1206 case llvm::Triple::mips:
1207 case llvm::Triple::mipsel:
1208 CPUName = DefMips32CPU;
1209 break;
1210 case llvm::Triple::mips64:
1211 case llvm::Triple::mips64el:
1212 CPUName = DefMips64CPU;
1213 break;
1214 }
1215 }
1216
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001217 if (ABIName.empty()) {
1218 // Deduce ABI name from the target triple.
1219 if (Triple.getArch() == llvm::Triple::mips ||
1220 Triple.getArch() == llvm::Triple::mipsel)
1221 ABIName = "o32";
1222 else
1223 ABIName = "n64";
1224 }
1225
1226 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001227 // Deduce CPU name from ABI name.
1228 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001229 .Cases("o32", "eabi", DefMips32CPU)
1230 .Cases("n32", "n64", DefMips64CPU)
1231 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001233
1234 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001235}
1236
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001237std::string mips::getMipsABILibSuffix(const ArgList &Args,
1238 const llvm::Triple &Triple) {
1239 StringRef CPUName, ABIName;
1240 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1241 return llvm::StringSwitch<std::string>(ABIName)
1242 .Case("o32", "")
1243 .Case("n32", "32")
1244 .Case("n64", "64");
1245}
1246
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001247// Convert ABI name to the GNU tools acceptable variant.
1248static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1249 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001250 .Case("o32", "32")
1251 .Case("n64", "64")
1252 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001253}
1254
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001255// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1256// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001257static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1258 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001259 if (Arg *A =
1260 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1261 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001262 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001263 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001264 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001265 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001266 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001267 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1268 .Case("soft", mips::FloatABI::Soft)
1269 .Case("hard", mips::FloatABI::Hard)
1270 .Default(mips::FloatABI::Invalid);
1271 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001272 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001273 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001274 }
1275 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001276 }
1277
1278 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001279 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001280 // Assume "hard", because it's a default value used by gcc.
1281 // When we start to recognize specific target MIPS processors,
1282 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001283 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001284 }
1285
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001286 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1287 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001288}
1289
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001291 std::vector<const char *> &Features,
1292 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001293 StringRef FeatureName) {
1294 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001297 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001298 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001299 }
1300}
1301
Daniel Sanders379d44b2014-07-16 11:52:23 +00001302static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1303 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305 StringRef CPUName;
1306 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001307 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001308 ABIName = getGnuCompatibleMipsABIName(ABIName);
1309
Daniel Sandersfeb61302014-08-08 15:47:17 +00001310 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1311 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001312
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001313 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1314 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001315 // FIXME: Note, this is a hack. We need to pass the selected float
1316 // mode to the MipsTargetInfoBase to define appropriate macros there.
1317 // Now it is the only method.
1318 Features.push_back("+soft-float");
1319 }
1320
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001321 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001322 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001323 if (Val == "2008") {
1324 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1325 Features.push_back("+nan2008");
1326 else {
1327 Features.push_back("-nan2008");
1328 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1329 }
1330 } else if (Val == "legacy") {
1331 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1332 Features.push_back("-nan2008");
1333 else {
1334 Features.push_back("+nan2008");
1335 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1336 }
1337 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001338 D.Diag(diag::err_drv_unsupported_option_argument)
1339 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001340 }
1341
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001342 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1343 options::OPT_mdouble_float, "single-float");
1344 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1345 "mips16");
1346 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1347 options::OPT_mno_micromips, "micromips");
1348 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1349 "dsp");
1350 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1351 "dspr2");
1352 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1353 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001354
1355 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1356 // pass -mfpxx
1357 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1358 options::OPT_mfp64)) {
1359 if (A->getOption().matches(options::OPT_mfp32))
1360 Features.push_back(Args.MakeArgString("-fp64"));
1361 else if (A->getOption().matches(options::OPT_mfpxx)) {
1362 Features.push_back(Args.MakeArgString("+fpxx"));
1363 Features.push_back(Args.MakeArgString("+nooddspreg"));
1364 } else
1365 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001366 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001370
Daniel Sanders28e5d392014-07-10 10:39:51 +00001371 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1372 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001373}
1374
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001375void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001376 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001377 const Driver &D = getToolChain().getDriver();
1378 StringRef CPUName;
1379 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001380 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001381 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382
1383 CmdArgs.push_back("-target-abi");
1384 CmdArgs.push_back(ABIName.data());
1385
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001386 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1387 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001388 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001389 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001390 CmdArgs.push_back("-mfloat-abi");
1391 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001392 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001393 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001394 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001397 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001398
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001399 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1400 if (A->getOption().matches(options::OPT_mxgot)) {
1401 CmdArgs.push_back("-mllvm");
1402 CmdArgs.push_back("-mxgot");
1403 }
1404 }
1405
Simon Atanasyanc580b322013-05-11 06:33:44 +00001406 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1407 options::OPT_mno_ldc1_sdc1)) {
1408 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1409 CmdArgs.push_back("-mllvm");
1410 CmdArgs.push_back("-mno-ldc1-sdc1");
1411 }
1412 }
1413
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001414 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1415 options::OPT_mno_check_zero_division)) {
1416 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1417 CmdArgs.push_back("-mllvm");
1418 CmdArgs.push_back("-mno-check-zero-division");
1419 }
1420 }
1421
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001422 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001423 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001424 CmdArgs.push_back("-mllvm");
1425 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1426 A->claim();
1427 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001428}
1429
Hal Finkel8eb59282012-06-11 22:35:19 +00001430/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1431static std::string getPPCTargetCPU(const ArgList &Args) {
1432 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001433 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001434
1435 if (CPUName == "native") {
1436 std::string CPU = llvm::sys::getHostCPUName();
1437 if (!CPU.empty() && CPU != "generic")
1438 return CPU;
1439 else
1440 return "";
1441 }
1442
1443 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 .Case("common", "generic")
1445 .Case("440", "440")
1446 .Case("440fp", "440")
1447 .Case("450", "450")
1448 .Case("601", "601")
1449 .Case("602", "602")
1450 .Case("603", "603")
1451 .Case("603e", "603e")
1452 .Case("603ev", "603ev")
1453 .Case("604", "604")
1454 .Case("604e", "604e")
1455 .Case("620", "620")
1456 .Case("630", "pwr3")
1457 .Case("G3", "g3")
1458 .Case("7400", "7400")
1459 .Case("G4", "g4")
1460 .Case("7450", "7450")
1461 .Case("G4+", "g4+")
1462 .Case("750", "750")
1463 .Case("970", "970")
1464 .Case("G5", "g5")
1465 .Case("a2", "a2")
1466 .Case("a2q", "a2q")
1467 .Case("e500mc", "e500mc")
1468 .Case("e5500", "e5500")
1469 .Case("power3", "pwr3")
1470 .Case("power4", "pwr4")
1471 .Case("power5", "pwr5")
1472 .Case("power5x", "pwr5x")
1473 .Case("power6", "pwr6")
1474 .Case("power6x", "pwr6x")
1475 .Case("power7", "pwr7")
1476 .Case("power8", "pwr8")
1477 .Case("pwr3", "pwr3")
1478 .Case("pwr4", "pwr4")
1479 .Case("pwr5", "pwr5")
1480 .Case("pwr5x", "pwr5x")
1481 .Case("pwr6", "pwr6")
1482 .Case("pwr6x", "pwr6x")
1483 .Case("pwr7", "pwr7")
1484 .Case("pwr8", "pwr8")
1485 .Case("powerpc", "ppc")
1486 .Case("powerpc64", "ppc64")
1487 .Case("powerpc64le", "ppc64le")
1488 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001489 }
1490
1491 return "";
1492}
1493
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001494static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1495 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001496 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001497 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1500 if (FloatABI == ppc::FloatABI::Soft &&
1501 !(Triple.getArch() == llvm::Triple::ppc64 ||
1502 Triple.getArch() == llvm::Triple::ppc64le))
1503 Features.push_back("+soft-float");
1504 else if (FloatABI == ppc::FloatABI::Soft &&
1505 (Triple.getArch() == llvm::Triple::ppc64 ||
1506 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001507 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001508 << "soft float is not supported for ppc64";
1509
Eric Christopher643bb6a2013-10-16 20:40:08 +00001510 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001511 AddTargetFeature(Args, Features, options::OPT_faltivec,
1512 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001513}
1514
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001515ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1516 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1517 if (Arg *A =
1518 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1519 options::OPT_mfloat_abi_EQ)) {
1520 if (A->getOption().matches(options::OPT_msoft_float))
1521 ABI = ppc::FloatABI::Soft;
1522 else if (A->getOption().matches(options::OPT_mhard_float))
1523 ABI = ppc::FloatABI::Hard;
1524 else {
1525 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1526 .Case("soft", ppc::FloatABI::Soft)
1527 .Case("hard", ppc::FloatABI::Hard)
1528 .Default(ppc::FloatABI::Invalid);
1529 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1530 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1531 ABI = ppc::FloatABI::Hard;
1532 }
1533 }
1534 }
1535
1536 // If unspecified, choose the default based on the platform.
1537 if (ABI == ppc::FloatABI::Invalid) {
1538 ABI = ppc::FloatABI::Hard;
1539 }
1540
1541 return ABI;
1542}
1543
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544void Clang::AddPPCTargetArgs(const ArgList &Args,
1545 ArgStringList &CmdArgs) const {
1546 // Select the ABI to use.
1547 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001548 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001549 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001550 case llvm::Triple::ppc64: {
1551 // When targeting a processor that supports QPX, or if QPX is
1552 // specifically enabled, default to using the ABI that supports QPX (so
1553 // long as it is not specifically disabled).
1554 bool HasQPX = false;
1555 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1556 HasQPX = A->getValue() == StringRef("a2q");
1557 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1558 if (HasQPX) {
1559 ABIName = "elfv1-qpx";
1560 break;
1561 }
1562
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 ABIName = "elfv1";
1564 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001565 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001566 case llvm::Triple::ppc64le:
1567 ABIName = "elfv2";
1568 break;
1569 default:
1570 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001571 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001572
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001573 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1574 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1575 // the option if given as we don't have backend support for any targets
1576 // that don't use the altivec abi.
1577 if (StringRef(A->getValue()) != "altivec")
1578 ABIName = A->getValue();
1579
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001580 ppc::FloatABI FloatABI =
1581 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1582
1583 if (FloatABI == ppc::FloatABI::Soft) {
1584 // Floating point operations and argument passing are soft.
1585 CmdArgs.push_back("-msoft-float");
1586 CmdArgs.push_back("-mfloat-abi");
1587 CmdArgs.push_back("soft");
1588 } else {
1589 // Floating point operations and argument passing are hard.
1590 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("hard");
1593 }
1594
Ulrich Weigand8afad612014-07-28 13:17:52 +00001595 if (ABIName) {
1596 CmdArgs.push_back("-target-abi");
1597 CmdArgs.push_back(ABIName);
1598 }
1599}
1600
1601bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1602 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1603 return A && (A->getValue() == StringRef(Value));
1604}
1605
Tom Stellard6674c702013-04-01 20:56:53 +00001606/// Get the (LLVM) name of the R600 gpu we are targeting.
1607static std::string getR600TargetGPU(const ArgList &Args) {
1608 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001609 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001610 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001611 .Cases("rv630", "rv635", "r600")
1612 .Cases("rv610", "rv620", "rs780", "rs880")
1613 .Case("rv740", "rv770")
1614 .Case("palm", "cedar")
1615 .Cases("sumo", "sumo2", "sumo")
1616 .Case("hemlock", "cypress")
1617 .Case("aruba", "cayman")
1618 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001619 }
1620 return "";
1621}
1622
Jacques Pienaard964cc22016-03-28 21:02:54 +00001623static std::string getLanaiTargetCPU(const ArgList &Args) {
1624 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1625 return A->getValue();
1626 }
1627 return "";
1628}
1629
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001631 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001632 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001633 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001634
James Y Knightb2406522015-06-15 20:51:24 +00001635 bool SoftFloatABI = false;
1636 if (Arg *A =
1637 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001638 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001639 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001640 }
1641
James Y Knightb2406522015-06-15 20:51:24 +00001642 // Only the hard-float ABI on Sparc is standardized, and it is the
1643 // default. GCC also supports a nonstandard soft-float ABI mode, and
1644 // perhaps LLVM should implement that, too. However, since llvm
1645 // currently does not support Sparc soft-float, at all, display an
1646 // error if it's requested.
1647 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001648 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1649 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001650 }
1651}
1652
Richard Sandiford4652d892013-07-19 16:51:51 +00001653static const char *getSystemZTargetCPU(const ArgList &Args) {
1654 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1655 return A->getValue();
1656 return "z10";
1657}
1658
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001659static void getSystemZTargetFeatures(const ArgList &Args,
1660 std::vector<const char *> &Features) {
1661 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001663 if (A->getOption().matches(options::OPT_mhtm))
1664 Features.push_back("+transactional-execution");
1665 else
1666 Features.push_back("-transactional-execution");
1667 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001668 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001669 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001670 if (A->getOption().matches(options::OPT_mvx))
1671 Features.push_back("+vector");
1672 else
1673 Features.push_back("-vector");
1674 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001675}
1676
Chandler Carruth953fb082013-01-13 11:46:33 +00001677static const char *getX86TargetCPU(const ArgList &Args,
1678 const llvm::Triple &Triple) {
1679 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001680 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001681 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001682 return "core-avx2";
1683
Chandler Carruth953fb082013-01-13 11:46:33 +00001684 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686
1687 // FIXME: Reject attempts to use -march=native unless the target matches
1688 // the host.
1689 //
1690 // FIXME: We should also incorporate the detected target features for use
1691 // with -native.
1692 std::string CPU = llvm::sys::getHostCPUName();
1693 if (!CPU.empty() && CPU != "generic")
1694 return Args.MakeArgString(CPU);
1695 }
1696
Reid Kleckner3123eff2015-06-30 16:32:04 +00001697 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1698 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1699 StringRef Arch = A->getValue();
1700 const char *CPU;
1701 if (Triple.getArch() == llvm::Triple::x86) {
1702 CPU = llvm::StringSwitch<const char *>(Arch)
1703 .Case("IA32", "i386")
1704 .Case("SSE", "pentium3")
1705 .Case("SSE2", "pentium4")
1706 .Case("AVX", "sandybridge")
1707 .Case("AVX2", "haswell")
1708 .Default(nullptr);
1709 } else {
1710 CPU = llvm::StringSwitch<const char *>(Arch)
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 }
1715 if (CPU)
1716 return CPU;
1717 }
1718
Chandler Carruth953fb082013-01-13 11:46:33 +00001719 // Select the default CPU if none was given (or detection failed).
1720
1721 if (Triple.getArch() != llvm::Triple::x86_64 &&
1722 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001723 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001724
1725 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1726
1727 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001728 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001729 if (Triple.getArchName() == "x86_64h")
1730 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001731 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001732 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001733
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001734 // Set up default CPU name for PS4 compilers.
1735 if (Triple.isPS4CPU())
1736 return "btver2";
1737
Alexey Bataev286d1b92014-01-31 04:07:13 +00001738 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001739 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001740 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001741
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001742 // Everything else goes to x86-64 in 64-bit mode.
1743 if (Is64Bit)
1744 return "x86-64";
1745
1746 switch (Triple.getOS()) {
1747 case llvm::Triple::FreeBSD:
1748 case llvm::Triple::NetBSD:
1749 case llvm::Triple::OpenBSD:
1750 return "i486";
1751 case llvm::Triple::Haiku:
1752 return "i586";
1753 case llvm::Triple::Bitrig:
1754 return "i686";
1755 default:
1756 // Fallback to p4.
1757 return "pentium4";
1758 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001759}
1760
Dan Gohmanc2853072015-09-03 22:51:53 +00001761/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1762static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1763 // If we have -mcpu=, use that.
1764 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1765 StringRef CPU = A->getValue();
1766
1767#ifdef __wasm__
1768 // Handle "native" by examining the host. "native" isn't meaningful when
1769 // cross compiling, so only support this when the host is also WebAssembly.
1770 if (CPU == "native")
1771 return llvm::sys::getHostCPUName();
1772#endif
1773
1774 return CPU;
1775 }
1776
1777 return "generic";
1778}
1779
Renato Golin7c542b42015-07-27 23:44:45 +00001780static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1781 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001782 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001783 default:
1784 return "";
1785
Amara Emerson703da2e2013-10-31 09:32:33 +00001786 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001787 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001788 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001789
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001790 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001791 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001792 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001793 case llvm::Triple::thumbeb: {
1794 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001795 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001796 return arm::getARMTargetCPU(MCPU, MArch, T);
1797 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001798 case llvm::Triple::mips:
1799 case llvm::Triple::mipsel:
1800 case llvm::Triple::mips64:
1801 case llvm::Triple::mips64el: {
1802 StringRef CPUName;
1803 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001804 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001805 return CPUName;
1806 }
1807
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001808 case llvm::Triple::nvptx:
1809 case llvm::Triple::nvptx64:
1810 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1811 return A->getValue();
1812 return "";
1813
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001814 case llvm::Triple::ppc:
1815 case llvm::Triple::ppc64:
1816 case llvm::Triple::ppc64le: {
1817 std::string TargetCPUName = getPPCTargetCPU(Args);
1818 // LLVM may default to generating code for the native CPU,
1819 // but, like gcc, we default to a more generic option for
1820 // each architecture. (except on Darwin)
1821 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1822 if (T.getArch() == llvm::Triple::ppc64)
1823 TargetCPUName = "ppc64";
1824 else if (T.getArch() == llvm::Triple::ppc64le)
1825 TargetCPUName = "ppc64le";
1826 else
1827 TargetCPUName = "ppc";
1828 }
1829 return TargetCPUName;
1830 }
1831
1832 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001833 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001834 case llvm::Triple::sparcv9:
1835 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001836 return A->getValue();
1837 return "";
1838
1839 case llvm::Triple::x86:
1840 case llvm::Triple::x86_64:
1841 return getX86TargetCPU(Args, T);
1842
1843 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001844 return "hexagon" +
1845 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001846
Jacques Pienaard964cc22016-03-28 21:02:54 +00001847 case llvm::Triple::lanai:
1848 return getLanaiTargetCPU(Args);
1849
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001850 case llvm::Triple::systemz:
1851 return getSystemZTargetCPU(Args);
1852
1853 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001854 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001856
1857 case llvm::Triple::wasm32:
1858 case llvm::Triple::wasm64:
1859 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 }
1861}
1862
Alp Tokerce365ca2013-12-02 12:43:03 +00001863static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001864 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001865 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1866 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1867 // forward.
1868 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 std::string Plugin =
1870 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001871 CmdArgs.push_back(Args.MakeArgString(Plugin));
1872
1873 // Try to pass driver level flags relevant to LTO code generation down to
1874 // the plugin.
1875
1876 // Handle flags for selecting CPU variants.
1877 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1878 if (!CPU.empty())
1879 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001880
James Molloyf97fdae2015-12-21 10:44:36 +00001881 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1882 StringRef OOpt;
1883 if (A->getOption().matches(options::OPT_O4) ||
1884 A->getOption().matches(options::OPT_Ofast))
1885 OOpt = "3";
1886 else if (A->getOption().matches(options::OPT_O))
1887 OOpt = A->getValue();
1888 else if (A->getOption().matches(options::OPT_O0))
1889 OOpt = "0";
1890 if (!OOpt.empty())
1891 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1892 }
1893
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001894 if (IsThinLTO)
1895 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001896
1897 // If an explicit debugger tuning argument appeared, pass it along.
1898 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1899 options::OPT_ggdbN_Group)) {
1900 if (A->getOption().matches(options::OPT_glldb))
1901 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1902 else if (A->getOption().matches(options::OPT_gsce))
1903 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1904 else
1905 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1906 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001907}
1908
Sanjay Patel2987c292015-06-11 14:53:41 +00001909/// This is a helper function for validating the optional refinement step
1910/// parameter in reciprocal argument strings. Return false if there is an error
1911/// parsing the refinement step. Otherwise, return true and set the Position
1912/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001913static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001915 const char RefinementStepToken = ':';
1916 Position = In.find(RefinementStepToken);
1917 if (Position != StringRef::npos) {
1918 StringRef Option = A.getOption().getName();
1919 StringRef RefStep = In.substr(Position + 1);
1920 // Allow exactly one numeric character for the additional refinement
1921 // step parameter. This is reasonable for all currently-supported
1922 // operations and architectures because we would expect that a larger value
1923 // of refinement steps would cause the estimate "optimization" to
1924 // under-perform the native operation. Also, if the estimate does not
1925 // converge quickly, it probably will not ever converge, so further
1926 // refinement steps will not produce a better answer.
1927 if (RefStep.size() != 1) {
1928 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1929 return false;
1930 }
1931 char RefStepChar = RefStep[0];
1932 if (RefStepChar < '0' || RefStepChar > '9') {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 }
1937 return true;
1938}
1939
1940/// The -mrecip flag requires processing of many optional parameters.
1941static void ParseMRecip(const Driver &D, const ArgList &Args,
1942 ArgStringList &OutStrings) {
1943 StringRef DisabledPrefixIn = "!";
1944 StringRef DisabledPrefixOut = "!";
1945 StringRef EnabledPrefixOut = "";
1946 StringRef Out = "-mrecip=";
1947
1948 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1949 if (!A)
1950 return;
1951
1952 unsigned NumOptions = A->getNumValues();
1953 if (NumOptions == 0) {
1954 // No option is the same as "all".
1955 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1956 return;
1957 }
1958
1959 // Pass through "all", "none", or "default" with an optional refinement step.
1960 if (NumOptions == 1) {
1961 StringRef Val = A->getValue(0);
1962 size_t RefStepLoc;
1963 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1964 return;
1965 StringRef ValBase = Val.slice(0, RefStepLoc);
1966 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1967 OutStrings.push_back(Args.MakeArgString(Out + Val));
1968 return;
1969 }
1970 }
1971
1972 // Each reciprocal type may be enabled or disabled individually.
1973 // Check each input value for validity, concatenate them all back together,
1974 // and pass through.
1975
1976 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 OptionStrings.insert(std::make_pair("divd", false));
1978 OptionStrings.insert(std::make_pair("divf", false));
1979 OptionStrings.insert(std::make_pair("vec-divd", false));
1980 OptionStrings.insert(std::make_pair("vec-divf", false));
1981 OptionStrings.insert(std::make_pair("sqrtd", false));
1982 OptionStrings.insert(std::make_pair("sqrtf", false));
1983 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1984 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001985
1986 for (unsigned i = 0; i != NumOptions; ++i) {
1987 StringRef Val = A->getValue(i);
1988
1989 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1990 // Ignore the disablement token for string matching.
1991 if (IsDisabled)
1992 Val = Val.substr(1);
1993
1994 size_t RefStep;
1995 if (!getRefinementStep(Val, D, *A, RefStep))
1996 return;
1997
1998 StringRef ValBase = Val.slice(0, RefStep);
1999 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2000 if (OptionIter == OptionStrings.end()) {
2001 // Try again specifying float suffix.
2002 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2003 if (OptionIter == OptionStrings.end()) {
2004 // The input name did not match any known option string.
2005 D.Diag(diag::err_drv_unknown_argument) << Val;
2006 return;
2007 }
2008 // The option was specified without a float or double suffix.
2009 // Make sure that the double entry was not already specified.
2010 // The float entry will be checked below.
2011 if (OptionStrings[ValBase.str() + 'd']) {
2012 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2013 return;
2014 }
2015 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002016
Sanjay Patel2987c292015-06-11 14:53:41 +00002017 if (OptionIter->second == true) {
2018 // Duplicate option specified.
2019 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2020 return;
2021 }
2022
2023 // Mark the matched option as found. Do not allow duplicate specifiers.
2024 OptionIter->second = true;
2025
2026 // If the precision was not specified, also mark the double entry as found.
2027 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2028 OptionStrings[ValBase.str() + 'd'] = true;
2029
2030 // Build the output string.
2031 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2032 Out = Args.MakeArgString(Out + Prefix + Val);
2033 if (i != NumOptions - 1)
2034 Out = Args.MakeArgString(Out + ",");
2035 }
2036
2037 OutStrings.push_back(Args.MakeArgString(Out));
2038}
2039
Eric Christopherc54920a2015-03-23 19:26:05 +00002040static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002041 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002042 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002043 // If -march=native, autodetect the feature list.
2044 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2045 if (StringRef(A->getValue()) == "native") {
2046 llvm::StringMap<bool> HostFeatures;
2047 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2048 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002049 Features.push_back(
2050 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002051 }
2052 }
2053
Jim Grosbach82eee262013-11-16 00:53:35 +00002054 if (Triple.getArchName() == "x86_64h") {
2055 // x86_64h implies quite a few of the more modern subtarget features
2056 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2057 Features.push_back("-rdrnd");
2058 Features.push_back("-aes");
2059 Features.push_back("-pclmul");
2060 Features.push_back("-rtm");
2061 Features.push_back("-hle");
2062 Features.push_back("-fsgsbase");
2063 }
2064
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002065 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002066 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002067 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002068 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002069 Features.push_back("+sse4.2");
2070 Features.push_back("+popcnt");
2071 } else
2072 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002073 }
2074
Eric Christopherc54920a2015-03-23 19:26:05 +00002075 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002076 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2077 StringRef Arch = A->getValue();
2078 bool ArchUsed = false;
2079 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002080 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arch == "AVX" || Arch == "AVX2") {
2082 ArchUsed = true;
2083 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2084 }
2085 }
2086 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002087 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002088 if (Arch == "IA32") {
2089 ArchUsed = true;
2090 } else if (Arch == "SSE" || Arch == "SSE2") {
2091 ArchUsed = true;
2092 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2093 }
2094 }
2095 if (!ArchUsed)
2096 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2097 }
2098
Jim Grosbach82eee262013-11-16 00:53:35 +00002099 // Now add any that the user explicitly requested on the command line,
2100 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002101 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002102}
2103
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002104void Clang::AddX86TargetArgs(const ArgList &Args,
2105 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002106 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002107 Args.hasArg(options::OPT_mkernel) ||
2108 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002109 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002110
Bob Wilson2616e2e2013-02-10 16:01:41 +00002111 // Default to avoid implicit floating-point for kernel/kext code, but allow
2112 // that to be overridden with -mno-soft-float.
2113 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2114 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002115 if (Arg *A = Args.getLastArg(
2116 options::OPT_msoft_float, options::OPT_mno_soft_float,
2117 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002118 const Option &O = A->getOption();
2119 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2120 O.matches(options::OPT_msoft_float));
2121 }
2122 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002123 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002124
2125 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2126 StringRef Value = A->getValue();
2127 if (Value == "intel" || Value == "att") {
2128 CmdArgs.push_back("-mllvm");
2129 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2130 } else {
2131 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2132 << A->getOption().getName() << Value;
2133 }
2134 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002135}
2136
Tony Linthicum76329bf2011-12-12 21:14:55 +00002137void Clang::AddHexagonTargetArgs(const ArgList &Args,
2138 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002139 CmdArgs.push_back("-mqdsp6-compat");
2140 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002141
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002142 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2143 std::string N = llvm::utostr(G.getValue());
2144 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002146 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002147 }
2148
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002149 if (!Args.hasArg(options::OPT_fno_short_enums))
2150 CmdArgs.push_back("-fshort-enums");
2151 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 CmdArgs.push_back("-mllvm");
2153 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002154 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 CmdArgs.push_back("-mllvm");
2156 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002157}
2158
Jacques Pienaard964cc22016-03-28 21:02:54 +00002159void Clang::AddLanaiTargetArgs(const ArgList &Args,
2160 ArgStringList &CmdArgs) const {
2161 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2162 StringRef CPUName = A->getValue();
2163
2164 CmdArgs.push_back("-target-cpu");
2165 CmdArgs.push_back(Args.MakeArgString(CPUName));
2166 }
2167 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2168 StringRef Value = A->getValue();
2169 // Only support mregparm=4 to support old usage. Report error for all other
2170 // cases.
2171 int Mregparm;
2172 if (Value.getAsInteger(10, Mregparm)) {
2173 if (Mregparm != 4) {
2174 getToolChain().getDriver().Diag(
2175 diag::err_drv_unsupported_option_argument)
2176 << A->getOption().getName() << Value;
2177 }
2178 }
2179 }
2180}
2181
Dan Gohmane3d71e12016-01-07 01:00:21 +00002182void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2183 ArgStringList &CmdArgs) const {
2184 // Default to "hidden" visibility.
2185 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2186 options::OPT_fvisibility_ms_compat)) {
2187 CmdArgs.push_back("-fvisibility");
2188 CmdArgs.push_back("hidden");
2189 }
2190}
2191
Kevin Qin110db6f2014-07-18 07:03:22 +00002192// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002193static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002194 std::vector<const char *> &Features) {
2195 SmallVector<StringRef, 8> Split;
2196 text.split(Split, StringRef("+"), -1, false);
2197
Benjamin Kramer72e64312015-09-24 14:48:49 +00002198 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002199 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002200 .Case("fp", "+fp-armv8")
2201 .Case("simd", "+neon")
2202 .Case("crc", "+crc")
2203 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002204 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002205 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 .Case("nofp", "-fp-armv8")
2207 .Case("nosimd", "-neon")
2208 .Case("nocrc", "-crc")
2209 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002210 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002211 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 .Default(nullptr);
2213 if (result)
2214 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002215 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002216 D.Diag(diag::err_drv_no_neon_modifier);
2217 else
2218 return false;
2219 }
2220 return true;
2221}
2222
2223// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2224// decode CPU and feature.
2225static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2226 std::vector<const char *> &Features) {
2227 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2228 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002229 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002230 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2231 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002232 Features.push_back("+neon");
2233 Features.push_back("+crc");
2234 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002235 } else if (CPU == "cyclone") {
2236 Features.push_back("+neon");
2237 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002238 } else if (CPU == "generic") {
2239 Features.push_back("+neon");
2240 } else {
2241 return false;
2242 }
2243
2244 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2245 return false;
2246
2247 return true;
2248}
2249
2250static bool
2251getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2252 const ArgList &Args,
2253 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002254 std::string MarchLowerCase = March.lower();
2255 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002256
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002257 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002258 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002259 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002260 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002261 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2262 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002263 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002264 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002265 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002266
2267 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2268 return false;
2269
2270 return true;
2271}
2272
2273static bool
2274getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2275 const ArgList &Args,
2276 std::vector<const char *> &Features) {
2277 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002278 std::string McpuLowerCase = Mcpu.lower();
2279 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002280 return false;
2281
2282 return true;
2283}
2284
2285static bool
2286getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2287 const ArgList &Args,
2288 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002289 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002290 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002291 if (MtuneLowerCase == "native")
2292 MtuneLowerCase = llvm::sys::getHostCPUName();
2293 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002294 Features.push_back("+zcm");
2295 Features.push_back("+zcz");
2296 }
2297 return true;
2298}
2299
2300static bool
2301getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2302 const ArgList &Args,
2303 std::vector<const char *> &Features) {
2304 StringRef CPU;
2305 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002306 std::string McpuLowerCase = Mcpu.lower();
2307 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002308 return false;
2309
2310 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2311}
2312
Justin Bognerf9052562015-11-13 23:07:31 +00002313static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002314 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002315 Arg *A;
2316 bool success = true;
2317 // Enable NEON by default.
2318 Features.push_back("+neon");
2319 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2320 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2321 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2322 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002323 else if (Args.hasArg(options::OPT_arch))
2324 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2325 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002326
2327 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2328 success =
2329 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2330 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2331 success =
2332 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002333 else if (Args.hasArg(options::OPT_arch))
2334 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2335 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002336
2337 if (!success)
2338 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002339
2340 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2341 Features.push_back("-fp-armv8");
2342 Features.push_back("-crypto");
2343 Features.push_back("-neon");
2344 }
Bradley Smith418c5932014-05-02 15:17:51 +00002345
2346 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002347 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002348 if (A->getOption().matches(options::OPT_mcrc))
2349 Features.push_back("+crc");
2350 else
2351 Features.push_back("-crc");
2352 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002353
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002354 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2355 options::OPT_munaligned_access))
2356 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2357 Features.push_back("+strict-align");
2358
Justin Bognerf9052562015-11-13 23:07:31 +00002359 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002360 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002361}
2362
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002363static void getHexagonTargetFeatures(const ArgList &Args,
2364 std::vector<const char *> &Features) {
2365 bool HasHVX = false, HasHVXD = false;
2366
Eric Christopher49062a52015-12-22 03:12:34 +00002367 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2368 // doing dependent option handling here rather than in initFeatureMap or a
2369 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002370 for (auto &A : Args) {
2371 auto &Opt = A->getOption();
2372 if (Opt.matches(options::OPT_mhexagon_hvx))
2373 HasHVX = true;
2374 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2375 HasHVXD = HasHVX = false;
2376 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2377 HasHVXD = HasHVX = true;
2378 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2379 HasHVXD = false;
2380 else
2381 continue;
2382 A->claim();
2383 }
2384
2385 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2386 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2387}
2388
Dan Gohmanc2853072015-09-03 22:51:53 +00002389static void getWebAssemblyTargetFeatures(const ArgList &Args,
2390 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002391 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002392}
2393
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002394static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002395 const ArgList &Args, ArgStringList &CmdArgs,
2396 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002397 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002398 std::vector<const char *> Features;
2399 switch (Triple.getArch()) {
2400 default:
2401 break;
2402 case llvm::Triple::mips:
2403 case llvm::Triple::mipsel:
2404 case llvm::Triple::mips64:
2405 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002406 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002407 break;
2408
2409 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002410 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002411 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002412 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002413 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002414 break;
2415
2416 case llvm::Triple::ppc:
2417 case llvm::Triple::ppc64:
2418 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002419 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002420 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002421 case llvm::Triple::systemz:
2422 getSystemZTargetFeatures(Args, Features);
2423 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002424 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002425 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002426 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002427 break;
2428 case llvm::Triple::x86:
2429 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002430 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002431 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002432 case llvm::Triple::hexagon:
2433 getHexagonTargetFeatures(Args, Features);
2434 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002435 case llvm::Triple::wasm32:
2436 case llvm::Triple::wasm64:
2437 getWebAssemblyTargetFeatures(Args, Features);
2438 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002439 }
Rafael Espindola43964802013-08-21 17:34:32 +00002440
2441 // Find the last of each feature.
2442 llvm::StringMap<unsigned> LastOpt;
2443 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2444 const char *Name = Features[I];
2445 assert(Name[0] == '-' || Name[0] == '+');
2446 LastOpt[Name + 1] = I;
2447 }
2448
2449 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2450 // If this feature was overridden, ignore it.
2451 const char *Name = Features[I];
2452 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2453 assert(LastI != LastOpt.end());
2454 unsigned Last = LastI->second;
2455 if (Last != I)
2456 continue;
2457
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002458 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002459 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002460 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002461}
2462
David Majnemerae394812014-12-09 00:12:30 +00002463static bool
2464shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2465 const llvm::Triple &Triple) {
2466 // We use the zero-cost exception tables for Objective-C if the non-fragile
2467 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2468 // later.
2469 if (runtime.isNonFragile())
2470 return true;
2471
2472 if (!Triple.isMacOSX())
2473 return false;
2474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002476 (Triple.getArch() == llvm::Triple::x86_64 ||
2477 Triple.getArch() == llvm::Triple::arm));
2478}
2479
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002480/// Adds exception related arguments to the driver command arguments. There's a
2481/// master flag, -fexceptions and also language specific flags to enable/disable
2482/// C++ and Objective-C exceptions. This makes it possible to for example
2483/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002484static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002485 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002486 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002487 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002488 const Driver &D = TC.getDriver();
2489 const llvm::Triple &Triple = TC.getTriple();
2490
Chad Rosier4fab82c2012-03-26 22:04:46 +00002491 if (KernelOrKext) {
2492 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2493 // arguments now to avoid warnings about unused arguments.
2494 Args.ClaimAllArgs(options::OPT_fexceptions);
2495 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2496 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2497 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2498 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2499 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002500 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002501 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002502
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002503 // See if the user explicitly enabled exceptions.
2504 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2505 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002506
David Majnemerae394812014-12-09 00:12:30 +00002507 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2508 // is not necessarily sensible, but follows GCC.
2509 if (types::isObjC(InputType) &&
2510 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002511 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002512 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002513
David Majnemerae394812014-12-09 00:12:30 +00002514 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002515 }
2516
2517 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002518 // Disable C++ EH by default on XCore and PS4.
2519 bool CXXExceptionsEnabled =
2520 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002521 Arg *ExceptionArg = Args.getLastArg(
2522 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2523 options::OPT_fexceptions, options::OPT_fno_exceptions);
2524 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002525 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002526 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2527 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002528
2529 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002530 if (Triple.isPS4CPU()) {
2531 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2532 assert(ExceptionArg &&
2533 "On the PS4 exceptions should only be enabled if passing "
2534 "an argument");
2535 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2536 const Arg *RTTIArg = TC.getRTTIArg();
2537 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2538 D.Diag(diag::err_drv_argument_not_allowed_with)
2539 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2540 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2541 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2542 } else
2543 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2544
Anders Carlssone96ab552011-02-28 02:27:16 +00002545 CmdArgs.push_back("-fcxx-exceptions");
2546
David Majnemer8de68642014-12-05 08:11:58 +00002547 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002548 }
2549 }
2550
David Majnemer8de68642014-12-05 08:11:58 +00002551 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002552 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002553}
2554
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002555static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002556 bool Default = true;
2557 if (TC.getTriple().isOSDarwin()) {
2558 // The native darwin assembler doesn't support the linker_option directives,
2559 // so we disable them if we think the .s file will be passed to it.
2560 Default = TC.useIntegratedAs();
2561 }
2562 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2563 Default);
2564}
2565
Ted Kremenek62093662013-03-12 17:02:12 +00002566static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2567 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002568 bool UseDwarfDirectory =
2569 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2570 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002571 return !UseDwarfDirectory;
2572}
2573
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002574/// \brief Check whether the given input tree contains any compilation actions.
2575static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002576 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002577 return true;
2578
Nico Weber5a459f82016-02-23 19:30:43 +00002579 for (const auto &AI : A->inputs())
2580 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002581 return true;
2582
2583 return false;
2584}
2585
2586/// \brief Check if -relax-all should be passed to the internal assembler.
2587/// This is done by default when compiling non-assembler source with -O0.
2588static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2589 bool RelaxDefault = true;
2590
2591 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2592 RelaxDefault = A->getOption().matches(options::OPT_O0);
2593
2594 if (RelaxDefault) {
2595 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002596 for (const auto &Act : C.getActions()) {
2597 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002598 RelaxDefault = true;
2599 break;
2600 }
2601 }
2602 }
2603
2604 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002605 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002606}
2607
Paul Robinson0334a042015-12-19 19:41:48 +00002608// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2609// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002610static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002611 assert(A.getOption().matches(options::OPT_gN_Group) &&
2612 "Not a -g option that specifies a debug-info level");
2613 if (A.getOption().matches(options::OPT_g0) ||
2614 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002615 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002616 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2617 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002618 return codegenoptions::DebugLineTablesOnly;
2619 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002620}
2621
Douglas Katzman3459ce22015-10-08 04:24:12 +00002622// Extract the integer N from a string spelled "-dwarf-N", returning 0
2623// on mismatch. The StringRef input (rather than an Arg) allows
2624// for use by the "-Xassembler" option parser.
2625static unsigned DwarfVersionNum(StringRef ArgValue) {
2626 return llvm::StringSwitch<unsigned>(ArgValue)
2627 .Case("-gdwarf-2", 2)
2628 .Case("-gdwarf-3", 3)
2629 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002630 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002631 .Default(0);
2632}
2633
2634static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002635 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002636 unsigned DwarfVersion,
2637 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002638 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002639 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002640 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2641 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002642 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002643 CmdArgs.push_back("-debug-info-kind=limited");
2644 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002645 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002646 CmdArgs.push_back("-debug-info-kind=standalone");
2647 break;
2648 default:
2649 break;
2650 }
2651 if (DwarfVersion > 0)
2652 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002653 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002654 switch (DebuggerTuning) {
2655 case llvm::DebuggerKind::GDB:
2656 CmdArgs.push_back("-debugger-tuning=gdb");
2657 break;
2658 case llvm::DebuggerKind::LLDB:
2659 CmdArgs.push_back("-debugger-tuning=lldb");
2660 break;
2661 case llvm::DebuggerKind::SCE:
2662 CmdArgs.push_back("-debugger-tuning=sce");
2663 break;
2664 default:
2665 break;
2666 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002667}
2668
David Blaikie9260ed62013-07-25 21:19:01 +00002669static void CollectArgsForIntegratedAssembler(Compilation &C,
2670 const ArgList &Args,
2671 ArgStringList &CmdArgs,
2672 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002673 if (UseRelaxAll(C, Args))
2674 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002675
David Majnemer2b9349d2015-12-21 22:09:34 +00002676 // Only default to -mincremental-linker-compatible if we think we are
2677 // targeting the MSVC linker.
2678 bool DefaultIncrementalLinkerCompatible =
2679 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2680 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2681 options::OPT_mno_incremental_linker_compatible,
2682 DefaultIncrementalLinkerCompatible))
2683 CmdArgs.push_back("-mincremental-linker-compatible");
2684
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002685 // When passing -I arguments to the assembler we sometimes need to
2686 // unconditionally take the next argument. For example, when parsing
2687 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2688 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2689 // arg after parsing the '-I' arg.
2690 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002691
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002692 // When using an integrated assembler, translate -Wa, and -Xassembler
2693 // options.
2694 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002695 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002696 for (const Arg *A :
2697 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2698 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002699
Benjamin Kramer72e64312015-09-24 14:48:49 +00002700 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002701 if (TakeNextArg) {
2702 CmdArgs.push_back(Value.data());
2703 TakeNextArg = false;
2704 continue;
2705 }
David Blaikie9260ed62013-07-25 21:19:01 +00002706
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002707 switch (C.getDefaultToolChain().getArch()) {
2708 default:
2709 break;
2710 case llvm::Triple::mips:
2711 case llvm::Triple::mipsel:
2712 case llvm::Triple::mips64:
2713 case llvm::Triple::mips64el:
2714 if (Value == "--trap") {
2715 CmdArgs.push_back("-target-feature");
2716 CmdArgs.push_back("+use-tcc-in-div");
2717 continue;
2718 }
2719 if (Value == "--break") {
2720 CmdArgs.push_back("-target-feature");
2721 CmdArgs.push_back("-use-tcc-in-div");
2722 continue;
2723 }
2724 if (Value.startswith("-msoft-float")) {
2725 CmdArgs.push_back("-target-feature");
2726 CmdArgs.push_back("+soft-float");
2727 continue;
2728 }
2729 if (Value.startswith("-mhard-float")) {
2730 CmdArgs.push_back("-target-feature");
2731 CmdArgs.push_back("-soft-float");
2732 continue;
2733 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002734
2735 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2736 .Case("-mips1", "+mips1")
2737 .Case("-mips2", "+mips2")
2738 .Case("-mips3", "+mips3")
2739 .Case("-mips4", "+mips4")
2740 .Case("-mips5", "+mips5")
2741 .Case("-mips32", "+mips32")
2742 .Case("-mips32r2", "+mips32r2")
2743 .Case("-mips32r3", "+mips32r3")
2744 .Case("-mips32r5", "+mips32r5")
2745 .Case("-mips32r6", "+mips32r6")
2746 .Case("-mips64", "+mips64")
2747 .Case("-mips64r2", "+mips64r2")
2748 .Case("-mips64r3", "+mips64r3")
2749 .Case("-mips64r5", "+mips64r5")
2750 .Case("-mips64r6", "+mips64r6")
2751 .Default(nullptr);
2752 if (MipsTargetFeature)
2753 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002754 }
2755
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002756 if (Value == "-force_cpusubtype_ALL") {
2757 // Do nothing, this is the default and we don't support anything else.
2758 } else if (Value == "-L") {
2759 CmdArgs.push_back("-msave-temp-labels");
2760 } else if (Value == "--fatal-warnings") {
2761 CmdArgs.push_back("-massembler-fatal-warnings");
2762 } else if (Value == "--noexecstack") {
2763 CmdArgs.push_back("-mnoexecstack");
2764 } else if (Value == "-compress-debug-sections" ||
2765 Value == "--compress-debug-sections") {
2766 CompressDebugSections = true;
2767 } else if (Value == "-nocompress-debug-sections" ||
2768 Value == "--nocompress-debug-sections") {
2769 CompressDebugSections = false;
2770 } else if (Value.startswith("-I")) {
2771 CmdArgs.push_back(Value.data());
2772 // We need to consume the next argument if the current arg is a plain
2773 // -I. The next arg will be the include directory.
2774 if (Value == "-I")
2775 TakeNextArg = true;
2776 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002777 // "-gdwarf-N" options are not cc1as options.
2778 unsigned DwarfVersion = DwarfVersionNum(Value);
2779 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2780 CmdArgs.push_back(Value.data());
2781 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002782 RenderDebugEnablingArgs(Args, CmdArgs,
2783 codegenoptions::LimitedDebugInfo,
2784 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002785 }
Renato Golin7c542b42015-07-27 23:44:45 +00002786 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2787 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2788 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002789 } else {
2790 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002791 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002792 }
2793 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002794 }
2795 if (CompressDebugSections) {
2796 if (llvm::zlib::isAvailable())
2797 CmdArgs.push_back("-compress-debug-sections");
2798 else
2799 D.Diag(diag::warn_debug_compression_unavailable);
2800 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002801 if (MipsTargetFeature != nullptr) {
2802 CmdArgs.push_back("-target-feature");
2803 CmdArgs.push_back(MipsTargetFeature);
2804 }
David Blaikie9260ed62013-07-25 21:19:01 +00002805}
2806
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002807// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002808// FIXME: Make sure we can also emit shared objects if they're requested
2809// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002810static void addClangRT(const ToolChain &TC, const ArgList &Args,
2811 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002812 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002813}
2814
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002815namespace {
2816enum OpenMPRuntimeKind {
2817 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2818 /// without knowing what runtime to target.
2819 OMPRT_Unknown,
2820
2821 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2822 /// the default for Clang.
2823 OMPRT_OMP,
2824
2825 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2826 /// this runtime but can swallow the pragmas, and find and link against the
2827 /// runtime library itself.
2828 OMPRT_GOMP,
2829
Chandler Carruthc6625c62015-05-28 21:10:31 +00002830 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002831 /// OpenMP runtime. We support this mode for users with existing dependencies
2832 /// on this runtime library name.
2833 OMPRT_IOMP5
2834};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002835}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002836
2837/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002838static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2839 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002840 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2841
2842 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2843 if (A)
2844 RuntimeName = A->getValue();
2845
2846 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002847 .Case("libomp", OMPRT_OMP)
2848 .Case("libgomp", OMPRT_GOMP)
2849 .Case("libiomp5", OMPRT_IOMP5)
2850 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002851
2852 if (RT == OMPRT_Unknown) {
2853 if (A)
2854 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002855 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002856 else
2857 // FIXME: We could use a nicer diagnostic here.
2858 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2859 }
2860
2861 return RT;
2862}
2863
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002864static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2865 const ArgList &Args) {
2866 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2867 options::OPT_fno_openmp, false))
2868 return;
2869
2870 switch (getOpenMPRuntime(TC, Args)) {
2871 case OMPRT_OMP:
2872 CmdArgs.push_back("-lomp");
2873 break;
2874 case OMPRT_GOMP:
2875 CmdArgs.push_back("-lgomp");
2876 break;
2877 case OMPRT_IOMP5:
2878 CmdArgs.push_back("-liomp5");
2879 break;
2880 case OMPRT_Unknown:
2881 // Already diagnosed.
2882 break;
2883 }
2884}
2885
Alexey Samsonov52550342014-09-15 19:58:40 +00002886static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2887 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002888 bool IsShared, bool IsWhole) {
2889 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002890 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002891 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002892 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002893 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002894}
2895
Alexey Samsonov52550342014-09-15 19:58:40 +00002896// Tries to use a file with the list of dynamic symbols that need to be exported
2897// from the runtime library. Returns true if the file was found.
2898static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2899 ArgStringList &CmdArgs,
2900 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002901 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002902 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2903 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002904 return true;
2905 }
2906 return false;
2907}
2908
2909static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2910 ArgStringList &CmdArgs) {
2911 // Force linking against the system libraries sanitizers depends on
2912 // (see PR15823 why this is necessary).
2913 CmdArgs.push_back("--no-as-needed");
2914 CmdArgs.push_back("-lpthread");
2915 CmdArgs.push_back("-lrt");
2916 CmdArgs.push_back("-lm");
2917 // There's no libdl on FreeBSD.
2918 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2919 CmdArgs.push_back("-ldl");
2920}
2921
2922static void
2923collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2924 SmallVectorImpl<StringRef> &SharedRuntimes,
2925 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002926 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2927 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2928 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002929 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2930 // Collect shared runtimes.
2931 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2932 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002933 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002934 // The stats_client library is also statically linked into DSOs.
2935 if (SanArgs.needsStatsRt())
2936 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002937
Alexey Samsonov52550342014-09-15 19:58:40 +00002938 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002939 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002940 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002941 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002942 }
2943 if (SanArgs.needsAsanRt()) {
2944 if (SanArgs.needsSharedAsanRt()) {
2945 HelperStaticRuntimes.push_back("asan-preinit");
2946 } else {
2947 StaticRuntimes.push_back("asan");
2948 if (SanArgs.linkCXXRuntimes())
2949 StaticRuntimes.push_back("asan_cxx");
2950 }
2951 }
2952 if (SanArgs.needsDfsanRt())
2953 StaticRuntimes.push_back("dfsan");
2954 if (SanArgs.needsLsanRt())
2955 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002956 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002957 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002958 if (SanArgs.linkCXXRuntimes())
2959 StaticRuntimes.push_back("msan_cxx");
2960 }
2961 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002962 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002963 if (SanArgs.linkCXXRuntimes())
2964 StaticRuntimes.push_back("tsan_cxx");
2965 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002966 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002967 StaticRuntimes.push_back("ubsan_standalone");
2968 if (SanArgs.linkCXXRuntimes())
2969 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002970 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002971 if (SanArgs.needsSafeStackRt())
2972 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002973 if (SanArgs.needsCfiRt())
2974 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002975 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002976 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002977 if (SanArgs.linkCXXRuntimes())
2978 StaticRuntimes.push_back("ubsan_standalone_cxx");
2979 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002980 if (SanArgs.needsStatsRt()) {
2981 NonWholeStaticRuntimes.push_back("stats");
2982 RequiredSymbols.push_back("__sanitizer_stats_register");
2983 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002984}
2985
Alexey Samsonov52550342014-09-15 19:58:40 +00002986// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2987// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2988static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002989 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002990 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002991 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002992 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002993 NonWholeStaticRuntimes, HelperStaticRuntimes,
2994 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002995 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002996 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002997 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002998 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002999 bool AddExportDynamic = false;
3000 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003001 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003002 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3003 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003004 for (auto RT : NonWholeStaticRuntimes) {
3005 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3006 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3007 }
3008 for (auto S : RequiredSymbols) {
3009 CmdArgs.push_back("-u");
3010 CmdArgs.push_back(Args.MakeArgString(S));
3011 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003012 // If there is a static runtime with no dynamic list, force all the symbols
3013 // to be dynamic to be sure we export sanitizer interface functions.
3014 if (AddExportDynamic)
3015 CmdArgs.push_back("-export-dynamic");
3016 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003017}
3018
Reid Kleckner86ea7702015-02-04 23:45:07 +00003019static bool areOptimizationsEnabled(const ArgList &Args) {
3020 // Find the last -O arg and see if it is non-zero.
3021 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3022 return !A->getOption().matches(options::OPT_O0);
3023 // Defaults to -O0.
3024 return false;
3025}
3026
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003027static bool shouldUseFramePointerForTarget(const ArgList &Args,
3028 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003029 switch (Triple.getArch()) {
3030 case llvm::Triple::xcore:
3031 case llvm::Triple::wasm32:
3032 case llvm::Triple::wasm64:
3033 // XCore never wants frame pointers, regardless of OS.
3034 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003035 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003036 default:
3037 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003038 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003039
3040 if (Triple.isOSLinux()) {
3041 switch (Triple.getArch()) {
3042 // Don't use a frame pointer on linux if optimizing for certain targets.
3043 case llvm::Triple::mips64:
3044 case llvm::Triple::mips64el:
3045 case llvm::Triple::mips:
3046 case llvm::Triple::mipsel:
3047 case llvm::Triple::systemz:
3048 case llvm::Triple::x86:
3049 case llvm::Triple::x86_64:
3050 return !areOptimizationsEnabled(Args);
3051 default:
3052 return true;
3053 }
3054 }
3055
3056 if (Triple.isOSWindows()) {
3057 switch (Triple.getArch()) {
3058 case llvm::Triple::x86:
3059 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003060 case llvm::Triple::x86_64:
3061 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003062 case llvm::Triple::arm:
3063 case llvm::Triple::thumb:
3064 // Windows on ARM builds with FPO disabled to aid fast stack walking
3065 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003066 default:
3067 // All other supported Windows ISAs use xdata unwind information, so frame
3068 // pointers are not generally useful.
3069 return false;
3070 }
3071 }
3072
3073 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003074}
3075
Rafael Espindola224dd632011-12-14 21:02:23 +00003076static bool shouldUseFramePointer(const ArgList &Args,
3077 const llvm::Triple &Triple) {
3078 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3079 options::OPT_fomit_frame_pointer))
3080 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003081 if (Args.hasArg(options::OPT_pg))
3082 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003083
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003084 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003085}
3086
Eric Christopherb7d97e92013-04-03 01:58:53 +00003087static bool shouldUseLeafFramePointer(const ArgList &Args,
3088 const llvm::Triple &Triple) {
3089 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3090 options::OPT_momit_leaf_frame_pointer))
3091 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003092 if (Args.hasArg(options::OPT_pg))
3093 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003094
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003095 if (Triple.isPS4CPU())
3096 return false;
3097
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003098 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003099}
3100
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003101/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003102static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003103 SmallString<128> cwd;
3104 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003105 CmdArgs.push_back("-fdebug-compilation-dir");
3106 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003107 }
3108}
3109
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003110static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003111 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3112 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3113 SmallString<128> T(FinalOutput->getValue());
3114 llvm::sys::path::replace_extension(T, "dwo");
3115 return Args.MakeArgString(T);
3116 } else {
3117 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003118 SmallString<128> T(
3119 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003120 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003121 llvm::sys::path::replace_extension(F, "dwo");
3122 T += F;
3123 return Args.MakeArgString(F);
3124 }
3125}
3126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003127static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3128 const JobAction &JA, const ArgList &Args,
3129 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003130 ArgStringList ExtractArgs;
3131 ExtractArgs.push_back("--extract-dwo");
3132
3133 ArgStringList StripArgs;
3134 StripArgs.push_back("--strip-dwo");
3135
3136 // Grabbing the output of the earlier compile step.
3137 StripArgs.push_back(Output.getFilename());
3138 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003139 ExtractArgs.push_back(OutFile);
3140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003141 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003142 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003143
3144 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003145 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003146
3147 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003148 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003149}
3150
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003151/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003152/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3153static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003154 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003155 if (A->getOption().matches(options::OPT_O4) ||
3156 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003157 return true;
3158
3159 if (A->getOption().matches(options::OPT_O0))
3160 return false;
3161
3162 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3163
Rafael Espindola91780de2013-08-26 14:05:41 +00003164 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003165 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003166 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003167 return true;
3168
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003169 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003170 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003171 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003172
3173 unsigned OptLevel = 0;
3174 if (S.getAsInteger(10, OptLevel))
3175 return false;
3176
3177 return OptLevel > 1;
3178 }
3179
3180 return false;
3181}
3182
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003183/// Add -x lang to \p CmdArgs for \p Input.
3184static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3185 ArgStringList &CmdArgs) {
3186 // When using -verify-pch, we don't want to provide the type
3187 // 'precompiled-header' if it was inferred from the file extension
3188 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3189 return;
3190
3191 CmdArgs.push_back("-x");
3192 if (Args.hasArg(options::OPT_rewrite_objc))
3193 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3194 else
3195 CmdArgs.push_back(types::getTypeName(Input.getType()));
3196}
3197
David Majnemerc371ff02015-03-22 08:39:22 +00003198static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003199 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003200 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003201
3202 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003203 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003204
3205 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003207 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003208 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003209}
3210
Rafael Espindola577637a2015-01-03 00:06:04 +00003211// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003212// options that build systems might add but are unused when assembling or only
3213// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003214static void claimNoWarnArgs(const ArgList &Args) {
3215 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003216 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003217 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003218 Args.ClaimAllArgs(options::OPT_flto);
3219 Args.ClaimAllArgs(options::OPT_fno_lto);
3220}
3221
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003222static void appendUserToPath(SmallVectorImpl<char> &Result) {
3223#ifdef LLVM_ON_UNIX
3224 const char *Username = getenv("LOGNAME");
3225#else
3226 const char *Username = getenv("USERNAME");
3227#endif
3228 if (Username) {
3229 // Validate that LoginName can be used in a path, and get its length.
3230 size_t Len = 0;
3231 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003232 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003233 Username = nullptr;
3234 break;
3235 }
3236 }
3237
3238 if (Username && Len > 0) {
3239 Result.append(Username, Username + Len);
3240 return;
3241 }
3242 }
3243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003244// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003245#ifdef LLVM_ON_UNIX
3246 std::string UID = llvm::utostr(getuid());
3247#else
3248 // FIXME: Windows seems to have an 'SID' that might work.
3249 std::string UID = "9999";
3250#endif
3251 Result.append(UID.begin(), UID.end());
3252}
3253
David Majnemere11d3732015-06-08 00:22:46 +00003254VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3255 const llvm::Triple &Triple,
3256 const llvm::opt::ArgList &Args,
3257 bool IsWindowsMSVC) {
3258 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3259 IsWindowsMSVC) ||
3260 Args.hasArg(options::OPT_fmsc_version) ||
3261 Args.hasArg(options::OPT_fms_compatibility_version)) {
3262 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3263 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003264 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003265
3266 if (MSCVersion && MSCompatibilityVersion) {
3267 if (D)
3268 D->Diag(diag::err_drv_argument_not_allowed_with)
3269 << MSCVersion->getAsString(Args)
3270 << MSCompatibilityVersion->getAsString(Args);
3271 return VersionTuple();
3272 }
3273
3274 if (MSCompatibilityVersion) {
3275 VersionTuple MSVT;
3276 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3277 D->Diag(diag::err_drv_invalid_value)
3278 << MSCompatibilityVersion->getAsString(Args)
3279 << MSCompatibilityVersion->getValue();
3280 return MSVT;
3281 }
3282
3283 if (MSCVersion) {
3284 unsigned Version = 0;
3285 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3286 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3287 << MSCVersion->getValue();
3288 return getMSCompatibilityVersion(Version);
3289 }
3290
3291 unsigned Major, Minor, Micro;
3292 Triple.getEnvironmentVersion(Major, Minor, Micro);
3293 if (Major || Minor || Micro)
3294 return VersionTuple(Major, Minor, Micro);
3295
Nico Weber9a952752016-03-23 23:26:59 +00003296 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003297 return VersionTuple(18);
3298 }
3299 return VersionTuple();
3300}
3301
Diego Novilloa0545962015-07-10 18:00:07 +00003302static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3303 const InputInfo &Output, const ArgList &Args,
3304 ArgStringList &CmdArgs) {
3305 auto *ProfileGenerateArg = Args.getLastArg(
3306 options::OPT_fprofile_instr_generate,
3307 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003308 options::OPT_fprofile_generate_EQ,
3309 options::OPT_fno_profile_instr_generate);
3310 if (ProfileGenerateArg &&
3311 ProfileGenerateArg->getOption().matches(
3312 options::OPT_fno_profile_instr_generate))
3313 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003314
3315 auto *ProfileUseArg = Args.getLastArg(
3316 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003317 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3318 options::OPT_fno_profile_instr_use);
3319 if (ProfileUseArg &&
3320 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3321 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003322
3323 if (ProfileGenerateArg && ProfileUseArg)
3324 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003325 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003326
Diego Novillo758f3f52015-08-05 21:49:51 +00003327 if (ProfileGenerateArg) {
3328 if (ProfileGenerateArg->getOption().matches(
3329 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003330 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3331 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003332 else if (ProfileGenerateArg->getOption().matches(
3333 options::OPT_fprofile_generate_EQ)) {
3334 SmallString<128> Path(ProfileGenerateArg->getValue());
3335 llvm::sys::path::append(Path, "default.profraw");
3336 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003337 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3338 }
3339 // The default is to use Clang Instrumentation.
3340 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003341 }
Diego Novilloa0545962015-07-10 18:00:07 +00003342
Diego Novillo758f3f52015-08-05 21:49:51 +00003343 if (ProfileUseArg) {
3344 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003345 CmdArgs.push_back(Args.MakeArgString(
3346 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003347 else if ((ProfileUseArg->getOption().matches(
3348 options::OPT_fprofile_use_EQ) ||
3349 ProfileUseArg->getOption().matches(
3350 options::OPT_fprofile_instr_use))) {
3351 SmallString<128> Path(
3352 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3353 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3354 llvm::sys::path::append(Path, "default.profdata");
3355 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003356 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003357 }
Diego Novilloa0545962015-07-10 18:00:07 +00003358 }
3359
3360 if (Args.hasArg(options::OPT_ftest_coverage) ||
3361 Args.hasArg(options::OPT_coverage))
3362 CmdArgs.push_back("-femit-coverage-notes");
3363 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3364 false) ||
3365 Args.hasArg(options::OPT_coverage))
3366 CmdArgs.push_back("-femit-coverage-data");
3367
Diego Novilloc4b94da2015-08-05 23:27:40 +00003368 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3369 options::OPT_fno_coverage_mapping, false) &&
3370 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003371 D.Diag(diag::err_drv_argument_only_allowed_with)
3372 << "-fcoverage-mapping"
3373 << "-fprofile-instr-generate";
3374
Diego Novilloc4b94da2015-08-05 23:27:40 +00003375 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3376 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003377 CmdArgs.push_back("-fcoverage-mapping");
3378
3379 if (C.getArgs().hasArg(options::OPT_c) ||
3380 C.getArgs().hasArg(options::OPT_S)) {
3381 if (Output.isFilename()) {
3382 CmdArgs.push_back("-coverage-file");
3383 SmallString<128> CoverageFilename;
3384 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3385 CoverageFilename = FinalOutput->getValue();
3386 } else {
3387 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3388 }
3389 if (llvm::sys::path::is_relative(CoverageFilename)) {
3390 SmallString<128> Pwd;
3391 if (!llvm::sys::fs::current_path(Pwd)) {
3392 llvm::sys::path::append(Pwd, CoverageFilename);
3393 CoverageFilename.swap(Pwd);
3394 }
3395 }
3396 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3397 }
3398 }
3399}
3400
Paul Robinsond083b9a2015-12-16 17:25:27 +00003401static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3402 ArgStringList &CmdArgs) {
3403 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3404 false) ||
3405 Args.hasFlag(options::OPT_fprofile_generate,
3406 options::OPT_fno_profile_instr_generate, false) ||
3407 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3408 options::OPT_fno_profile_instr_generate, false) ||
3409 Args.hasFlag(options::OPT_fprofile_instr_generate,
3410 options::OPT_fno_profile_instr_generate, false) ||
3411 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3412 options::OPT_fno_profile_instr_generate, false) ||
3413 Args.hasArg(options::OPT_fcreate_profile) ||
3414 Args.hasArg(options::OPT_coverage)))
3415 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3416}
3417
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003418/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3419/// smooshes them together with platform defaults, to decide whether
3420/// this compile should be using PIC mode or not. Returns a tuple of
3421/// (RelocationModel, PICLevel, IsPIE).
3422static std::tuple<llvm::Reloc::Model, unsigned, bool>
3423ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3424 const ArgList &Args) {
3425 // FIXME: why does this code...and so much everywhere else, use both
3426 // ToolChain.getTriple() and Triple?
3427 bool PIE = ToolChain.isPIEDefault();
3428 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003429 // The Darwin/MachO default to use PIC does not apply when using -static.
3430 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3431 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003432 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003433 bool IsPICLevelTwo = PIC;
3434
3435 bool KernelOrKext =
3436 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3437
3438 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003439 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003440 switch (ToolChain.getArch()) {
3441 case llvm::Triple::arm:
3442 case llvm::Triple::armeb:
3443 case llvm::Triple::thumb:
3444 case llvm::Triple::thumbeb:
3445 case llvm::Triple::aarch64:
3446 case llvm::Triple::mips:
3447 case llvm::Triple::mipsel:
3448 case llvm::Triple::mips64:
3449 case llvm::Triple::mips64el:
3450 PIC = true; // "-fpic"
3451 break;
3452
3453 case llvm::Triple::x86:
3454 case llvm::Triple::x86_64:
3455 PIC = true; // "-fPIC"
3456 IsPICLevelTwo = true;
3457 break;
3458
3459 default:
3460 break;
3461 }
3462 }
3463
3464 // OpenBSD-specific defaults for PIE
3465 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3466 switch (ToolChain.getArch()) {
3467 case llvm::Triple::mips64:
3468 case llvm::Triple::mips64el:
3469 case llvm::Triple::sparcel:
3470 case llvm::Triple::x86:
3471 case llvm::Triple::x86_64:
3472 IsPICLevelTwo = false; // "-fpie"
3473 break;
3474
3475 case llvm::Triple::ppc:
3476 case llvm::Triple::sparc:
3477 case llvm::Triple::sparcv9:
3478 IsPICLevelTwo = true; // "-fPIE"
3479 break;
3480
3481 default:
3482 break;
3483 }
3484 }
3485
3486 // The last argument relating to either PIC or PIE wins, and no
3487 // other argument is used. If the last argument is any flavor of the
3488 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3489 // option implicitly enables PIC at the same level.
3490 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3491 options::OPT_fpic, options::OPT_fno_pic,
3492 options::OPT_fPIE, options::OPT_fno_PIE,
3493 options::OPT_fpie, options::OPT_fno_pie);
3494 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3495 // is forced, then neither PIC nor PIE flags will have no effect.
3496 if (!ToolChain.isPICDefaultForced()) {
3497 if (LastPICArg) {
3498 Option O = LastPICArg->getOption();
3499 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3500 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3501 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3502 PIC =
3503 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3504 IsPICLevelTwo =
3505 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3506 } else {
3507 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003508 if (Triple.isPS4CPU()) {
3509 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3510 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3511 if (Model != "kernel") {
3512 PIC = true;
3513 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3514 << LastPICArg->getSpelling();
3515 }
3516 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003517 }
3518 }
3519 }
3520
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003521 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3522 // PIC level would've been set to level 1, force it back to level 2 PIC
3523 // instead.
3524 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003525 IsPICLevelTwo |= ToolChain.isPICDefault();
3526
James Y Knightc4015d32015-08-21 04:14:55 +00003527 // This kernel flags are a trump-card: they will disable PIC/PIE
3528 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003529 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3530 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003531 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003532
3533 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3534 // This is a very special mode. It trumps the other modes, almost no one
3535 // uses it, and it isn't even valid on any OS but Darwin.
3536 if (!ToolChain.getTriple().isOSDarwin())
3537 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3538 << A->getSpelling() << ToolChain.getTriple().str();
3539
3540 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3541
3542 // Only a forced PIC mode can cause the actual compile to have PIC defines
3543 // etc., no flags are sufficient. This behavior was selected to closely
3544 // match that of llvm-gcc and Apple GCC before that.
3545 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3546
3547 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3548 }
3549
3550 if (PIC)
3551 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3552
3553 return std::make_tuple(llvm::Reloc::Static, 0, false);
3554}
3555
3556static const char *RelocationModelName(llvm::Reloc::Model Model) {
3557 switch (Model) {
3558 case llvm::Reloc::Default:
3559 return nullptr;
3560 case llvm::Reloc::Static:
3561 return "static";
3562 case llvm::Reloc::PIC_:
3563 return "pic";
3564 case llvm::Reloc::DynamicNoPIC:
3565 return "dynamic-no-pic";
3566 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003567 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003568}
3569
3570static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3571 ArgStringList &CmdArgs) {
3572 llvm::Reloc::Model RelocationModel;
3573 unsigned PICLevel;
3574 bool IsPIE;
3575 std::tie(RelocationModel, PICLevel, IsPIE) =
3576 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3577
3578 if (RelocationModel != llvm::Reloc::Static)
3579 CmdArgs.push_back("-KPIC");
3580}
3581
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003582void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003583 const InputInfo &Output, const InputInfoList &Inputs,
3584 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003585 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3586 const llvm::Triple Triple(TripleStr);
3587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003588 bool KernelOrKext =
3589 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003590 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003591 ArgStringList CmdArgs;
3592
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003593 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003594 bool IsWindowsCygnus =
3595 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003596 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003597 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003598
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003599 // Check number of inputs for sanity. We need at least one input.
3600 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003601 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003602 // CUDA compilation may have multiple inputs (source file + results of
3603 // device-side compilations). All other jobs are expected to have exactly one
3604 // input.
3605 bool IsCuda = types::isCuda(Input.getType());
3606 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003607
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003608 // Invoke ourselves in -cc1 mode.
3609 //
3610 // FIXME: Implement custom jobs for internal actions.
3611 CmdArgs.push_back("-cc1");
3612
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003613 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003614 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003615 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003616
Artem Belevichfa11ab52015-11-17 22:28:46 +00003617 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003618 if (IsCuda) {
3619 // FIXME: We need a (better) way to pass information about
3620 // particular compilation pass we're constructing here. For now we
3621 // can check which toolchain we're using and pick the other one to
3622 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003623 if (&getToolChain() == C.getCudaDeviceToolChain())
3624 AuxToolChain = C.getCudaHostToolChain();
3625 else if (&getToolChain() == C.getCudaHostToolChain())
3626 AuxToolChain = C.getCudaDeviceToolChain();
3627 else
3628 llvm_unreachable("Can't figure out CUDA compilation mode.");
3629 assert(AuxToolChain != nullptr && "No aux toolchain.");
3630 CmdArgs.push_back("-aux-triple");
3631 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3632 }
3633
James Y Knight2db38f32015-08-15 03:45:25 +00003634 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3635 Triple.getArch() == llvm::Triple::thumb)) {
3636 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003637 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003638 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003639 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003640 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003641 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003642 }
3643
Tim Northover336f1892014-03-29 13:16:12 +00003644 // Push all default warning arguments that are specific to
3645 // the given target. These come before user provided warning options
3646 // are provided.
3647 getToolChain().addClangWarningOptions(CmdArgs);
3648
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003649 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003650 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003651
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003652 if (isa<AnalyzeJobAction>(JA)) {
3653 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3654 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003655 } else if (isa<MigrateJobAction>(JA)) {
3656 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003657 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003658 if (Output.getType() == types::TY_Dependencies)
3659 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003660 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003661 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003662 if (Args.hasArg(options::OPT_rewrite_objc) &&
3663 !Args.hasArg(options::OPT_g_Group))
3664 CmdArgs.push_back("-P");
3665 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003666 } else if (isa<AssembleJobAction>(JA)) {
3667 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003668
David Blaikie9260ed62013-07-25 21:19:01 +00003669 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003670
3671 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003672 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003673 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003674 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003675 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003676
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003677 if (JA.getType() == types::TY_Nothing)
3678 CmdArgs.push_back("-fsyntax-only");
3679 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003680 CmdArgs.push_back("-emit-pch");
3681 else
3682 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003683 } else if (isa<VerifyPCHJobAction>(JA)) {
3684 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003685 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003686 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3687 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003688 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003689 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003690 } else if (JA.getType() == types::TY_LLVM_IR ||
3691 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003692 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003693 } else if (JA.getType() == types::TY_LLVM_BC ||
3694 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003695 CmdArgs.push_back("-emit-llvm-bc");
3696 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003697 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003698 } else if (JA.getType() == types::TY_AST) {
3699 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003700 } else if (JA.getType() == types::TY_ModuleFile) {
3701 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003702 } else if (JA.getType() == types::TY_RewrittenObjC) {
3703 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003704 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003705 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3706 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003707 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003708 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003709 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003710 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003711
3712 // Preserve use-list order by default when emitting bitcode, so that
3713 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3714 // same result as running passes here. For LTO, we don't need to preserve
3715 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003716 if (JA.getType() == types::TY_LLVM_BC)
3717 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003718
3719 if (D.isUsingLTO())
3720 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003721 }
3722
Teresa Johnsonaff22322015-12-07 19:21:34 +00003723 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3724 if (!types::isLLVMIR(Input.getType()))
3725 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3726 << "-x ir";
3727 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3728 }
3729
Steven Wu574b0f22016-03-01 01:07:58 +00003730 // Embed-bitcode option.
3731 if (C.getDriver().embedBitcodeEnabled() &&
3732 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3733 // Add flags implied by -fembed-bitcode.
3734 CmdArgs.push_back("-fembed-bitcode");
3735 // Disable all llvm IR level optimizations.
3736 CmdArgs.push_back("-disable-llvm-optzns");
3737 }
3738 if (C.getDriver().embedBitcodeMarkerOnly())
3739 CmdArgs.push_back("-fembed-bitcode-marker");
3740
Justin Bognera88f0122014-06-20 22:59:50 +00003741 // We normally speed up the clang process a bit by skipping destructors at
3742 // exit, but when we're generating diagnostics we can rely on some of the
3743 // cleanup.
3744 if (!C.isForDiagnostics())
3745 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003746
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003747// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003748#ifdef NDEBUG
3749 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003750 // Discard LLVM value names in -asserts builds.
3751 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003752#endif
3753
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003754 // Set the main file name, so that debug info works even with
3755 // -save-temps.
3756 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003757 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003758
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003759 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003760 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003761 if (Args.hasArg(options::OPT_static))
3762 CmdArgs.push_back("-static-define");
3763
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003764 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003765 // Enable region store model by default.
3766 CmdArgs.push_back("-analyzer-store=region");
3767
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003768 // Treat blocks as analysis entry points.
3769 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3770
Ted Kremenek49c79792011-03-24 00:28:47 +00003771 CmdArgs.push_back("-analyzer-eagerly-assume");
3772
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003773 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003774 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003775 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003776
Devin Coughlin65c77082016-01-21 20:09:49 +00003777 if (!IsWindowsMSVC) {
3778 CmdArgs.push_back("-analyzer-checker=unix");
3779 } else {
3780 // Enable "unix" checkers that also work on Windows.
3781 CmdArgs.push_back("-analyzer-checker=unix.API");
3782 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3783 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3784 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3785 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3786 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3787 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003788
Sean Evesonb38c32b2016-01-06 10:03:58 +00003789 // Disable some unix checkers for PS4.
3790 if (IsPS4CPU) {
3791 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3792 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3793 }
3794
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003795 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003796 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003797
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003798 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003799
Artem Belevichba558952015-05-06 18:20:23 +00003800 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003801 CmdArgs.push_back("-analyzer-checker=cplusplus");
3802
Sean Evesonb38c32b2016-01-06 10:03:58 +00003803 if (!IsPS4CPU) {
3804 CmdArgs.push_back(
3805 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3806 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3807 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3808 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3809 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3810 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3811 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003812
3813 // Default nullability checks.
3814 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3815 CmdArgs.push_back(
3816 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003817 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003818
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003819 // Set the output format. The default is plist, for (lame) historical
3820 // reasons.
3821 CmdArgs.push_back("-analyzer-output");
3822 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003823 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003824 else
3825 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003826
Ted Kremenekfe449a22010-03-22 22:32:05 +00003827 // Disable the presentation of standard compiler warnings when
3828 // using --analyze. We only want to show static analyzer diagnostics
3829 // or frontend errors.
3830 CmdArgs.push_back("-w");
3831
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003832 // Add -Xanalyzer arguments when running as analyzer.
3833 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003834 }
3835
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003836 CheckCodeGenerationOptions(D, Args);
3837
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003838 llvm::Reloc::Model RelocationModel;
3839 unsigned PICLevel;
3840 bool IsPIE;
3841 std::tie(RelocationModel, PICLevel, IsPIE) =
3842 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003843
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003844 const char *RMName = RelocationModelName(RelocationModel);
3845 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003846 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003847 CmdArgs.push_back(RMName);
3848 }
3849 if (PICLevel > 0) {
3850 CmdArgs.push_back("-pic-level");
3851 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3852 if (IsPIE) {
3853 CmdArgs.push_back("-pie-level");
3854 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003855 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003856 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003857
Renato Golin4854d802015-11-09 12:40:41 +00003858 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3859 CmdArgs.push_back("-meabi");
3860 CmdArgs.push_back(A->getValue());
3861 }
3862
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003863 CmdArgs.push_back("-mthread-model");
3864 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3865 CmdArgs.push_back(A->getValue());
3866 else
3867 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3868
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003869 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3870
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003871 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3872 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003873 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003874
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003875 // LLVM Code Generator Options.
3876
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003877 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3878 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003879 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3880 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003881 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003882 CmdArgs.push_back(A->getValue());
3883 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003884 }
3885 }
3886
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003887 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3888 StringRef v = A->getValue();
3889 CmdArgs.push_back("-mllvm");
3890 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3891 A->claim();
3892 }
3893
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003894 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3895 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003896 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003897 }
3898
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003899 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3900 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003901 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003902 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003903 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003904 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3905 CmdArgs.push_back("-fpcc-struct-return");
3906 } else {
3907 assert(A->getOption().matches(options::OPT_freg_struct_return));
3908 CmdArgs.push_back("-freg-struct-return");
3909 }
3910 }
3911
Roman Divacky65b88cd2011-03-01 17:40:53 +00003912 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3913 CmdArgs.push_back("-mrtd");
3914
Rafael Espindola224dd632011-12-14 21:02:23 +00003915 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003916 CmdArgs.push_back("-mdisable-fp-elim");
3917 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3918 options::OPT_fno_zero_initialized_in_bss))
3919 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003920
3921 bool OFastEnabled = isOptimizationLevelFast(Args);
3922 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3923 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003924 OptSpecifier StrictAliasingAliasOption =
3925 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003926 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3927 // doesn't do any TBAA.
3928 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003929 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003930 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003931 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003932 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3933 options::OPT_fno_struct_path_tbaa))
3934 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003935 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3936 false))
3937 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003938 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3939 options::OPT_fno_strict_vtable_pointers,
3940 false))
3941 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003942 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3943 options::OPT_fno_optimize_sibling_calls))
3944 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003945
Eric Christopher006208c2013-04-04 06:29:47 +00003946 // Handle segmented stacks.
3947 if (Args.hasArg(options::OPT_fsplit_stack))
3948 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003949
3950 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3951 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952 OptSpecifier FastMathAliasOption =
3953 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3954
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003955 // Handle various floating point optimization flags, mapping them to the
3956 // appropriate LLVM code generation flags. The pattern for all of these is to
3957 // default off the codegen optimizations, and if any flag enables them and no
3958 // flag disables them after the flag enabling them, enable the codegen
3959 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003960 if (Arg *A = Args.getLastArg(
3961 options::OPT_ffast_math, FastMathAliasOption,
3962 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3963 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3964 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003965 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3966 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003967 A->getOption().getID() != options::OPT_fhonor_infinities)
3968 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003969 if (Arg *A = Args.getLastArg(
3970 options::OPT_ffast_math, FastMathAliasOption,
3971 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3972 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3973 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003974 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3975 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003976 A->getOption().getID() != options::OPT_fhonor_nans)
3977 CmdArgs.push_back("-menable-no-nans");
3978
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003979 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3980 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003981 if (Arg *A =
3982 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3983 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3984 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003985 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3986 // However, turning *off* -ffast_math merely restores the toolchain default
3987 // (which may be false).
3988 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3989 A->getOption().getID() == options::OPT_ffast_math ||
3990 A->getOption().getID() == options::OPT_Ofast)
3991 MathErrno = false;
3992 else if (A->getOption().getID() == options::OPT_fmath_errno)
3993 MathErrno = true;
3994 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003995 if (MathErrno)
3996 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003997
3998 // There are several flags which require disabling very specific
3999 // optimizations. Any of these being disabled forces us to turn off the
4000 // entire set of LLVM optimizations, so collect them through all the flag
4001 // madness.
4002 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004003 if (Arg *A = Args.getLastArg(
4004 options::OPT_ffast_math, FastMathAliasOption,
4005 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4006 options::OPT_fno_unsafe_math_optimizations,
4007 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004008 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4009 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004010 A->getOption().getID() != options::OPT_fno_associative_math)
4011 AssociativeMath = true;
4012 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004013 if (Arg *A = Args.getLastArg(
4014 options::OPT_ffast_math, FastMathAliasOption,
4015 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4016 options::OPT_fno_unsafe_math_optimizations,
4017 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004018 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4019 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004020 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4021 ReciprocalMath = true;
4022 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004023 if (Arg *A = Args.getLastArg(
4024 options::OPT_ffast_math, FastMathAliasOption,
4025 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4026 options::OPT_fno_unsafe_math_optimizations,
4027 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004028 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4029 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004030 A->getOption().getID() != options::OPT_fsigned_zeros)
4031 SignedZeros = false;
4032 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004033 if (Arg *A = Args.getLastArg(
4034 options::OPT_ffast_math, FastMathAliasOption,
4035 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4036 options::OPT_fno_unsafe_math_optimizations,
4037 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004038 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4039 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004040 A->getOption().getID() != options::OPT_ftrapping_math)
4041 TrappingMath = false;
4042 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4043 !TrappingMath)
4044 CmdArgs.push_back("-menable-unsafe-fp-math");
4045
Sanjay Patel76c9e092015-01-23 16:40:50 +00004046 if (!SignedZeros)
4047 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004048
Sanjay Patel359b1052015-04-09 15:03:23 +00004049 if (ReciprocalMath)
4050 CmdArgs.push_back("-freciprocal-math");
4051
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004053 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004054 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004055 options::OPT_ffp_contract)) {
4056 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004057 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004058 if (Val == "fast" || Val == "on" || Val == "off") {
4059 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4060 } else {
4061 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004062 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004063 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004064 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4065 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004066 // If fast-math is set then set the fp-contract mode to fast.
4067 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4068 }
4069 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004070
Sanjay Patel2987c292015-06-11 14:53:41 +00004071 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004072
Bob Wilson6a039162012-07-19 03:52:53 +00004073 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4074 // and if we find them, tell the frontend to provide the appropriate
4075 // preprocessor macros. This is distinct from enabling any optimizations as
4076 // these options induce language changes which must survive serialization
4077 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004078 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4079 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004080 if (!A->getOption().matches(options::OPT_fno_fast_math))
4081 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004082 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4083 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004084 if (A->getOption().matches(options::OPT_ffinite_math_only))
4085 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004086
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004087 // Decide whether to use verbose asm. Verbose assembly is the default on
4088 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004089 bool IsIntegratedAssemblerDefault =
4090 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004091 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004092 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004093 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004094 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004095
Rafael Espindolab8a12932015-05-22 20:44:03 +00004096 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4097 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004098 CmdArgs.push_back("-no-integrated-as");
4099
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004100 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4101 CmdArgs.push_back("-mdebug-pass");
4102 CmdArgs.push_back("Structure");
4103 }
4104 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4105 CmdArgs.push_back("-mdebug-pass");
4106 CmdArgs.push_back("Arguments");
4107 }
4108
Justin Lebar710a35f2016-01-25 22:36:35 +00004109 // Enable -mconstructor-aliases except on darwin, where we have to work around
4110 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4111 // aliases aren't supported.
4112 if (!getToolChain().getTriple().isOSDarwin() &&
4113 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004114 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004115
John McCall7ef5cb32011-03-18 02:56:14 +00004116 // Darwin's kernel doesn't support guard variables; just die if we
4117 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004118 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004119 CmdArgs.push_back("-fforbid-guard-variables");
4120
Akira Hatanaka02028482015-11-12 17:21:22 +00004121 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4122 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004123 CmdArgs.push_back("-mms-bitfields");
4124 }
John McCall8517abc2010-02-19 02:45:38 +00004125
Daniel Dunbar306945d2009-09-16 06:17:29 +00004126 // This is a coarse approximation of what llvm-gcc actually does, both
4127 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4128 // complicated ways.
4129 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004130 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4131 options::OPT_fno_asynchronous_unwind_tables,
4132 (getToolChain().IsUnwindTablesDefault() ||
4133 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4134 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004135 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4136 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004137 CmdArgs.push_back("-munwind-tables");
4138
Chandler Carruth05fb5852012-11-21 23:40:23 +00004139 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004140
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004141 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4142 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004143 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004144 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004145
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004146 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004147 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004148
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004149 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004150 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004151 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004152 }
4153
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004154 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004155 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004156 if (!CPU.empty()) {
4157 CmdArgs.push_back("-target-cpu");
4158 CmdArgs.push_back(Args.MakeArgString(CPU));
4159 }
4160
Rafael Espindolaeb265472013-08-21 21:59:03 +00004161 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4162 CmdArgs.push_back("-mfpmath");
4163 CmdArgs.push_back(A->getValue());
4164 }
4165
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004166 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004167 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004168
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004169 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004170 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004171 default:
4172 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004173
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004174 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004175 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004176 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004177 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004178 // Use the effective triple, which takes into account the deployment target.
4179 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004180 break;
4181
Tim Northover573cbee2014-05-24 12:52:07 +00004182 case llvm::Triple::aarch64:
4183 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004184 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004185 break;
4186
Eric Christopher0b26a612010-03-02 02:41:08 +00004187 case llvm::Triple::mips:
4188 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004189 case llvm::Triple::mips64:
4190 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004191 AddMIPSTargetArgs(Args, CmdArgs);
4192 break;
4193
Ulrich Weigand8afad612014-07-28 13:17:52 +00004194 case llvm::Triple::ppc:
4195 case llvm::Triple::ppc64:
4196 case llvm::Triple::ppc64le:
4197 AddPPCTargetArgs(Args, CmdArgs);
4198 break;
4199
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004200 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004201 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004202 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004203 AddSparcTargetArgs(Args, CmdArgs);
4204 break;
4205
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004206 case llvm::Triple::x86:
4207 case llvm::Triple::x86_64:
4208 AddX86TargetArgs(Args, CmdArgs);
4209 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004210
Jacques Pienaard964cc22016-03-28 21:02:54 +00004211 case llvm::Triple::lanai:
4212 AddLanaiTargetArgs(Args, CmdArgs);
4213 break;
4214
Tony Linthicum76329bf2011-12-12 21:14:55 +00004215 case llvm::Triple::hexagon:
4216 AddHexagonTargetArgs(Args, CmdArgs);
4217 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004218
4219 case llvm::Triple::wasm32:
4220 case llvm::Triple::wasm64:
4221 AddWebAssemblyTargetArgs(Args, CmdArgs);
4222 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004223 }
4224
Douglas Katzman3459ce22015-10-08 04:24:12 +00004225 // The 'g' groups options involve a somewhat intricate sequence of decisions
4226 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004227 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004228 // * what level of debug info to generate
4229 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004230 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004231 // This avoids having to monkey around further in cc1 other than to disable
4232 // codeview if not running in a Windows environment. Perhaps even that
4233 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004234 unsigned DwarfVersion = 0;
4235 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4236 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004237 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004238 bool EmitCodeView = false;
4239
Hans Wennborg75958c42013-08-08 00:17:41 +00004240 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004241 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004242 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004243 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004244
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004245 // Pass the linker version in use.
4246 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4247 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004248 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004249 }
4250
Eric Christopherb7d97e92013-04-03 01:58:53 +00004251 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004252 CmdArgs.push_back("-momit-leaf-frame-pointer");
4253
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004254 // Explicitly error on some things we know we don't support and can't just
4255 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004256 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4257 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004258 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004259 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004260 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4261 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004262 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004263 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004264 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004265 }
4266
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004267 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004268 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004269 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004270 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004271 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4272 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004273 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004274 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004275 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004276
Chad Rosierbe10f982011-08-02 17:58:04 +00004277 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004278 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004279 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4280 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004281 }
4282
Rafael Espindola08a692a2010-03-07 04:46:18 +00004283 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004284 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004285 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004286 // If the last option explicitly specified a debug-info level, use it.
4287 if (A->getOption().matches(options::OPT_gN_Group)) {
4288 DebugInfoKind = DebugLevelToInfoKind(*A);
4289 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4290 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4291 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004292 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004293 A->getIndex() > SplitDwarfArg->getIndex())
4294 SplitDwarfArg = nullptr;
4295 } else
4296 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004297 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004298 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004299
Paul Robinson0334a042015-12-19 19:41:48 +00004300 // If a debugger tuning argument appeared, remember it.
4301 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4302 options::OPT_ggdbN_Group)) {
4303 if (A->getOption().matches(options::OPT_glldb))
4304 DebuggerTuning = llvm::DebuggerKind::LLDB;
4305 else if (A->getOption().matches(options::OPT_gsce))
4306 DebuggerTuning = llvm::DebuggerKind::SCE;
4307 else
4308 DebuggerTuning = llvm::DebuggerKind::GDB;
4309 }
4310
4311 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004312 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004313 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004314 DwarfVersion = DwarfVersionNum(A->getSpelling());
4315
Reid Kleckner124955a2015-08-05 18:51:13 +00004316 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004317 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4318 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4319 // DwarfVersion remains at 0 if no explicit choice was made.
4320 CmdArgs.push_back("-gcodeview");
4321 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004322 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004323 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4324 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004325
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004326 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4327 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004328
4329 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004330 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004331 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004332 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004333
Eric Christopher138c32b2013-09-13 22:37:55 +00004334 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004335 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004336 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004337 CmdArgs.push_back("-dwarf-ext-refs");
4338 CmdArgs.push_back("-fmodule-format=obj");
4339 }
4340
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004341 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4342 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004343 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004344 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004345 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004346 CmdArgs.push_back("-backend-option");
4347 CmdArgs.push_back("-split-dwarf=Enable");
4348 }
4349
Douglas Katzman3459ce22015-10-08 04:24:12 +00004350 // After we've dealt with all combinations of things that could
4351 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4352 // figure out if we need to "upgrade" it to standalone debug info.
4353 // We parse these two '-f' options whether or not they will be used,
4354 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4355 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4356 options::OPT_fno_standalone_debug,
4357 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004358 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4359 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004360 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4361 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004362
Eric Christopher138c32b2013-09-13 22:37:55 +00004363 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4364 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4365 CmdArgs.push_back("-backend-option");
4366 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4367 }
Eric Christophereec89c22013-06-18 00:03:50 +00004368
Eric Christopher0d403d22014-02-14 01:27:03 +00004369 // -gdwarf-aranges turns on the emission of the aranges section in the
4370 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004371 // Always enabled on the PS4.
4372 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004373 CmdArgs.push_back("-backend-option");
4374 CmdArgs.push_back("-generate-arange-section");
4375 }
4376
David Blaikief36d9ba2014-01-27 18:52:43 +00004377 if (Args.hasFlag(options::OPT_fdebug_types_section,
4378 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004379 CmdArgs.push_back("-backend-option");
4380 CmdArgs.push_back("-generate-type-units");
4381 }
Eric Christophereec89c22013-06-18 00:03:50 +00004382
Dan Gohmana5b804b2016-01-07 00:50:27 +00004383 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4384 // default.
4385 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4386 Triple.getArch() == llvm::Triple::wasm32 ||
4387 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004388
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004389 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004390 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004391 CmdArgs.push_back("-ffunction-sections");
4392 }
4393
Peter Collingbourneceef1452016-02-24 22:03:06 +00004394 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4395 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004396 if (!D.isUsingLTO())
4397 D.Diag(diag::err_drv_argument_only_allowed_with)
4398 << "-fwhole-program-vtables"
4399 << "-flto";
4400 CmdArgs.push_back("-fwhole-program-vtables");
4401
4402 clang::SmallString<64> Path(D.ResourceDir);
4403 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4404 if (llvm::sys::fs::exists(Path)) {
4405 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4406 BlacklistOpt += Path.str();
4407 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4408 }
4409
4410 for (const Arg *A :
4411 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4412 A->claim();
4413 if (!llvm::sys::fs::exists(A->getValue()))
4414 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4415 }
4416
4417 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4418 }
4419
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004420 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4421 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004422 CmdArgs.push_back("-fdata-sections");
4423 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004424
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004425 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004426 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004427 CmdArgs.push_back("-fno-unique-section-names");
4428
Chris Lattner3c77a352010-06-22 00:03:40 +00004429 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4430
Diego Novilloa0545962015-07-10 18:00:07 +00004431 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004432
Paul Robinsond083b9a2015-12-16 17:25:27 +00004433 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4434 if (getToolChain().getTriple().isPS4CPU())
4435 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4436
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004437 // Pass options for controlling the default header search paths.
4438 if (Args.hasArg(options::OPT_nostdinc)) {
4439 CmdArgs.push_back("-nostdsysteminc");
4440 CmdArgs.push_back("-nobuiltininc");
4441 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004442 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004443 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004444 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4445 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4446 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004447
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004448 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004449 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004450 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004451
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004452 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4453
Ted Kremenekf7639e12012-03-06 20:06:33 +00004454 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004455 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004456 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004457 options::OPT_ccc_arcmt_modify,
4458 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004459 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004460 switch (A->getOption().getID()) {
4461 default:
4462 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004463 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004464 CmdArgs.push_back("-arcmt-check");
4465 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004466 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004467 CmdArgs.push_back("-arcmt-modify");
4468 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004469 case options::OPT_ccc_arcmt_migrate:
4470 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004471 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004472 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004473
4474 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4475 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004476 break;
John McCalld70fb982011-06-15 23:25:17 +00004477 }
4478 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004479 } else {
4480 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4481 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4482 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004483 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004484
Ted Kremenekf7639e12012-03-06 20:06:33 +00004485 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4486 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004487 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4488 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004489 }
4490 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004491 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004492
4493 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004494 options::OPT_objcmt_migrate_subscripting,
4495 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004496 // None specified, means enable them all.
4497 CmdArgs.push_back("-objcmt-migrate-literals");
4498 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004499 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004500 } else {
4501 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4502 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004503 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004504 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004505 } else {
4506 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4507 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4508 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4509 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4510 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4511 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004512 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004513 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4517 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4518 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004522 }
4523
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004524 // Add preprocessing options like -I, -D, etc. if we are using the
4525 // preprocessor.
4526 //
4527 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004528 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004529 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4530 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004531
Rafael Espindolaa7431922011-07-21 23:40:37 +00004532 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4533 // that "The compiler can only warn and ignore the option if not recognized".
4534 // When building with ccache, it will pass -D options to clang even on
4535 // preprocessed inputs and configure concludes that -fPIC is not supported.
4536 Args.ClaimAllArgs(options::OPT_D);
4537
Alp Toker7874bdc2013-11-15 20:40:58 +00004538 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004539 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4540 if (A->getOption().matches(options::OPT_O4)) {
4541 CmdArgs.push_back("-O3");
4542 D.Diag(diag::warn_O4_is_O3);
4543 } else {
4544 A->render(Args, CmdArgs);
4545 }
4546 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004547
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004548 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004549 for (const Arg *A :
4550 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4551 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004552 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004553 }
4554
Rafael Espindola577637a2015-01-03 00:06:04 +00004555 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004556
Richard Smith3be1cb22014-08-07 00:24:21 +00004557 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004558 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004559 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4560 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004561 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004562 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004563
4564 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004565 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004566 //
4567 // If a std is supplied, only add -trigraphs if it follows the
4568 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004569 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004570 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4571 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004572 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004573 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004574 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004575 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004576 else
4577 Std->render(Args, CmdArgs);
4578
Nico Weber00721502014-12-23 22:32:37 +00004579 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004580 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004581 options::OPT_ftrigraphs,
4582 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004583 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004584 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004585 } else {
4586 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004587 //
4588 // FIXME: Clang doesn't correctly handle -std= when the input language
4589 // doesn't match. For the time being just ignore this for C++ inputs;
4590 // eventually we want to do all the standard defaulting here instead of
4591 // splitting it between the driver and clang -cc1.
4592 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004593 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4594 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004595 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004596 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004597
Nico Weber00721502014-12-23 22:32:37 +00004598 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4599 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004600 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004601
Richard Smith282b4492013-09-04 22:50:31 +00004602 // GCC's behavior for -Wwrite-strings is a bit strange:
4603 // * In C, this "warning flag" changes the types of string literals from
4604 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4605 // for the discarded qualifier.
4606 // * In C++, this is just a normal warning flag.
4607 //
4608 // Implementing this warning correctly in C is hard, so we follow GCC's
4609 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4610 // a non-const char* in C, rather than using this crude hack.
4611 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004612 // FIXME: This should behave just like a warning flag, and thus should also
4613 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4614 Arg *WriteStrings =
4615 Args.getLastArg(options::OPT_Wwrite_strings,
4616 options::OPT_Wno_write_strings, options::OPT_w);
4617 if (WriteStrings &&
4618 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004619 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004620 }
4621
Chandler Carruth61fbf622011-04-23 09:27:53 +00004622 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004623 // during C++ compilation, which it is by default. GCC keeps this define even
4624 // in the presence of '-w', match this behavior bug-for-bug.
4625 if (types::isCXX(InputType) &&
4626 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4627 true)) {
4628 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004629 }
4630
Chandler Carruthe0391482010-05-22 02:21:53 +00004631 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4632 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4633 if (Asm->getOption().matches(options::OPT_fasm))
4634 CmdArgs.push_back("-fgnu-keywords");
4635 else
4636 CmdArgs.push_back("-fno-gnu-keywords");
4637 }
4638
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004639 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4640 CmdArgs.push_back("-fno-dwarf-directory-asm");
4641
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004642 if (ShouldDisableAutolink(Args, getToolChain()))
4643 CmdArgs.push_back("-fno-autolink");
4644
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004645 // Add in -fdebug-compilation-dir if necessary.
4646 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004647
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004648 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4649 StringRef Map = A->getValue();
4650 if (Map.find('=') == StringRef::npos)
4651 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4652 else
4653 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4654 A->claim();
4655 }
4656
Richard Smith9a568822011-11-21 19:36:32 +00004657 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4658 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004659 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004660 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004661 }
4662
Richard Smith79c927b2013-11-06 19:31:51 +00004663 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4664 CmdArgs.push_back("-foperator-arrow-depth");
4665 CmdArgs.push_back(A->getValue());
4666 }
4667
Richard Smith9a568822011-11-21 19:36:32 +00004668 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4669 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004670 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004671 }
4672
Richard Smitha3d3bd22013-05-08 02:12:03 +00004673 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4674 CmdArgs.push_back("-fconstexpr-steps");
4675 CmdArgs.push_back(A->getValue());
4676 }
4677
Richard Smithb3a14522013-02-22 01:59:51 +00004678 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4679 CmdArgs.push_back("-fbracket-depth");
4680 CmdArgs.push_back(A->getValue());
4681 }
4682
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004683 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4684 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004685 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004686 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004687 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4688 } else
4689 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004690 }
4691
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004692 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004693 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004694
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004695 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4696 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004697 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004698 }
David Chisnall5778fce2009-08-31 16:41:57 +00004699
Chris Lattnere23003d2010-01-09 21:54:33 +00004700 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4701 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004702 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004703 }
4704
Chris Lattnerb35583d2010-04-07 20:49:23 +00004705 CmdArgs.push_back("-ferror-limit");
4706 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004707 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004708 else
4709 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004710
Chandler Carrutha77a7272010-05-06 04:55:18 +00004711 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4712 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004713 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004714 }
4715
4716 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4717 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004718 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004719 }
4720
Richard Smithf6f003a2011-12-16 19:06:07 +00004721 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4722 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004723 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004724 }
4725
Nick Lewycky24653262014-12-16 21:39:02 +00004726 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4727 CmdArgs.push_back("-fspell-checking-limit");
4728 CmdArgs.push_back(A->getValue());
4729 }
4730
Daniel Dunbar2c978472009-11-04 06:24:47 +00004731 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004732 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004733 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004734 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004735 } else {
4736 // If -fmessage-length=N was not specified, determine whether this is a
4737 // terminal and, if so, implicitly define -fmessage-length appropriately.
4738 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004739 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004740 }
4741
John McCallb4a99d32013-02-19 01:57:35 +00004742 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4743 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4744 options::OPT_fvisibility_ms_compat)) {
4745 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4746 CmdArgs.push_back("-fvisibility");
4747 CmdArgs.push_back(A->getValue());
4748 } else {
4749 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4750 CmdArgs.push_back("-fvisibility");
4751 CmdArgs.push_back("hidden");
4752 CmdArgs.push_back("-ftype-visibility");
4753 CmdArgs.push_back("default");
4754 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004755 }
4756
Douglas Gregor08329632010-06-15 17:05:35 +00004757 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004758
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004759 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4760
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004761 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004762 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4763 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004764 CmdArgs.push_back("-ffreestanding");
4765
Daniel Dunbare357d562009-12-03 18:42:11 +00004766 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004767 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004768 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004769 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004770 // Emulated TLS is enabled by default on Android, and can be enabled manually
4771 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004772 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004773 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4774 EmulatedTLSDefault))
4775 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004776 // AltiVec-like language extensions aren't relevant for assembling.
4777 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004778 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004779 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4780 }
Richard Trieu91844232012-06-26 18:18:47 +00004781 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4782 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004783
Alexey Bataevdb390212015-05-20 04:24:19 +00004784 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004785 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4786 options::OPT_fno_openmp, false))
4787 switch (getOpenMPRuntime(getToolChain(), Args)) {
4788 case OMPRT_OMP:
4789 case OMPRT_IOMP5:
4790 // Clang can generate useful OpenMP code for these two runtime libraries.
4791 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004792
4793 // If no option regarding the use of TLS in OpenMP codegeneration is
4794 // given, decide a default based on the target. Otherwise rely on the
4795 // options and pass the right information to the frontend.
4796 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004797 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004798 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004799 break;
4800 default:
4801 // By default, if Clang doesn't know how to generate useful OpenMP code
4802 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4803 // down to the actual compilation.
4804 // FIXME: It would be better to have a mode which *only* omits IR
4805 // generation based on the OpenMP support so that we get consistent
4806 // semantic analysis, etc.
4807 break;
4808 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004809
Peter Collingbourne32701642013-11-01 18:16:25 +00004810 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004811 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004812
Eric Christopher459d2712013-02-19 06:16:53 +00004813 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004814 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4815 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4816 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4817 Arch == llvm::Triple::ppc64le))
4818 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4819 << "ppc/ppc64/ppc64le";
4820 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004821
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004822 // -fzvector is incompatible with -faltivec.
4823 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4824 if (Args.hasArg(options::OPT_faltivec))
4825 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4826 << "-faltivec";
4827
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004828 if (getToolChain().SupportsProfiling())
4829 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004830
4831 // -flax-vector-conversions is default.
4832 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4833 options::OPT_fno_lax_vector_conversions))
4834 CmdArgs.push_back("-fno-lax-vector-conversions");
4835
John Brawna7b4ec02015-08-10 11:11:28 +00004836 if (Args.getLastArg(options::OPT_fapple_kext) ||
4837 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004838 CmdArgs.push_back("-fapple-kext");
4839
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004840 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004841 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004842 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004843 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4844 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004845
4846 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4847 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004848 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004849 }
4850
Bob Wilson14adb362012-02-03 06:27:22 +00004851 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004852
Chandler Carruth6e501032011-03-27 00:04:55 +00004853 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4854 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004855 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004856 if (A->getOption().matches(options::OPT_fwrapv))
4857 CmdArgs.push_back("-fwrapv");
4858 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4859 options::OPT_fno_strict_overflow)) {
4860 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4861 CmdArgs.push_back("-fwrapv");
4862 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004863
4864 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4865 options::OPT_fno_reroll_loops))
4866 if (A->getOption().matches(options::OPT_freroll_loops))
4867 CmdArgs.push_back("-freroll-loops");
4868
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004869 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004870 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4871 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004872
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004873 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4874
Daniel Dunbar4930e332009-11-17 08:07:36 +00004875 // -stack-protector=0 is default.
4876 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004877 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4878 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4879 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4880 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4881 Args.ClaimAllArgs(options::OPT_fstack_protector);
4882 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004883 options::OPT_fstack_protector_all,
4884 options::OPT_fstack_protector_strong,
4885 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004886 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004887 StackProtectorLevel = std::max<unsigned>(
4888 LangOptions::SSPOn,
4889 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004890 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004891 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004892 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004893 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004894 } else {
4895 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004896 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004897 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004898 if (StackProtectorLevel) {
4899 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004900 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004901 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004902
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004903 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004904 for (const Arg *A : Args.filtered(options::OPT__param)) {
4905 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004906 if (Str.startswith("ssp-buffer-size=")) {
4907 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004908 CmdArgs.push_back("-stack-protector-buffer-size");
4909 // FIXME: Verify the argument is a valid integer.
4910 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004911 }
Sean Silva14facf32015-06-09 01:57:17 +00004912 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004913 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004914 }
4915
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004916 // Translate -mstackrealign
4917 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004918 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004919 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004920
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004921 if (Args.hasArg(options::OPT_mstack_alignment)) {
4922 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4923 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004924 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004925
Hans Wennborg77dc2362015-01-20 19:45:50 +00004926 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4927 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4928
4929 if (!Size.empty())
4930 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4931 else
4932 CmdArgs.push_back("-mstack-probe-size=0");
4933 }
4934
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004935 switch (getToolChain().getArch()) {
4936 case llvm::Triple::aarch64:
4937 case llvm::Triple::aarch64_be:
4938 case llvm::Triple::arm:
4939 case llvm::Triple::armeb:
4940 case llvm::Triple::thumb:
4941 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004942 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004943 break;
4944
4945 default:
4946 break;
4947 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004948
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004949 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4950 options::OPT_mno_restrict_it)) {
4951 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4952 CmdArgs.push_back("-backend-option");
4953 CmdArgs.push_back("-arm-restrict-it");
4954 } else {
4955 CmdArgs.push_back("-backend-option");
4956 CmdArgs.push_back("-arm-no-restrict-it");
4957 }
James Y Knight2db38f32015-08-15 03:45:25 +00004958 } else if (Triple.isOSWindows() &&
4959 (Triple.getArch() == llvm::Triple::arm ||
4960 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004961 // Windows on ARM expects restricted IT blocks
4962 CmdArgs.push_back("-backend-option");
4963 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004964 }
4965
Daniel Dunbard18049a2009-04-07 21:16:11 +00004966 // Forward -f options with positive and negative forms; we translate
4967 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004968 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4969 StringRef fname = A->getValue();
4970 if (!llvm::sys::fs::exists(fname))
4971 D.Diag(diag::err_drv_no_such_file) << fname;
4972 else
4973 A->render(Args, CmdArgs);
4974 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004975
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004976 // -fbuiltin is default unless -mkernel is used.
4977 bool UseBuiltins =
4978 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4979 !Args.hasArg(options::OPT_mkernel));
4980 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004981 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004982
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004983 // -ffreestanding implies -fno-builtin.
4984 if (Args.hasArg(options::OPT_ffreestanding))
4985 UseBuiltins = false;
4986
4987 // Process the -fno-builtin-* options.
4988 for (const auto &Arg : Args) {
4989 const Option &O = Arg->getOption();
4990 if (!O.matches(options::OPT_fno_builtin_))
4991 continue;
4992
4993 Arg->claim();
4994 // If -fno-builtin is specified, then there's no need to pass the option to
4995 // the frontend.
4996 if (!UseBuiltins)
4997 continue;
4998
4999 StringRef FuncName = Arg->getValue();
5000 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5001 }
5002
Nuno Lopes13c88c72009-12-16 16:59:22 +00005003 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5004 options::OPT_fno_assume_sane_operator_new))
5005 CmdArgs.push_back("-fno-assume-sane-operator-new");
5006
Daniel Dunbar4930e332009-11-17 08:07:36 +00005007 // -fblocks=0 is default.
5008 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005009 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005010 (Args.hasArg(options::OPT_fgnu_runtime) &&
5011 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5012 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005013 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005014
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005015 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005016 !getToolChain().hasBlocksRuntime())
5017 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005018 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005019
Richard Smith47972af2015-06-16 00:08:24 +00005020 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005021 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005022 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005023 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005024 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005025 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5026 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005027 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005028 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005029 HaveModules = true;
5030 }
5031 }
5032
Richard Smith47972af2015-06-16 00:08:24 +00005033 // -fmodule-maps enables implicit reading of module map files. By default,
5034 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005035 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5036 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005037 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005038 }
5039
Daniel Jasperac42b752013-10-21 06:34:34 +00005040 // -fmodules-decluse checks that modules used are declared so (off by
5041 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005042 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005043 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005044 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005045 }
5046
Daniel Jasper962b38e2014-04-11 11:47:45 +00005047 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5048 // all #included headers are part of modules.
5049 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005050 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005051 CmdArgs.push_back("-fmodules-strict-decluse");
5052 }
5053
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005054 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5055 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5056 options::OPT_fno_implicit_modules)) {
5057 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005058 } else if (HaveModules) {
5059 // -fmodule-cache-path specifies where our implicitly-built module files
5060 // should be written.
5061 SmallString<128> Path;
5062 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5063 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005064 if (C.isForDiagnostics()) {
5065 // When generating crash reports, we want to emit the modules along with
5066 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005067 Path = Output.getFilename();
5068 llvm::sys::path::replace_extension(Path, ".cache");
5069 llvm::sys::path::append(Path, "modules");
5070 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005071 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005072 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005073 llvm::sys::path::append(Path, "org.llvm.clang.");
5074 appendUserToPath(Path);
5075 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005076 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005077 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005078 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5079 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005080 }
5081
Richard Smith8d83d6d2016-03-21 19:06:06 +00005082 // -fmodule-name specifies the module that is currently being built (or
5083 // used for header checking by -fmodule-maps).
5084 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5085
5086 // -fmodule-map-file can be used to specify files containing module
5087 // definitions.
5088 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5089
5090 // -fmodule-file can be used to specify files containing precompiled modules.
5091 if (HaveModules)
5092 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5093 else
5094 Args.ClaimAllArgs(options::OPT_fmodule_file);
5095
Justin Bognera88f0122014-06-20 22:59:50 +00005096 // When building modules and generating crashdumps, we need to dump a module
5097 // dependency VFS alongside the output.
5098 if (HaveModules && C.isForDiagnostics()) {
5099 SmallString<128> VFSDir(Output.getFilename());
5100 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005101 // Add the cache directory as a temp so the crash diagnostics pick it up.
5102 C.addTempFile(Args.MakeArgString(VFSDir));
5103
Justin Bognera88f0122014-06-20 22:59:50 +00005104 llvm::sys::path::append(VFSDir, "vfs");
5105 CmdArgs.push_back("-module-dependency-dir");
5106 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005107 }
5108
Richard Smith9887d792014-10-17 01:42:53 +00005109 if (HaveModules)
5110 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005111
Douglas Gregor35b04d62013-02-07 19:01:24 +00005112 // Pass through all -fmodules-ignore-macro arguments.
5113 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005114 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5115 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005116
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005117 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5118
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005119 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5120 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5121 D.Diag(diag::err_drv_argument_not_allowed_with)
5122 << A->getAsString(Args) << "-fbuild-session-timestamp";
5123
5124 llvm::sys::fs::file_status Status;
5125 if (llvm::sys::fs::status(A->getValue(), Status))
5126 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005127 CmdArgs.push_back(Args.MakeArgString(
5128 "-fbuild-session-timestamp=" +
5129 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005130 }
5131
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005132 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005133 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5134 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005135 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5136
5137 Args.AddLastArg(CmdArgs,
5138 options::OPT_fmodules_validate_once_per_build_session);
5139 }
5140
Ben Langmuirdcf73862014-03-12 00:06:17 +00005141 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5142
John McCalldfea9982010-04-09 19:12:06 +00005143 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005144 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005145 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005146 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005147
Anders Carlssond470fef2010-11-21 00:09:52 +00005148 // -felide-constructors is the default.
5149 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005150 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005151 CmdArgs.push_back("-fno-elide-constructors");
5152
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005153 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005154
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005155 if (KernelOrKext || (types::isCXX(InputType) &&
5156 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5157 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005158 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005159
Tony Linthicum76329bf2011-12-12 21:14:55 +00005160 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005161 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5162 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005163 CmdArgs.push_back("-fshort-enums");
5164
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005165 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005166 if (Arg *A = Args.getLastArg(
5167 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5168 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5169 if (A->getOption().matches(options::OPT_funsigned_char) ||
5170 A->getOption().matches(options::OPT_fno_signed_char)) {
5171 CmdArgs.push_back("-fno-signed-char");
5172 }
5173 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005174 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005175 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005176
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005177 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005178 if (!Args.hasFlag(
5179 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5180 !IsWindowsCygnus && !IsWindowsGNU &&
5181 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5182 getToolChain().getArch() != llvm::Triple::hexagon &&
5183 getToolChain().getArch() != llvm::Triple::xcore &&
5184 ((getToolChain().getTriple().getVendor() !=
5185 llvm::Triple::MipsTechnologies) ||
5186 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005187 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005188 CmdArgs.push_back("-fno-use-cxa-atexit");
5189
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005190 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005191 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005192 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005193 CmdArgs.push_back("-fms-extensions");
5194
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005195 // -fno-use-line-directives is default.
5196 if (Args.hasFlag(options::OPT_fuse_line_directives,
5197 options::OPT_fno_use_line_directives, false))
5198 CmdArgs.push_back("-fuse-line-directives");
5199
Francois Pichet1b4f1632011-09-17 04:32:15 +00005200 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005201 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005202 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005203 (IsWindowsMSVC &&
5204 Args.hasFlag(options::OPT_fms_extensions,
5205 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005206 CmdArgs.push_back("-fms-compatibility");
5207
David Majnemerc371ff02015-03-22 08:39:22 +00005208 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005209 VersionTuple MSVT = visualstudio::getMSVCVersion(
5210 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5211 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005212 CmdArgs.push_back(
5213 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005214
David Majnemer8db91762015-05-18 04:49:30 +00005215 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5216 if (ImplyVCPPCXXVer) {
5217 if (IsMSVC2015Compatible)
5218 CmdArgs.push_back("-std=c++14");
5219 else
5220 CmdArgs.push_back("-std=c++11");
5221 }
5222
Eric Christopher5ecce122013-02-18 00:38:31 +00005223 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005224 if (Args.hasFlag(options::OPT_fborland_extensions,
5225 options::OPT_fno_borland_extensions, false))
5226 CmdArgs.push_back("-fborland-extensions");
5227
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005228 // -fno-declspec is default, except for PS4.
5229 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5230 getToolChain().getTriple().isPS4()))
5231 CmdArgs.push_back("-fdeclspec");
5232 else if (Args.hasArg(options::OPT_fno_declspec))
5233 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5234
David Majnemerc371ff02015-03-22 08:39:22 +00005235 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5236 // than 19.
5237 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5238 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005239 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005240 CmdArgs.push_back("-fno-threadsafe-statics");
5241
Francois Pichet02744872011-09-01 16:38:08 +00005242 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5243 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005244 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005245 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005246 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005247
Chandler Carruthe03aa552010-04-17 20:17:31 +00005248 // -fgnu-keywords default varies depending on language; only pass if
5249 // specified.
5250 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005251 options::OPT_fno_gnu_keywords))
5252 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005253
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005254 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005255 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005256 CmdArgs.push_back("-fgnu89-inline");
5257
Chad Rosier9c76d242012-03-15 22:31:42 +00005258 if (Args.hasArg(options::OPT_fno_inline))
5259 CmdArgs.push_back("-fno-inline");
5260
Chad Rosier64d6be92012-03-06 21:17:19 +00005261 if (Args.hasArg(options::OPT_fno_inline_functions))
5262 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005263
John McCall5fb5df92012-06-20 06:18:46 +00005264 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005265
John McCall5fb5df92012-06-20 06:18:46 +00005266 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005267 // legacy is the default. Except for deployment taget of 10.5,
5268 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5269 // gets ignored silently.
5270 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005271 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5272 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005273 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005274 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005275 if (getToolChain().UseObjCMixedDispatch())
5276 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5277 else
5278 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5279 }
5280 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005281
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005282 // When ObjectiveC legacy runtime is in effect on MacOSX,
5283 // turn on the option to do Array/Dictionary subscripting
5284 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005285 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005286 getToolChain().getTriple().isMacOSX() &&
5287 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5288 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005289 objcRuntime.isNeXTFamily())
5290 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005291
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005292 // -fencode-extended-block-signature=1 is default.
5293 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5294 CmdArgs.push_back("-fencode-extended-block-signature");
5295 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005296
John McCall24fc0de2011-07-06 00:26:06 +00005297 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5298 // NOTE: This logic is duplicated in ToolChains.cpp.
5299 bool ARC = isObjCAutoRefCount(Args);
5300 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005301 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005302
John McCall24fc0de2011-07-06 00:26:06 +00005303 CmdArgs.push_back("-fobjc-arc");
5304
Chandler Carruth491db322011-11-04 07:34:47 +00005305 // FIXME: It seems like this entire block, and several around it should be
5306 // wrapped in isObjC, but for now we just use it here as this is where it
5307 // was being used previously.
5308 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5309 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5310 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5311 else
5312 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5313 }
5314
John McCall24fc0de2011-07-06 00:26:06 +00005315 // Allow the user to enable full exceptions code emission.
5316 // We define off for Objective-CC, on for Objective-C++.
5317 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5318 options::OPT_fno_objc_arc_exceptions,
5319 /*default*/ types::isCXX(InputType)))
5320 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005321
John McCall24fc0de2011-07-06 00:26:06 +00005322 }
5323
5324 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5325 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005326 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005327 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005328
John McCall24fc0de2011-07-06 00:26:06 +00005329 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5330 // takes precedence.
5331 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5332 if (!GCArg)
5333 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5334 if (GCArg) {
5335 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005336 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005337 } else if (getToolChain().SupportsObjCGC()) {
5338 GCArg->render(Args, CmdArgs);
5339 } else {
5340 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005341 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005342 }
5343 }
5344
John McCallfbe5ed72015-11-05 19:19:56 +00005345 // Pass down -fobjc-weak or -fno-objc-weak if present.
5346 if (types::isObjC(InputType)) {
5347 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5348 options::OPT_fno_objc_weak);
5349 if (!WeakArg) {
5350 // nothing to do
5351 } else if (GCArg) {
5352 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5353 D.Diag(diag::err_objc_weak_with_gc);
5354 } else if (!objcRuntime.allowsWeak()) {
5355 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5356 D.Diag(diag::err_objc_weak_unsupported);
5357 } else {
5358 WeakArg->render(Args, CmdArgs);
5359 }
5360 }
5361
Bob Wilsonb111ec92015-03-02 19:01:14 +00005362 if (Args.hasFlag(options::OPT_fapplication_extension,
5363 options::OPT_fno_application_extension, false))
5364 CmdArgs.push_back("-fapplication-extension");
5365
Reid Klecknerc542d372014-06-27 17:02:02 +00005366 // Handle GCC-style exception args.
5367 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005368 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5369 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005370
Tim Northovere931f9f2015-10-30 16:30:41 +00005371 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005372 CmdArgs.push_back("-fsjlj-exceptions");
5373
5374 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005375 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5376 options::OPT_fno_assume_sane_operator_new))
5377 CmdArgs.push_back("-fno-assume-sane-operator-new");
5378
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005379 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5380 // most platforms.
5381 if (Args.hasFlag(options::OPT_fsized_deallocation,
5382 options::OPT_fno_sized_deallocation, false))
5383 CmdArgs.push_back("-fsized-deallocation");
5384
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005385 // -fconstant-cfstrings is default, and may be subject to argument translation
5386 // on Darwin.
5387 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5388 options::OPT_fno_constant_cfstrings) ||
5389 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5390 options::OPT_mno_constant_cfstrings))
5391 CmdArgs.push_back("-fno-constant-cfstrings");
5392
John Thompsoned4e2952009-11-05 20:14:16 +00005393 // -fshort-wchar default varies depending on platform; only
5394 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005395 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5396 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005397 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005398
Hans Wennborg28c96312013-07-31 23:39:13 +00005399 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005400 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005401 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005402 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005403
Daniel Dunbar096ed292011-10-05 21:04:55 +00005404 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5405 // -fno-pack-struct doesn't apply to -fpack-struct=.
5406 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005407 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005408 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005409 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005410 } else if (Args.hasFlag(options::OPT_fpack_struct,
5411 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005412 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005413 }
5414
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005415 // Handle -fmax-type-align=N and -fno-type-align
5416 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5417 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5418 if (!SkipMaxTypeAlign) {
5419 std::string MaxTypeAlignStr = "-fmax-type-align=";
5420 MaxTypeAlignStr += A->getValue();
5421 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5422 }
5423 } else if (getToolChain().getTriple().isOSDarwin()) {
5424 if (!SkipMaxTypeAlign) {
5425 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5426 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5427 }
5428 }
5429
John Brawna7b4ec02015-08-10 11:11:28 +00005430 // -fcommon is the default unless compiling kernel code or the target says so
5431 bool NoCommonDefault =
5432 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5433 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5434 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005435 CmdArgs.push_back("-fno-common");
5436
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005437 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005438 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005439 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005440 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005441 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005442 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005443
Daniel Dunbar6358d682010-10-15 22:30:42 +00005444 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005445 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005446 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005447 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005448
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005449 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005450 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5451 StringRef value = inputCharset->getValue();
5452 if (value != "UTF-8")
5453 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5454 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005455 }
5456
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005457 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005458 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5459 StringRef value = execCharset->getValue();
5460 if (value != "UTF-8")
5461 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5462 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005463 }
5464
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005465 // -fcaret-diagnostics is default.
5466 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5467 options::OPT_fno_caret_diagnostics, true))
5468 CmdArgs.push_back("-fno-caret-diagnostics");
5469
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005470 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005471 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005472 options::OPT_fno_diagnostics_fixit_info))
5473 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005474
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005475 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005476 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005477 options::OPT_fno_diagnostics_show_option))
5478 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005479
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005480 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005481 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005482 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005483 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005484 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005485
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005486 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005487 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005488 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005489 }
5490
Chandler Carruthb6766f02011-03-27 01:50:55 +00005491 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005492 options::OPT_fdiagnostics_show_note_include_stack,
5493 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005494 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005495 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005496 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5497 else
5498 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5499 }
5500
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005501 // Color diagnostics are the default, unless the terminal doesn't support
5502 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005503 // Support both clang's -f[no-]color-diagnostics and gcc's
5504 // -f[no-]diagnostics-colors[=never|always|auto].
5505 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005506 for (const auto &Arg : Args) {
5507 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005508 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5509 !O.matches(options::OPT_fdiagnostics_color) &&
5510 !O.matches(options::OPT_fno_color_diagnostics) &&
5511 !O.matches(options::OPT_fno_diagnostics_color) &&
5512 !O.matches(options::OPT_fdiagnostics_color_EQ))
5513 continue;
5514
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005515 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005516 if (O.matches(options::OPT_fcolor_diagnostics) ||
5517 O.matches(options::OPT_fdiagnostics_color)) {
5518 ShowColors = Colors_On;
5519 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5520 O.matches(options::OPT_fno_diagnostics_color)) {
5521 ShowColors = Colors_Off;
5522 } else {
5523 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005524 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005525 if (value == "always")
5526 ShowColors = Colors_On;
5527 else if (value == "never")
5528 ShowColors = Colors_Off;
5529 else if (value == "auto")
5530 ShowColors = Colors_Auto;
5531 else
5532 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005533 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005534 }
5535 }
5536 if (ShowColors == Colors_On ||
5537 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005538 CmdArgs.push_back("-fcolor-diagnostics");
5539
Nico Rieck7857d462013-09-11 00:38:02 +00005540 if (Args.hasArg(options::OPT_fansi_escape_codes))
5541 CmdArgs.push_back("-fansi-escape-codes");
5542
Daniel Dunbardb097022009-06-08 21:13:54 +00005543 if (!Args.hasFlag(options::OPT_fshow_source_location,
5544 options::OPT_fno_show_source_location))
5545 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005546
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005547 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005548 true))
5549 CmdArgs.push_back("-fno-show-column");
5550
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005551 if (!Args.hasFlag(options::OPT_fspell_checking,
5552 options::OPT_fno_spell_checking))
5553 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005554
Chad Rosierc8e56e82012-12-05 21:08:21 +00005555 // -fno-asm-blocks is default.
5556 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5557 false))
5558 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005559
Steven Wucb0d13f2015-01-16 23:05:28 +00005560 // -fgnu-inline-asm is default.
5561 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5562 options::OPT_fno_gnu_inline_asm, true))
5563 CmdArgs.push_back("-fno-gnu-inline-asm");
5564
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005565 // Enable vectorization per default according to the optimization level
5566 // selected. For optimization levels that want vectorization we use the alias
5567 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005568 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005569 OptSpecifier VectorizeAliasOption =
5570 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005571 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005572 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005573 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005574
Chad Rosier136d67d2014-04-28 19:30:57 +00005575 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005576 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005577 OptSpecifier SLPVectAliasOption =
5578 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005579 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005580 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005581 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005582
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005583 // -fno-slp-vectorize-aggressive is default.
5584 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005585 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005586 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005587
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005588 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5589 A->render(Args, CmdArgs);
5590
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005591 // -fdollars-in-identifiers default varies depending on platform and
5592 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005593 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005594 options::OPT_fno_dollars_in_identifiers)) {
5595 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005596 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005597 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005598 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005599 }
5600
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005601 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5602 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005603 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005604 options::OPT_fno_unit_at_a_time)) {
5605 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005606 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005607 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005608
Eli Friedman055c9702011-11-02 01:53:16 +00005609 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5610 options::OPT_fno_apple_pragma_pack, false))
5611 CmdArgs.push_back("-fapple-pragma-pack");
5612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005613 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005614 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5615 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005616 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005617 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005618 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005619
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005620// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5621//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005622// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005623#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005624 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005625 (getToolChain().getArch() == llvm::Triple::arm ||
5626 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005627 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5628 CmdArgs.push_back("-fno-builtin-strcat");
5629 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5630 CmdArgs.push_back("-fno-builtin-strcpy");
5631 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005632#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005633
Justin Bognera88f0122014-06-20 22:59:50 +00005634 // Enable rewrite includes if the user's asked for it or if we're generating
5635 // diagnostics.
5636 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5637 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005638 if (Args.hasFlag(options::OPT_frewrite_includes,
5639 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005640 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005641 CmdArgs.push_back("-frewrite-includes");
5642
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005643 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005644 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005645 options::OPT_traditional_cpp)) {
5646 if (isa<PreprocessJobAction>(JA))
5647 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005648 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005649 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005650 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005651
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005652 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005653 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005654
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005655 // Handle serialized diagnostics.
5656 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5657 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005658 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005659 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005660
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005661 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5662 CmdArgs.push_back("-fretain-comments-from-system-headers");
5663
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005664 // Forward -fcomment-block-commands to -cc1.
5665 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005666 // Forward -fparse-all-comments to -cc1.
5667 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005668
John Brawnad31ace2015-09-23 13:55:40 +00005669 // Turn -fplugin=name.so into -load name.so
5670 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5671 CmdArgs.push_back("-load");
5672 CmdArgs.push_back(A->getValue());
5673 A->claim();
5674 }
5675
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005676 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5677 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005678 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005679 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5680 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005681
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005682 // We translate this by hand to the -cc1 argument, since nightly test uses
5683 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005684 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005685 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005686 } else
Sean Silva14facf32015-06-09 01:57:17 +00005687 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005688 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005689
Bob Wilson23a55f12014-12-21 07:00:00 +00005690 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005691 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5692 // by the frontend.
5693 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5694 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005695
Daniel Dunbard67a3222009-03-30 06:36:42 +00005696 if (Output.getType() == types::TY_Dependencies) {
5697 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005698 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005699 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005700 CmdArgs.push_back(Output.getFilename());
5701 } else {
5702 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005703 }
5704
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005705 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005706
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005707 if (Input.isFilename())
5708 CmdArgs.push_back(Input.getFilename());
5709 else
5710 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005711
Chris Lattnere9d7d782009-11-03 19:50:27 +00005712 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5713
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005714 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005715
5716 // Optionally embed the -cc1 level arguments into the debug info, for build
5717 // analysis.
5718 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005719 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005720 for (const auto &Arg : Args)
5721 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005722
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005723 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005724 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005725 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005726 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005727 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005728 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005729 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005730 }
5731 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005732 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005733 }
5734
Eric Christopherd3804002013-02-22 20:12:52 +00005735 // Add the split debug info name to the command lines here so we
5736 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005737 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005738 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5739 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005740 const char *SplitDwarfOut;
5741 if (SplitDwarf) {
5742 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005743 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005744 CmdArgs.push_back(SplitDwarfOut);
5745 }
5746
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005747 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5748 // Include them with -fcuda-include-gpubinary.
5749 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005750 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005751 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005752 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005753 }
5754
Eric Christopherd3804002013-02-22 20:12:52 +00005755 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005756 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005757 Output.getType() == types::TY_Object &&
5758 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005759 auto CLCommand =
5760 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005761 C.addCommand(llvm::make_unique<FallbackCommand>(
5762 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005763 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5764 isa<PrecompileJobAction>(JA)) {
5765 // In /fallback builds, run the main compilation even if the pch generation
5766 // fails, so that the main compilation's fallback to cl.exe runs.
5767 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5768 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005769 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005770 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005771 }
5772
Eric Christopherf1545832013-02-22 23:50:16 +00005773 // Handle the debug info splitting at object creation time if we're
5774 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005775 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005776 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005777 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005778
Roman Divacky178e01602011-02-10 16:52:03 +00005779 if (Arg *A = Args.getLastArg(options::OPT_pg))
5780 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005781 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5782 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005783
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005784 // Claim some arguments which clang supports automatically.
5785
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005786 // -fpch-preprocess is used with gcc to add a special marker in the output to
5787 // include the PCH file. Clang's PTH solution is completely transparent, so we
5788 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005789 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005790
Daniel Dunbar17731772009-03-23 19:03:36 +00005791 // Claim some arguments which clang doesn't support, but we don't
5792 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005793 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5794 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005795
Rafael Espindolab0092d72013-09-04 19:37:35 +00005796 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005797 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005798}
5799
John McCall5fb5df92012-06-20 06:18:46 +00005800/// Add options related to the Objective-C runtime/ABI.
5801///
5802/// Returns true if the runtime is non-fragile.
5803ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5804 ArgStringList &cmdArgs,
5805 RewriteKind rewriteKind) const {
5806 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005807 Arg *runtimeArg =
5808 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5809 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005810
5811 // Just forward -fobjc-runtime= to the frontend. This supercedes
5812 // options about fragility.
5813 if (runtimeArg &&
5814 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5815 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005816 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005817 if (runtime.tryParse(value)) {
5818 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005819 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005820 }
5821
5822 runtimeArg->render(args, cmdArgs);
5823 return runtime;
5824 }
5825
5826 // Otherwise, we'll need the ABI "version". Version numbers are
5827 // slightly confusing for historical reasons:
5828 // 1 - Traditional "fragile" ABI
5829 // 2 - Non-fragile ABI, version 1
5830 // 3 - Non-fragile ABI, version 2
5831 unsigned objcABIVersion = 1;
5832 // If -fobjc-abi-version= is present, use that to set the version.
5833 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005834 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005835 if (value == "1")
5836 objcABIVersion = 1;
5837 else if (value == "2")
5838 objcABIVersion = 2;
5839 else if (value == "3")
5840 objcABIVersion = 3;
5841 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005842 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005843 } else {
5844 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005845 bool nonFragileABIIsDefault =
5846 (rewriteKind == RK_NonFragile ||
5847 (rewriteKind == RK_None &&
5848 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005849 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5850 options::OPT_fno_objc_nonfragile_abi,
5851 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005852// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005853#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5854 unsigned nonFragileABIVersion = 1;
5855#else
5856 unsigned nonFragileABIVersion = 2;
5857#endif
5858
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005859 if (Arg *abiArg =
5860 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005861 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005862 if (value == "1")
5863 nonFragileABIVersion = 1;
5864 else if (value == "2")
5865 nonFragileABIVersion = 2;
5866 else
5867 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005868 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005869 }
5870
5871 objcABIVersion = 1 + nonFragileABIVersion;
5872 } else {
5873 objcABIVersion = 1;
5874 }
5875 }
5876
5877 // We don't actually care about the ABI version other than whether
5878 // it's non-fragile.
5879 bool isNonFragile = objcABIVersion != 1;
5880
5881 // If we have no runtime argument, ask the toolchain for its default runtime.
5882 // However, the rewriter only really supports the Mac runtime, so assume that.
5883 ObjCRuntime runtime;
5884 if (!runtimeArg) {
5885 switch (rewriteKind) {
5886 case RK_None:
5887 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5888 break;
5889 case RK_Fragile:
5890 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5891 break;
5892 case RK_NonFragile:
5893 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5894 break;
5895 }
5896
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005897 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005898 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5899 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005900 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005901 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005903 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005904 } else {
5905 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5906 }
5907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005908 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005909 } else {
5910 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005911 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005912 // non-fragile mode or the GCC runtime in fragile mode.
5913 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005914 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005915 else
5916 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005917 }
5918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005919 cmdArgs.push_back(
5920 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005921 return runtime;
5922}
5923
Reid Klecknerc542d372014-06-27 17:02:02 +00005924static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5925 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5926 I += HaveDash;
5927 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005928}
Reid Klecknerc542d372014-06-27 17:02:02 +00005929
Benjamin Kramere003ca22015-10-28 13:54:16 +00005930namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005931struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005932 bool Synch = false;
5933 bool Asynch = false;
5934 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005935};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005936} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005937
5938/// /EH controls whether to run destructor cleanups when exceptions are
5939/// thrown. There are three modifiers:
5940/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5941/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5942/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005943/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005944/// The default is /EHs-c-, meaning cleanups are disabled.
5945static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5946 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005947
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005948 std::vector<std::string> EHArgs =
5949 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005950 for (auto EHVal : EHArgs) {
5951 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5952 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005953 case 'a':
5954 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005955 if (EH.Asynch)
5956 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005957 continue;
5958 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005959 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005960 continue;
5961 case 's':
5962 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005963 if (EH.Synch)
5964 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005965 continue;
5966 default:
5967 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005968 }
5969 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5970 break;
5971 }
5972 }
David Majnemerb8809092016-02-20 09:23:44 +00005973 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005974 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005975 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005976 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5977 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005978 EH.Synch = true;
5979 EH.NoUnwindC = true;
5980 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005981
Reid Klecknerc542d372014-06-27 17:02:02 +00005982 return EH;
5983}
5984
David Majnemercd5855e2016-02-29 01:40:36 +00005985void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5986 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005987 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005988 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005989 unsigned RTOptionID = options::OPT__SLASH_MT;
5990
Hans Wennborgf1a74252013-09-10 20:18:04 +00005991 if (Args.hasArg(options::OPT__SLASH_LDd))
5992 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5993 // but defining _DEBUG is sticky.
5994 RTOptionID = options::OPT__SLASH_MTd;
5995
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005996 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005997 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005998
David Majnemere2afb472015-07-24 06:49:13 +00005999 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006000 switch (RTOptionID) {
6001 case options::OPT__SLASH_MD:
6002 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006003 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006004 CmdArgs.push_back("-D_MT");
6005 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006006 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006007 break;
6008 case options::OPT__SLASH_MDd:
6009 CmdArgs.push_back("-D_DEBUG");
6010 CmdArgs.push_back("-D_MT");
6011 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006012 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006013 break;
6014 case options::OPT__SLASH_MT:
6015 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006016 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006017 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006018 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006019 break;
6020 case options::OPT__SLASH_MTd:
6021 CmdArgs.push_back("-D_DEBUG");
6022 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006023 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006024 break;
6025 default:
6026 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006027 }
6028
David Majnemere2afb472015-07-24 06:49:13 +00006029 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6030 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6031 } else {
6032 CmdArgs.push_back(FlagForCRT.data());
6033
6034 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6035 // users want. The /Za flag to cl.exe turns this off, but it's not
6036 // implemented in clang.
6037 CmdArgs.push_back("--dependent-lib=oldnames");
6038 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006039
Hans Wennborg8858a032014-07-21 23:42:07 +00006040 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6041 // would produce interleaved output, so ignore /showIncludes in such cases.
6042 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6043 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6044 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006045
David Majnemerf6072342014-07-01 22:24:56 +00006046 // This controls whether or not we emit RTTI data for polymorphic types.
6047 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6048 /*default=*/false))
6049 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006050
Reid Kleckner124955a2015-08-05 18:51:13 +00006051 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006052 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006053 if (*EmitCodeView)
6054 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006055 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006056 CmdArgs.push_back("-gcodeview");
6057
Reid Klecknerc542d372014-06-27 17:02:02 +00006058 const Driver &D = getToolChain().getDriver();
6059 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006060 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006061 if (types::isCXX(InputType))
6062 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006063 CmdArgs.push_back("-fexceptions");
6064 }
David Majnemercd5855e2016-02-29 01:40:36 +00006065 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6066 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006067
Hans Wennborge50cec32014-06-13 20:59:54 +00006068 // /EP should expand to -E -P.
6069 if (Args.hasArg(options::OPT__SLASH_EP)) {
6070 CmdArgs.push_back("-E");
6071 CmdArgs.push_back("-P");
6072 }
6073
David Majnemera5b195a2015-02-14 01:35:12 +00006074 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006075 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6076 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006077 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6078 else
6079 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6080
6081 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6082 VolatileOptionID = A->getOption().getID();
6083
6084 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6085 CmdArgs.push_back("-fms-volatile");
6086
David Majnemer86c318f2014-02-11 21:05:00 +00006087 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6088 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6089 if (MostGeneralArg && BestCaseArg)
6090 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6091 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6092
6093 if (MostGeneralArg) {
6094 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6095 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6096 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6097
6098 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6099 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6100 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6101 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6102 << FirstConflict->getAsString(Args)
6103 << SecondConflict->getAsString(Args);
6104
6105 if (SingleArg)
6106 CmdArgs.push_back("-fms-memptr-rep=single");
6107 else if (MultipleArg)
6108 CmdArgs.push_back("-fms-memptr-rep=multiple");
6109 else
6110 CmdArgs.push_back("-fms-memptr-rep=virtual");
6111 }
6112
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006113 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6114 A->render(Args, CmdArgs);
6115
Hans Wennborg81f74482013-09-10 01:07:07 +00006116 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6117 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006118 if (Args.hasArg(options::OPT__SLASH_fallback))
6119 CmdArgs.push_back("msvc-fallback");
6120 else
6121 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006122 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006123}
6124
Douglas Katzman95354292015-06-23 20:42:09 +00006125visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006126 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006127 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006128 return CLFallback.get();
6129}
6130
Daniel Sanders7f933f42015-01-30 17:35:23 +00006131void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6132 ArgStringList &CmdArgs) const {
6133 StringRef CPUName;
6134 StringRef ABIName;
6135 const llvm::Triple &Triple = getToolChain().getTriple();
6136 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6137
6138 CmdArgs.push_back("-target-abi");
6139 CmdArgs.push_back(ABIName.data());
6140}
6141
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006142void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006143 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006144 const ArgList &Args,
6145 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006146 ArgStringList CmdArgs;
6147
6148 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6149 const InputInfo &Input = Inputs[0];
6150
James Y Knight2db38f32015-08-15 03:45:25 +00006151 std::string TripleStr =
6152 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6153 const llvm::Triple Triple(TripleStr);
6154
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006155 // Don't warn about "clang -w -c foo.s"
6156 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006157 // and "clang -emit-llvm -c foo.s"
6158 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006159
Rafael Espindola577637a2015-01-03 00:06:04 +00006160 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006161
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006162 // Invoke ourselves in -cc1as mode.
6163 //
6164 // FIXME: Implement custom jobs for internal actions.
6165 CmdArgs.push_back("-cc1as");
6166
6167 // Add the "effective" target triple.
6168 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006169 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6170
6171 // Set the output mode, we currently only expect to be used as a real
6172 // assembler.
6173 CmdArgs.push_back("-filetype");
6174 CmdArgs.push_back("obj");
6175
Eric Christopher45f2e712012-12-18 00:31:10 +00006176 // Set the main file name, so that debug info works even with
6177 // -save-temps or preprocessed assembly.
6178 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006179 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006180
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006181 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006182 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006183 if (!CPU.empty()) {
6184 CmdArgs.push_back("-target-cpu");
6185 CmdArgs.push_back(Args.MakeArgString(CPU));
6186 }
6187
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006188 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006189 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006190
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006191 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006192 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006193
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006194 // Pass along any -I options so we get proper .include search paths.
6195 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6196
Eric Christopherfc3ee562012-01-10 00:38:01 +00006197 // Determine the original source input.
6198 const Action *SourceAction = &JA;
6199 while (SourceAction->getKind() != Action::InputClass) {
6200 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6201 SourceAction = SourceAction->getInputs()[0];
6202 }
6203
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006204 // Forward -g and handle debug info related flags, assuming we are dealing
6205 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006206 if (SourceAction->getType() == types::TY_Asm ||
6207 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006208 bool WantDebug = false;
6209 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006210 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006211 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006212 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6213 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006214 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006215 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006216 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006217 if (DwarfVersion == 0)
6218 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006219 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006220 (WantDebug ? codegenoptions::LimitedDebugInfo
6221 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006222 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006223
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006224 // Add the -fdebug-compilation-dir flag if needed.
6225 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006226
6227 // Set the AT_producer to the clang version when using the integrated
6228 // assembler on assembly source files.
6229 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006230 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6231 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006232
6233 // And pass along -I options
6234 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006235 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006236
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006237 // Handle -fPIC et al -- the relocation-model affects the assembler
6238 // for some targets.
6239 llvm::Reloc::Model RelocationModel;
6240 unsigned PICLevel;
6241 bool IsPIE;
6242 std::tie(RelocationModel, PICLevel, IsPIE) =
6243 ParsePICArgs(getToolChain(), Triple, Args);
6244
6245 const char *RMName = RelocationModelName(RelocationModel);
6246 if (RMName) {
6247 CmdArgs.push_back("-mrelocation-model");
6248 CmdArgs.push_back(RMName);
6249 }
6250
Kevin Enderby292dc082011-12-22 19:31:58 +00006251 // Optionally embed the -cc1as level arguments into the debug info, for build
6252 // analysis.
6253 if (getToolChain().UseDwarfDebugFlags()) {
6254 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006255 for (const auto &Arg : Args)
6256 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006257
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006258 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006259 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6260 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006261 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006262 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006263 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006264 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006265 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006266 }
6267 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006268 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006269 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006270
6271 // FIXME: Add -static support, once we have it.
6272
Daniel Sanders7f933f42015-01-30 17:35:23 +00006273 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006274 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006275 default:
6276 break;
6277
6278 case llvm::Triple::mips:
6279 case llvm::Triple::mipsel:
6280 case llvm::Triple::mips64:
6281 case llvm::Triple::mips64el:
6282 AddMIPSTargetArgs(Args, CmdArgs);
6283 break;
6284 }
6285
David Blaikie372d9502014-01-17 03:17:40 +00006286 // Consume all the warning flags. Usually this would be handled more
6287 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6288 // doesn't handle that so rather than warning about unused flags that are
6289 // actually used, we'll lie by omission instead.
6290 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006291 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006292
David Blaikie9260ed62013-07-25 21:19:01 +00006293 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6294 getToolChain().getDriver());
6295
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006296 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006297
6298 assert(Output.isFilename() && "Unexpected lipo output.");
6299 CmdArgs.push_back("-o");
6300 CmdArgs.push_back(Output.getFilename());
6301
Daniel Dunbarb440f562010-08-02 02:38:21 +00006302 assert(Input.isFilename() && "Invalid input.");
6303 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006304
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006305 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006306 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006307
6308 // Handle the debug info splitting at object creation time if we're
6309 // creating an object.
6310 // TODO: Currently only works on linux with newer objcopy.
6311 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006312 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006313 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006314 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006315}
6316
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006317void GnuTool::anchor() {}
6318
Daniel Dunbara3246a02009-03-18 08:07:30 +00006319void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006320 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006321 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006322 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006323 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006324 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006325
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006326 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006327 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006328 // It is unfortunate that we have to claim here, as this means
6329 // we will basically never report anything interesting for
6330 // platforms using a generic gcc, even if we are just using gcc
6331 // to get to the assembler.
6332 A->claim();
6333
Daniel Dunbar939c1212010-08-03 16:14:14 +00006334 // Don't forward any -g arguments to assembly steps.
6335 if (isa<AssembleJobAction>(JA) &&
6336 A->getOption().matches(options::OPT_g_Group))
6337 continue;
6338
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006339 // Don't forward any -W arguments to assembly and link steps.
6340 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6341 A->getOption().matches(options::OPT_W_Group))
6342 continue;
6343
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006344 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006345 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006346 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006347
Daniel Dunbar4e295052010-01-25 22:35:08 +00006348 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006349
6350 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006351 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006352 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006353 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006354 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006355 }
6356
Daniel Dunbar5716d872009-05-02 21:41:52 +00006357 // Try to force gcc to match the tool chain we want, if we recognize
6358 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006359 //
6360 // FIXME: The triple class should directly provide the information we want
6361 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006362 switch (getToolChain().getArch()) {
6363 default:
6364 break;
6365 case llvm::Triple::x86:
6366 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006367 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006368 break;
6369 case llvm::Triple::x86_64:
6370 case llvm::Triple::ppc64:
6371 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006372 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006373 break;
6374 case llvm::Triple::sparcel:
6375 CmdArgs.push_back("-EL");
6376 break;
6377 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006378
Daniel Dunbarb440f562010-08-02 02:38:21 +00006379 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006380 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006381 CmdArgs.push_back(Output.getFilename());
6382 } else {
6383 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006384 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006385 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006386
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006387 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006388
6389 // Only pass -x if gcc will understand it; otherwise hope gcc
6390 // understands the suffix correctly. The main use case this would go
6391 // wrong in is for linker inputs if they happened to have an odd
6392 // suffix; really the only way to get this to happen is a command
6393 // like '-x foobar a.c' which will treat a.c like a linker input.
6394 //
6395 // FIXME: For the linker case specifically, can we safely convert
6396 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006397 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006398 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006399 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006400 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006401 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006402 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006403 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006404 else if (II.getType() == types::TY_ModuleFile)
6405 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006406 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006407
Daniel Dunbara3246a02009-03-18 08:07:30 +00006408 if (types::canTypeBeUserSpecified(II.getType())) {
6409 CmdArgs.push_back("-x");
6410 CmdArgs.push_back(types::getTypeName(II.getType()));
6411 }
6412
Daniel Dunbarb440f562010-08-02 02:38:21 +00006413 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006414 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006415 else {
6416 const Arg &A = II.getInputArg();
6417
6418 // Reverse translate some rewritten options.
6419 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6420 CmdArgs.push_back("-lstdc++");
6421 continue;
6422 }
6423
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006424 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006425 A.render(Args, CmdArgs);
6426 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006427 }
6428
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006429 const std::string customGCCName = D.getCCCGenericGCCName();
6430 const char *GCCName;
6431 if (!customGCCName.empty())
6432 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006433 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006434 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006435 } else
6436 GCCName = "gcc";
6437
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006438 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006439 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006440}
6441
Douglas Katzman95354292015-06-23 20:42:09 +00006442void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6443 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006444 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006445}
6446
Douglas Katzman95354292015-06-23 20:42:09 +00006447void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6448 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006449 const Driver &D = getToolChain().getDriver();
6450
Eric Christophercc7ff502015-01-29 00:56:17 +00006451 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006452 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006453 case types::TY_LLVM_IR:
6454 case types::TY_LTO_IR:
6455 case types::TY_LLVM_BC:
6456 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006457 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006458 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006459 // We assume we've got an "integrated" assembler in that gcc will produce an
6460 // object file itself.
6461 case types::TY_Object:
6462 CmdArgs.push_back("-c");
6463 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006464 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006465 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006466 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006467 case types::TY_Nothing:
6468 CmdArgs.push_back("-fsyntax-only");
6469 break;
6470 default:
6471 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006472 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006473}
6474
Douglas Katzman95354292015-06-23 20:42:09 +00006475void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6476 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006477 // The types are (hopefully) good enough.
6478}
6479
Tony Linthicum76329bf2011-12-12 21:14:55 +00006480// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006481void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006482 ArgStringList &CmdArgs) const {
6483}
6484
Douglas Katzman95354292015-06-23 20:42:09 +00006485void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6486 const InputInfo &Output,
6487 const InputInfoList &Inputs,
6488 const ArgList &Args,
6489 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006490 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006491
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006492 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6493 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006494 ArgStringList CmdArgs;
6495
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 std::string MArchString = "-march=hexagon";
6497 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006498
6499 RenderExtraToolArgs(JA, CmdArgs);
6500
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006501 std::string AsName = "hexagon-llvm-mc";
6502 std::string MCpuString = "-mcpu=hexagon" +
6503 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6504 CmdArgs.push_back("-filetype=obj");
6505 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6506
Tony Linthicum76329bf2011-12-12 21:14:55 +00006507 if (Output.isFilename()) {
6508 CmdArgs.push_back("-o");
6509 CmdArgs.push_back(Output.getFilename());
6510 } else {
6511 assert(Output.isNothing() && "Unexpected output");
6512 CmdArgs.push_back("-fsyntax-only");
6513 }
6514
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006515 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6516 std::string N = llvm::utostr(G.getValue());
6517 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6518 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006519
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006520 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006521
Tony Linthicum76329bf2011-12-12 21:14:55 +00006522 // Only pass -x if gcc will understand it; otherwise hope gcc
6523 // understands the suffix correctly. The main use case this would go
6524 // wrong in is for linker inputs if they happened to have an odd
6525 // suffix; really the only way to get this to happen is a command
6526 // like '-x foobar a.c' which will treat a.c like a linker input.
6527 //
6528 // FIXME: For the linker case specifically, can we safely convert
6529 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006530 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006531 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006532 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006533 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006534 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006535 else if (II.getType() == types::TY_AST)
6536 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006537 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006538 else if (II.getType() == types::TY_ModuleFile)
6539 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006540 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006541
6542 if (II.isFilename())
6543 CmdArgs.push_back(II.getFilename());
6544 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006545 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006546 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006547 II.getInputArg().render(Args, CmdArgs);
6548 }
6549
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006550 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006551 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006552}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006553
Douglas Katzman95354292015-06-23 20:42:09 +00006554void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6555 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006556}
6557
Douglas Katzman54366072015-07-27 16:53:08 +00006558static void
6559constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006560 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006561 const InputInfo &Output, const InputInfoList &Inputs,
6562 const ArgList &Args, ArgStringList &CmdArgs,
6563 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006564
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006565 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006566
Matthew Curtise689b052012-12-06 15:46:07 +00006567 //----------------------------------------------------------------------------
6568 //
6569 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 bool IsStatic = Args.hasArg(options::OPT_static);
6571 bool IsShared = Args.hasArg(options::OPT_shared);
6572 bool IsPIE = Args.hasArg(options::OPT_pie);
6573 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6574 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6575 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6576 bool UseG0 = false;
6577 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006578
Matthew Curtise689b052012-12-06 15:46:07 +00006579 //----------------------------------------------------------------------------
6580 // Silence warnings for various options
6581 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006582 Args.ClaimAllArgs(options::OPT_g_Group);
6583 Args.ClaimAllArgs(options::OPT_emit_llvm);
6584 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6585 // handled somewhere else.
6586 Args.ClaimAllArgs(options::OPT_static_libgcc);
6587
6588 //----------------------------------------------------------------------------
6589 //
6590 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006591 if (Args.hasArg(options::OPT_s))
6592 CmdArgs.push_back("-s");
6593
6594 if (Args.hasArg(options::OPT_r))
6595 CmdArgs.push_back("-r");
6596
6597 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006598 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006599
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006600 CmdArgs.push_back("-march=hexagon");
6601 std::string CpuVer =
6602 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6603 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6604 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006605
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006606 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006607 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006608 // The following should be the default, but doing as hexagon-gcc does.
6609 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006610 }
6611
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006613 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006614
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006615 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006616 CmdArgs.push_back("-pie");
6617
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006618 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6619 std::string N = llvm::utostr(G.getValue());
6620 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6621 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006622 }
6623
Matthew Curtise689b052012-12-06 15:46:07 +00006624 //----------------------------------------------------------------------------
6625 //
6626 //----------------------------------------------------------------------------
6627 CmdArgs.push_back("-o");
6628 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006629
Matthew Curtise689b052012-12-06 15:46:07 +00006630 //----------------------------------------------------------------------------
6631 // moslib
6632 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006633 std::vector<std::string> OsLibs;
6634 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006635
Sean Silva14facf32015-06-09 01:57:17 +00006636 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6637 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006638 OsLibs.emplace_back(A->getValue());
6639 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006640 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006641 if (OsLibs.empty()) {
6642 OsLibs.push_back("standalone");
6643 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006644 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006645
Matthew Curtise689b052012-12-06 15:46:07 +00006646 //----------------------------------------------------------------------------
6647 // Start Files
6648 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006649 const std::string MCpuSuffix = "/" + CpuVer;
6650 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6651 const std::string RootDir =
6652 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6653 const std::string StartSubDir =
6654 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006655
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006656 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6657 const char *Name) -> std::string {
6658 std::string RelName = SubDir + Name;
6659 std::string P = HTC.GetFilePath(RelName.c_str());
6660 if (llvm::sys::fs::exists(P))
6661 return P;
6662 return RootDir + RelName;
6663 };
6664
6665 if (IncStdLib && IncStartFiles) {
6666 if (!IsShared) {
6667 if (HasStandalone) {
6668 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6669 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006670 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006671 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6672 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006673 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006674 std::string Init = UseShared
6675 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6676 : Find(RootDir, StartSubDir, "/init.o");
6677 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006678 }
6679
6680 //----------------------------------------------------------------------------
6681 // Library Search Paths
6682 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006683 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6684 for (const auto &LibPath : LibPaths)
6685 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006686
6687 //----------------------------------------------------------------------------
6688 //
6689 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006690 Args.AddAllArgs(CmdArgs,
6691 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6692 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006693
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006694 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006695
6696 //----------------------------------------------------------------------------
6697 // Libraries
6698 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006699 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006700 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006701 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006702 CmdArgs.push_back("-lm");
6703 }
6704
6705 CmdArgs.push_back("--start-group");
6706
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006707 if (!IsShared) {
6708 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006709 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006710 CmdArgs.push_back("-lc");
6711 }
6712 CmdArgs.push_back("-lgcc");
6713
6714 CmdArgs.push_back("--end-group");
6715 }
6716
6717 //----------------------------------------------------------------------------
6718 // End files
6719 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006720 if (IncStdLib && IncStartFiles) {
6721 std::string Fini = UseShared
6722 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6723 : Find(RootDir, StartSubDir, "/fini.o");
6724 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006725 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006726}
6727
Douglas Katzman95354292015-06-23 20:42:09 +00006728void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6729 const InputInfo &Output,
6730 const InputInfoList &Inputs,
6731 const ArgList &Args,
6732 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006733 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006734
6735 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006736 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006737 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006738
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006739 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006740 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006741 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006742}
6743// Hexagon tools end.
6744
Tom Stellard8fa33092015-07-18 01:49:05 +00006745void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6746 const InputInfo &Output,
6747 const InputInfoList &Inputs,
6748 const ArgList &Args,
6749 const char *LinkingOutput) const {
6750
6751 std::string Linker = getToolChain().GetProgramPath(getShortName());
6752 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006753 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006754 CmdArgs.push_back(Output.getFilename());
6755 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6756 CmdArgs, Inputs));
6757}
6758// AMDGPU tools end.
6759
Dan Gohman52816862015-12-16 23:30:41 +00006760wasm::Linker::Linker(const ToolChain &TC)
6761 : GnuTool("wasm::Linker", "lld", TC) {}
6762
6763bool wasm::Linker::isLinkJob() const {
6764 return true;
6765}
6766
6767bool wasm::Linker::hasIntegratedCPP() const {
6768 return false;
6769}
6770
6771void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6772 const InputInfo &Output,
6773 const InputInfoList &Inputs,
6774 const ArgList &Args,
6775 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006776
6777 const ToolChain &ToolChain = getToolChain();
6778 const Driver &D = ToolChain.getDriver();
6779 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006780 ArgStringList CmdArgs;
6781 CmdArgs.push_back("-flavor");
6782 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006783
6784 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006785 // size is of particular importance. This is significantly facilitated by
6786 // the enabling of -ffunction-sections and -fdata-sections in
6787 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006788 if (areOptimizationsEnabled(Args))
6789 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006790
Dan Gohman57b62c52016-02-22 19:26:15 +00006791 if (Args.hasArg(options::OPT_rdynamic))
6792 CmdArgs.push_back("-export-dynamic");
6793 if (Args.hasArg(options::OPT_s))
6794 CmdArgs.push_back("--strip-all");
6795 if (Args.hasArg(options::OPT_shared))
6796 CmdArgs.push_back("-shared");
6797 if (Args.hasArg(options::OPT_static))
6798 CmdArgs.push_back("-Bstatic");
6799
6800 Args.AddAllArgs(CmdArgs, options::OPT_L);
6801 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6802
6803 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6804 if (Args.hasArg(options::OPT_shared))
6805 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6806 else if (Args.hasArg(options::OPT_pie))
6807 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6808 else
6809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6810
6811 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6812 }
6813
6814 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6815
6816 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6817 if (D.CCCIsCXX())
6818 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6819
6820 if (Args.hasArg(options::OPT_pthread))
6821 CmdArgs.push_back("-lpthread");
6822
6823 CmdArgs.push_back("-lc");
6824 CmdArgs.push_back("-lcompiler_rt");
6825 }
6826
6827 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6828 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6829
Dan Gohman52816862015-12-16 23:30:41 +00006830 CmdArgs.push_back("-o");
6831 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006832
Dan Gohman52816862015-12-16 23:30:41 +00006833 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6834}
6835
Renato Golin7c542b42015-07-27 23:44:45 +00006836const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006837 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006838 if (!Arch.empty())
6839 MArch = Arch;
6840 else
Bernard Ogden31561762013-12-12 13:27:11 +00006841 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006842 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006843
6844 // Handle -march=native.
6845 if (MArch == "native") {
6846 std::string CPU = llvm::sys::getHostCPUName();
6847 if (CPU != "generic") {
6848 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006849 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006850 // If there is no valid architecture suffix for this CPU we don't know how
6851 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006852 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006853 MArch = "";
6854 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006855 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006856 }
6857 }
6858
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006859 return MArch;
6860}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006861
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006862/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006863StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006864 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006865 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6866 // here means an -march=native that we can't handle, so instead return no CPU.
6867 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006868 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006869
John Brawna95c1a82015-05-08 12:52:18 +00006870 // We need to return an empty string here on invalid MArch values as the
6871 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006872 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006873}
6874
6875/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006876std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006877 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006878 // FIXME: Warn on inconsistent use of -mcpu and -march.
6879 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006880 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006881 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006882 // Handle -mcpu=native.
6883 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006884 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006885 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006886 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006887 }
6888
Renato Goline17c5802015-07-27 23:44:42 +00006889 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006890}
6891
6892/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006893/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006894// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006895StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6896 const llvm::Triple &Triple) {
6897 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006898 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006899 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006900 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006901 if (ArchKind == llvm::ARM::AK_INVALID)
6902 // In case of generic Arch, i.e. "arm",
6903 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006904 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006905 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006906 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6907 // armv7k triple if it's actually been specified via "-arch armv7k".
6908 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006909 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006910 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006911 }
Renato Golin3c007252015-05-28 15:05:53 +00006912 if (ArchKind == llvm::ARM::AK_INVALID)
6913 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006914 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006915}
6916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006917void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006918 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006919 if (Args.hasArg(options::OPT_r))
6920 return;
6921
John Brawn94fd9632015-05-21 12:19:49 +00006922 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6923 // to generate BE-8 executables.
6924 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6925 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006926}
6927
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006928mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006929 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6930 // was first introduced in Release 3. However, other compilers have
6931 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006932 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6933 .Case("mips1", NanLegacy)
6934 .Case("mips2", NanLegacy)
6935 .Case("mips3", NanLegacy)
6936 .Case("mips4", NanLegacy)
6937 .Case("mips5", NanLegacy)
6938 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006939 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006940 .Case("mips32r3", NanLegacy | Nan2008)
6941 .Case("mips32r5", NanLegacy | Nan2008)
6942 .Case("mips32r6", Nan2008)
6943 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006944 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006945 .Case("mips64r3", NanLegacy | Nan2008)
6946 .Case("mips64r5", NanLegacy | Nan2008)
6947 .Case("mips64r6", Nan2008)
6948 .Default(NanLegacy);
6949}
6950
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006951bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6952 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6953 return A && (A->getValue() == StringRef(Value));
6954}
6955
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006956bool mips::isUCLibc(const ArgList &Args) {
6957 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006958 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006959}
6960
Daniel Sanders2bf13662014-07-10 14:40:57 +00006961bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006962 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6963 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006964 .Case("2008", true)
6965 .Case("legacy", false)
6966 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006967
6968 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006969 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006970 .Cases("mips32r6", "mips64r6", true)
6971 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006972
6973 return false;
6974}
6975
Daniel Sanders379d44b2014-07-16 11:52:23 +00006976bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006977 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006978 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006979 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006980 return false;
6981
6982 if (ABIName != "32")
6983 return false;
6984
Toma Tabacu94ea6862015-06-16 13:54:13 +00006985 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6986 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006987 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006988 return false;
6989
Daniel Sanders379d44b2014-07-16 11:52:23 +00006990 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006991 .Cases("mips2", "mips3", "mips4", "mips5", true)
6992 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6993 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6994 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006995}
6996
Toma Tabacu94ea6862015-06-16 13:54:13 +00006997bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6998 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006999 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007000 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7001
7002 // FPXX shouldn't be used if -msingle-float is present.
7003 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7004 options::OPT_mdouble_float))
7005 if (A->getOption().matches(options::OPT_msingle_float))
7006 UseFPXX = false;
7007
7008 return UseFPXX;
7009}
7010
Tim Northover157d9112014-01-16 08:48:16 +00007011llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007012 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7013 // archs which Darwin doesn't use.
7014
7015 // The matching this routine does is fairly pointless, since it is neither the
7016 // complete architecture list, nor a reasonable subset. The problem is that
7017 // historically the driver driver accepts this and also ties its -march=
7018 // handling to the architecture name, so we need to be careful before removing
7019 // support for it.
7020
7021 // This code must be kept in sync with Clang's Darwin specific argument
7022 // translation.
7023
7024 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007025 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7026 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7027 .Case("ppc64", llvm::Triple::ppc64)
7028 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7029 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7030 llvm::Triple::x86)
7031 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7032 // This is derived from the driver driver.
7033 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7034 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7035 .Cases("armv7s", "xscale", llvm::Triple::arm)
7036 .Case("arm64", llvm::Triple::aarch64)
7037 .Case("r600", llvm::Triple::r600)
7038 .Case("amdgcn", llvm::Triple::amdgcn)
7039 .Case("nvptx", llvm::Triple::nvptx)
7040 .Case("nvptx64", llvm::Triple::nvptx64)
7041 .Case("amdil", llvm::Triple::amdil)
7042 .Case("spir", llvm::Triple::spir)
7043 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007044}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007045
Tim Northover157d9112014-01-16 08:48:16 +00007046void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007047 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007048 T.setArch(Arch);
7049
7050 if (Str == "x86_64h")
7051 T.setArchName(Str);
7052 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7053 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007054 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007055 }
7056}
7057
Bob Wilsondecc03e2012-11-23 06:14:39 +00007058const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007059 const InputInfo &Input) {
7060 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007061}
7062
Bob Wilsondecc03e2012-11-23 06:14:39 +00007063const char *Clang::getBaseInputStem(const ArgList &Args,
7064 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007065 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007066
Chris Lattner906bb902011-01-16 08:14:11 +00007067 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007068 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007069
7070 return Str;
7071}
7072
Bob Wilsondecc03e2012-11-23 06:14:39 +00007073const char *Clang::getDependencyFileName(const ArgList &Args,
7074 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007075 // FIXME: Think about this more.
7076 std::string Res;
7077
7078 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007079 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007080 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007081 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007082 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007083 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007084 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007085}
7086
Douglas Katzman95354292015-06-23 20:42:09 +00007087void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7088 const InputInfo &Output,
7089 const InputInfoList &Inputs,
7090 const ArgList &Args,
7091 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007092 const ToolChain &ToolChain = getToolChain();
7093 const Driver &D = ToolChain.getDriver();
7094 ArgStringList CmdArgs;
7095
7096 // Silence warning for "clang -g foo.o -o foo"
7097 Args.ClaimAllArgs(options::OPT_g_Group);
7098 // and "clang -emit-llvm foo.o -o foo"
7099 Args.ClaimAllArgs(options::OPT_emit_llvm);
7100 // and for "clang -w foo.o -o foo". Other warning options are already
7101 // handled somewhere else.
7102 Args.ClaimAllArgs(options::OPT_w);
7103
7104 if (!D.SysRoot.empty())
7105 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7106
7107 // CloudABI only supports static linkage.
7108 CmdArgs.push_back("-Bstatic");
7109 CmdArgs.push_back("--eh-frame-hdr");
7110 CmdArgs.push_back("--gc-sections");
7111
7112 if (Output.isFilename()) {
7113 CmdArgs.push_back("-o");
7114 CmdArgs.push_back(Output.getFilename());
7115 } else {
7116 assert(Output.isNothing() && "Invalid output.");
7117 }
7118
Douglas Katzman78b37b02015-11-17 20:28:07 +00007119 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007120 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7121 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7122 }
7123
7124 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007125 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007126 Args.AddAllArgs(CmdArgs,
7127 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7128 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007129
Teresa Johnson945bc502015-10-15 20:35:53 +00007130 if (D.isUsingLTO())
7131 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007132
7133 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7134
Douglas Katzman78b37b02015-11-17 20:28:07 +00007135 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007136 if (D.CCCIsCXX())
7137 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7138 CmdArgs.push_back("-lc");
7139 CmdArgs.push_back("-lcompiler_rt");
7140 }
7141
Douglas Katzman78b37b02015-11-17 20:28:07 +00007142 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007143 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7144
7145 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007146 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007147}
7148
Douglas Katzman95354292015-06-23 20:42:09 +00007149void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7150 const InputInfo &Output,
7151 const InputInfoList &Inputs,
7152 const ArgList &Args,
7153 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007154 ArgStringList CmdArgs;
7155
7156 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7157 const InputInfo &Input = Inputs[0];
7158
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007159 // Determine the original source input.
7160 const Action *SourceAction = &JA;
7161 while (SourceAction->getKind() != Action::InputClass) {
7162 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7163 SourceAction = SourceAction->getInputs()[0];
7164 }
7165
Eric Christopherf5a8f492015-12-08 00:10:10 +00007166 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007167 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007168 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7169 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007170 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007171 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007172 const llvm::Triple &T(getToolChain().getTriple());
7173 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007174 CmdArgs.push_back("-Q");
7175 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007176
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007177 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007178 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007179 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007180 if (Args.hasArg(options::OPT_gstabs))
7181 CmdArgs.push_back("--gstabs");
7182 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007183 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007184 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007185
Daniel Dunbarbe220842009-03-20 16:06:39 +00007186 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007187 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007188
Daniel Dunbar6d484762010-07-22 01:47:22 +00007189 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007190 if (getToolChain().getArch() == llvm::Triple::x86 ||
7191 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007192 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7193 CmdArgs.push_back("-force_cpusubtype_ALL");
7194
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007195 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007196 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007197 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007198 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007199 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007200 CmdArgs.push_back("-static");
7201
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007202 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007203
7204 assert(Output.isFilename() && "Unexpected lipo output.");
7205 CmdArgs.push_back("-o");
7206 CmdArgs.push_back(Output.getFilename());
7207
Daniel Dunbarb440f562010-08-02 02:38:21 +00007208 assert(Input.isFilename() && "Invalid input.");
7209 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007210
7211 // asm_final spec is empty.
7212
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007213 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007214 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007215}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007216
Tim Northover157d9112014-01-16 08:48:16 +00007217void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007218
Tim Northover157d9112014-01-16 08:48:16 +00007219void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7220 ArgStringList &CmdArgs) const {
7221 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007222
Daniel Dunbarc1964212009-03-26 16:23:12 +00007223 // Derived from darwin_arch spec.
7224 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007225 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007226
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007227 // FIXME: Is this needed anymore?
7228 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007229 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007230}
7231
Douglas Katzman95354292015-06-23 20:42:09 +00007232bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007233 // We only need to generate a temp path for LTO if we aren't compiling object
7234 // files. When compiling source files, we run 'dsymutil' after linking. We
7235 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007236 for (const auto &Input : Inputs)
7237 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007238 return true;
7239
7240 return false;
7241}
7242
Douglas Katzman95354292015-06-23 20:42:09 +00007243void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7244 ArgStringList &CmdArgs,
7245 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007246 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007247 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007248
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007249 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007250 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007251 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007252 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007253 }
7254
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007255 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007256 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007257 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7258 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007259
Bob Wilson3d27dad2013-08-02 22:25:34 +00007260 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7261 CmdArgs.push_back("-export_dynamic");
7262
Bob Wilsonb111ec92015-03-02 19:01:14 +00007263 // If we are using App Extension restrictions, pass a flag to the linker
7264 // telling it that the compiled code has been audited.
7265 if (Args.hasFlag(options::OPT_fapplication_extension,
7266 options::OPT_fno_application_extension, false))
7267 CmdArgs.push_back("-application_extension");
7268
Teresa Johnson945bc502015-10-15 20:35:53 +00007269 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007270 // If we are using LTO, then automatically create a temporary file path for
7271 // the linker to use, so that it's lifetime will extend past a possible
7272 // dsymutil step.
7273 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7274 const char *TmpPath = C.getArgs().MakeArgString(
7275 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7276 C.addTempFile(TmpPath);
7277 CmdArgs.push_back("-object_path_lto");
7278 CmdArgs.push_back(TmpPath);
7279 }
7280
7281 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7282 // it in clang installed libraries. If not found, the option is not used
7283 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7284 if (Version[0] >= 133) {
7285 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7286 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7287 SmallString<128> LibLTOPath(P);
7288 llvm::sys::path::append(LibLTOPath, "lib");
7289 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7290 if (llvm::sys::fs::exists(LibLTOPath)) {
7291 CmdArgs.push_back("-lto_library");
7292 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7293 } else {
7294 D.Diag(diag::warn_drv_lto_libpath);
7295 }
7296 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007297 }
7298
Daniel Dunbarc1964212009-03-26 16:23:12 +00007299 // Derived from the "link" spec.
7300 Args.AddAllArgs(CmdArgs, options::OPT_static);
7301 if (!Args.hasArg(options::OPT_static))
7302 CmdArgs.push_back("-dynamic");
7303 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7304 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7305 // here. How do we wish to handle such things?
7306 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007307
Daniel Dunbarc1964212009-03-26 16:23:12 +00007308 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007309 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007310 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007311 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007312
7313 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7314 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7315 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7316
7317 Arg *A;
7318 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7319 (A = Args.getLastArg(options::OPT_current__version)) ||
7320 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007321 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7322 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007323
7324 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7325 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7326 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7327 } else {
7328 CmdArgs.push_back("-dylib");
7329
7330 Arg *A;
7331 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7332 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7333 (A = Args.getLastArg(options::OPT_client__name)) ||
7334 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7335 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7336 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007337 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7338 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007339
Daniel Dunbarc1964212009-03-26 16:23:12 +00007340 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7341 "-dylib_compatibility_version");
7342 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7343 "-dylib_current_version");
7344
Tim Northover157d9112014-01-16 08:48:16 +00007345 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007346
7347 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7348 "-dylib_install_name");
7349 }
7350
7351 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7352 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7353 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007354 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007355 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007356 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7357 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7358 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7359 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7360 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7361 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007362 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007363 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7364 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7365 Args.AddAllArgs(CmdArgs, options::OPT_init);
7366
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007367 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007368 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007369
Daniel Dunbarc1964212009-03-26 16:23:12 +00007370 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7371 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7372 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7373 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7374 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007375
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007376 if (const Arg *A =
7377 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7378 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007379 if (A->getOption().matches(options::OPT_fpie) ||
7380 A->getOption().matches(options::OPT_fPIE))
7381 CmdArgs.push_back("-pie");
7382 else
7383 CmdArgs.push_back("-no_pie");
7384 }
Steven Wu574b0f22016-03-01 01:07:58 +00007385 // for embed-bitcode, use -bitcode_bundle in linker command
7386 if (C.getDriver().embedBitcodeEnabled() ||
7387 C.getDriver().embedBitcodeMarkerOnly()) {
7388 // Check if the toolchain supports bitcode build flow.
7389 if (MachOTC.SupportsEmbeddedBitcode())
7390 CmdArgs.push_back("-bitcode_bundle");
7391 else
7392 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7393 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007394
7395 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7396 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7397 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7398 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7399 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7400 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7401 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7402 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7403 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7404 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7405 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7406 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7407 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7408 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7409 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7410 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007411
Daniel Dunbar84384642011-05-02 21:03:47 +00007412 // Give --sysroot= preference, over the Apple specific behavior to also use
7413 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007414 StringRef sysroot = C.getSysRoot();
7415 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007416 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007417 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007418 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7419 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007420 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007421 }
7422
Daniel Dunbarc1964212009-03-26 16:23:12 +00007423 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7424 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7425 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7426 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7427 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007428 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007429 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7430 Args.AddAllArgs(CmdArgs, options::OPT_y);
7431 Args.AddLastArg(CmdArgs, options::OPT_w);
7432 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7433 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7434 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7435 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7436 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7437 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7438 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7439 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7440 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7441 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7442 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7443 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7444}
7445
Douglas Katzman95354292015-06-23 20:42:09 +00007446void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7447 const InputInfo &Output,
7448 const InputInfoList &Inputs,
7449 const ArgList &Args,
7450 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007451 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007452
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007453 // If the number of arguments surpasses the system limits, we will encode the
7454 // input files in a separate file, shortening the command line. To this end,
7455 // build a list of input file names that can be passed via a file with the
7456 // -filelist linker option.
7457 llvm::opt::ArgStringList InputFileList;
7458
Daniel Dunbarc1964212009-03-26 16:23:12 +00007459 // The logic here is derived from gcc's behavior; most of which
7460 // comes from specs (starting with link_command). Consult gcc for
7461 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007462 ArgStringList CmdArgs;
7463
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007464 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7465 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7466 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007467 for (const auto &Arg : Args)
7468 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007469 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007470 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007471 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007472 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007473 return;
7474 }
7475
Daniel Dunbarc1964212009-03-26 16:23:12 +00007476 // I'm not sure why this particular decomposition exists in gcc, but
7477 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007478 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007479
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007480 // It seems that the 'e' option is completely ignored for dynamic executables
7481 // (the default), and with static executables, the last one wins, as expected.
7482 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7483 options::OPT_Z_Flag, options::OPT_u_Group,
7484 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007485
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007486 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7487 // members of static archive libraries which implement Objective-C classes or
7488 // categories.
7489 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7490 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007491
Daniel Dunbarc1964212009-03-26 16:23:12 +00007492 CmdArgs.push_back("-o");
7493 CmdArgs.push_back(Output.getFilename());
7494
Douglas Katzman78b37b02015-11-17 20:28:07 +00007495 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007496 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007497
Peter Collingbournec4122c12015-06-15 21:08:13 +00007498 // SafeStack requires its own runtime libraries
7499 // These libraries should be linked first, to make sure the
7500 // __safestack_init constructor executes before everything else
7501 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7502 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7503 "libclang_rt.safestack_osx.a",
7504 /*AlwaysLink=*/true);
7505 }
7506
Daniel Dunbarc1964212009-03-26 16:23:12 +00007507 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007508
Douglas Gregor9295df02012-05-15 21:00:27 +00007509 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007510 // Build the input file for -filelist (list of linker input files) in case we
7511 // need it later
7512 for (const auto &II : Inputs) {
7513 if (!II.isFilename()) {
7514 // This is a linker input argument.
7515 // We cannot mix input arguments and file names in a -filelist input, thus
7516 // we prematurely stop our list (remaining files shall be passed as
7517 // arguments).
7518 if (InputFileList.size() > 0)
7519 break;
7520
7521 continue;
7522 }
7523
7524 InputFileList.push_back(II.getFilename());
7525 }
7526
Douglas Katzman78b37b02015-11-17 20:28:07 +00007527 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007528 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7529
Douglas Katzman78b37b02015-11-17 20:28:07 +00007530 if (isObjCRuntimeLinked(Args) &&
7531 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007532 // We use arclite library for both ARC and subscripting support.
7533 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7534
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007535 CmdArgs.push_back("-framework");
7536 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007537 // Link libobj.
7538 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007539 }
John McCall31168b02011-06-15 23:02:42 +00007540
Daniel Dunbarc1964212009-03-26 16:23:12 +00007541 if (LinkingOutput) {
7542 CmdArgs.push_back("-arch_multiple");
7543 CmdArgs.push_back("-final_output");
7544 CmdArgs.push_back(LinkingOutput);
7545 }
7546
Daniel Dunbarc1964212009-03-26 16:23:12 +00007547 if (Args.hasArg(options::OPT_fnested_functions))
7548 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007549
Justin Bognerc7701242015-05-12 05:44:36 +00007550 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7551
Douglas Katzman78b37b02015-11-17 20:28:07 +00007552 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007553 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007554 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007555
Daniel Dunbarc1964212009-03-26 16:23:12 +00007556 // link_ssp spec is empty.
7557
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007558 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007559 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007560 }
7561
Douglas Katzman78b37b02015-11-17 20:28:07 +00007562 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007563 // endfile_spec is empty.
7564 }
7565
7566 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7567 Args.AddAllArgs(CmdArgs, options::OPT_F);
7568
Steven Wu3ffb61b2015-02-06 18:08:29 +00007569 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007570 for (const Arg *A : Args.filtered(options::OPT_iframework))
7571 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007572
Douglas Katzman78b37b02015-11-17 20:28:07 +00007573 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007574 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7575 if (A->getValue() == StringRef("Accelerate")) {
7576 CmdArgs.push_back("-framework");
7577 CmdArgs.push_back("Accelerate");
7578 }
7579 }
7580 }
7581
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007582 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007583 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007584 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007585 Cmd->setInputFileList(std::move(InputFileList));
7586 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007587}
7588
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007589void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007590 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007591 const InputInfoList &Inputs,
7592 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007593 const char *LinkingOutput) const {
7594 ArgStringList CmdArgs;
7595
7596 CmdArgs.push_back("-create");
7597 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007598
7599 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007600 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007601
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007602 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007603 assert(II.isFilename() && "Unexpected lipo input.");
7604 CmdArgs.push_back(II.getFilename());
7605 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007606
7607 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007608 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007609}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007610
Daniel Dunbar88299622010-06-04 18:28:36 +00007611void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007612 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007613 const InputInfoList &Inputs,
7614 const ArgList &Args,
7615 const char *LinkingOutput) const {
7616 ArgStringList CmdArgs;
7617
Daniel Dunbareb86b042011-05-09 17:23:16 +00007618 CmdArgs.push_back("-o");
7619 CmdArgs.push_back(Output.getFilename());
7620
Daniel Dunbar88299622010-06-04 18:28:36 +00007621 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7622 const InputInfo &Input = Inputs[0];
7623 assert(Input.isFilename() && "Unexpected dsymutil input.");
7624 CmdArgs.push_back(Input.getFilename());
7625
Daniel Dunbar88299622010-06-04 18:28:36 +00007626 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007627 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007628 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007629}
7630
Eric Christopher551ef452011-08-23 17:56:55 +00007631void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007632 const InputInfo &Output,
7633 const InputInfoList &Inputs,
7634 const ArgList &Args,
7635 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007636 ArgStringList CmdArgs;
7637 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007638 CmdArgs.push_back("--debug-info");
7639 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007640 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007641
7642 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7643 const InputInfo &Input = Inputs[0];
7644 assert(Input.isFilename() && "Unexpected verify input");
7645
7646 // Grabbing the output of the earlier dsymutil run.
7647 CmdArgs.push_back(Input.getFilename());
7648
7649 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007650 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007652}
7653
Douglas Katzman95354292015-06-23 20:42:09 +00007654void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007655 const InputInfo &Output,
7656 const InputInfoList &Inputs,
7657 const ArgList &Args,
7658 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007659 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007660 ArgStringList CmdArgs;
7661
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007662 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007663
7664 CmdArgs.push_back("-o");
7665 CmdArgs.push_back(Output.getFilename());
7666
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007667 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007668 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007669
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007670 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007671 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007672}
7673
Douglas Katzman95354292015-06-23 20:42:09 +00007674void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7675 const InputInfo &Output,
7676 const InputInfoList &Inputs,
7677 const ArgList &Args,
7678 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007679 ArgStringList CmdArgs;
7680
David Chisnall272a0712012-02-29 15:06:12 +00007681 // Demangle C++ names in errors
7682 CmdArgs.push_back("-C");
7683
Douglas Katzman78b37b02015-11-17 20:28:07 +00007684 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007685 CmdArgs.push_back("-e");
7686 CmdArgs.push_back("_start");
7687 }
7688
7689 if (Args.hasArg(options::OPT_static)) {
7690 CmdArgs.push_back("-Bstatic");
7691 CmdArgs.push_back("-dn");
7692 } else {
7693 CmdArgs.push_back("-Bdynamic");
7694 if (Args.hasArg(options::OPT_shared)) {
7695 CmdArgs.push_back("-shared");
7696 } else {
7697 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007698 CmdArgs.push_back(
7699 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007700 }
7701 }
7702
7703 if (Output.isFilename()) {
7704 CmdArgs.push_back("-o");
7705 CmdArgs.push_back(Output.getFilename());
7706 } else {
7707 assert(Output.isNothing() && "Invalid output.");
7708 }
7709
Douglas Katzman78b37b02015-11-17 20:28:07 +00007710 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007711 if (!Args.hasArg(options::OPT_shared))
7712 CmdArgs.push_back(
7713 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7714
7715 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7716 CmdArgs.push_back(
7717 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7718 CmdArgs.push_back(
7719 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007720 }
7721
Douglas Katzman6059ef92015-11-17 17:41:23 +00007722 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007723
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007724 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7725 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007726
7727 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7728
Douglas Katzman78b37b02015-11-17 20:28:07 +00007729 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007730 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007731 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007732 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007733 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007734 if (!Args.hasArg(options::OPT_shared)) {
7735 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007736 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007737 }
David Chisnallf571cde2012-02-15 13:39:01 +00007738 }
7739
Douglas Katzman78b37b02015-11-17 20:28:07 +00007740 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007741 CmdArgs.push_back(
7742 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007743 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007744 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007745
Xinliang David Li69306c02015-10-22 06:15:31 +00007746 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007747
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007748 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007749 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007750}
7751
Douglas Katzman95354292015-06-23 20:42:09 +00007752void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7753 const InputInfo &Output,
7754 const InputInfoList &Inputs,
7755 const ArgList &Args,
7756 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007757 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007758 ArgStringList CmdArgs;
7759
Rafael Espindolacc126272014-02-28 01:55:21 +00007760 switch (getToolChain().getArch()) {
7761 case llvm::Triple::x86:
7762 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7763 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007764 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007765 break;
7766
7767 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007768 CmdArgs.push_back("-mppc");
7769 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007770 break;
7771
7772 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007773 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007774 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007775 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7776 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7777 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007778 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007779 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007780
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007781 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007782 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007783 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7784 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7785 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007786 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007787 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007788
7789 case llvm::Triple::mips64:
7790 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007791 StringRef CPUName;
7792 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007793 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007794
7795 CmdArgs.push_back("-mabi");
7796 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7797
7798 if (getToolChain().getArch() == llvm::Triple::mips64)
7799 CmdArgs.push_back("-EB");
7800 else
7801 CmdArgs.push_back("-EL");
7802
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007803 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007804 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007805 }
7806
Rafael Espindolacc126272014-02-28 01:55:21 +00007807 default:
7808 break;
7809 }
7810
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007811 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007812
7813 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007814 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007815
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007816 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007817 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007818
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007819 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007820 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007821}
7822
Douglas Katzman95354292015-06-23 20:42:09 +00007823void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7824 const InputInfo &Output,
7825 const InputInfoList &Inputs,
7826 const ArgList &Args,
7827 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007828 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007829 ArgStringList CmdArgs;
7830
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007831 // Silence warning for "clang -g foo.o -o foo"
7832 Args.ClaimAllArgs(options::OPT_g_Group);
7833 // and "clang -emit-llvm foo.o -o foo"
7834 Args.ClaimAllArgs(options::OPT_emit_llvm);
7835 // and for "clang -w foo.o -o foo". Other warning options are already
7836 // handled somewhere else.
7837 Args.ClaimAllArgs(options::OPT_w);
7838
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007839 if (getToolChain().getArch() == llvm::Triple::mips64)
7840 CmdArgs.push_back("-EB");
7841 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7842 CmdArgs.push_back("-EL");
7843
Douglas Katzman78b37b02015-11-17 20:28:07 +00007844 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007845 CmdArgs.push_back("-e");
7846 CmdArgs.push_back("__start");
7847 }
7848
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007849 if (Args.hasArg(options::OPT_static)) {
7850 CmdArgs.push_back("-Bstatic");
7851 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007852 if (Args.hasArg(options::OPT_rdynamic))
7853 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007854 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007855 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007856 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007857 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007858 } else {
7859 CmdArgs.push_back("-dynamic-linker");
7860 CmdArgs.push_back("/usr/libexec/ld.so");
7861 }
7862 }
7863
Rafael Espindola044f7832013-06-05 04:28:55 +00007864 if (Args.hasArg(options::OPT_nopie))
7865 CmdArgs.push_back("-nopie");
7866
Daniel Dunbarb440f562010-08-02 02:38:21 +00007867 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007868 CmdArgs.push_back("-o");
7869 CmdArgs.push_back(Output.getFilename());
7870 } else {
7871 assert(Output.isNothing() && "Invalid output.");
7872 }
7873
Douglas Katzman78b37b02015-11-17 20:28:07 +00007874 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007875 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007876 if (Args.hasArg(options::OPT_pg))
7877 CmdArgs.push_back(
7878 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007879 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007880 CmdArgs.push_back(
7881 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7882 CmdArgs.push_back(
7883 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007884 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007885 CmdArgs.push_back(
7886 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007887 }
7888 }
7889
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007890 std::string Triple = getToolChain().getTripleString();
7891 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007892 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007893 CmdArgs.push_back(
7894 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007895
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007896 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7897 options::OPT_e, options::OPT_s, options::OPT_t,
7898 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007899
Daniel Dunbar54423b22010-09-17 00:24:54 +00007900 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007901
Douglas Katzman78b37b02015-11-17 20:28:07 +00007902 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007903 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007904 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007905 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007906 CmdArgs.push_back("-lm_p");
7907 else
7908 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007909 }
7910
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007911 // FIXME: For some reason GCC passes -lgcc before adding
7912 // the default system libraries. Just mimic this for now.
7913 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007914
Eric Christopher17674ec2012-09-13 06:32:34 +00007915 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007916 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7917 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007918 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007919 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007920 }
7921
Chandler Carruth45661652011-12-17 22:32:42 +00007922 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007923 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007924 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007925 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007926 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007927 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007928
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007929 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007930 }
7931
Douglas Katzman78b37b02015-11-17 20:28:07 +00007932 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007933 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007934 CmdArgs.push_back(
7935 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007936 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007937 CmdArgs.push_back(
7938 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007939 }
7940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007941 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007942 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007943}
Ed Schoutene33194b2009-04-02 19:13:12 +00007944
Douglas Katzman95354292015-06-23 20:42:09 +00007945void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7946 const InputInfo &Output,
7947 const InputInfoList &Inputs,
7948 const ArgList &Args,
7949 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007950 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007951 ArgStringList CmdArgs;
7952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007953 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007954
7955 CmdArgs.push_back("-o");
7956 CmdArgs.push_back(Output.getFilename());
7957
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007958 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007959 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007960
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007961 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007962 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007963}
7964
Douglas Katzman95354292015-06-23 20:42:09 +00007965void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7966 const InputInfo &Output,
7967 const InputInfoList &Inputs,
7968 const ArgList &Args,
7969 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007970 const Driver &D = getToolChain().getDriver();
7971 ArgStringList CmdArgs;
7972
Douglas Katzman78b37b02015-11-17 20:28:07 +00007973 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007974 CmdArgs.push_back("-e");
7975 CmdArgs.push_back("__start");
7976 }
7977
7978 if (Args.hasArg(options::OPT_static)) {
7979 CmdArgs.push_back("-Bstatic");
7980 } else {
7981 if (Args.hasArg(options::OPT_rdynamic))
7982 CmdArgs.push_back("-export-dynamic");
7983 CmdArgs.push_back("--eh-frame-hdr");
7984 CmdArgs.push_back("-Bdynamic");
7985 if (Args.hasArg(options::OPT_shared)) {
7986 CmdArgs.push_back("-shared");
7987 } else {
7988 CmdArgs.push_back("-dynamic-linker");
7989 CmdArgs.push_back("/usr/libexec/ld.so");
7990 }
7991 }
7992
7993 if (Output.isFilename()) {
7994 CmdArgs.push_back("-o");
7995 CmdArgs.push_back(Output.getFilename());
7996 } else {
7997 assert(Output.isNothing() && "Invalid output.");
7998 }
7999
Douglas Katzman78b37b02015-11-17 20:28:07 +00008000 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008001 if (!Args.hasArg(options::OPT_shared)) {
8002 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008003 CmdArgs.push_back(
8004 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008005 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008006 CmdArgs.push_back(
8007 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8008 CmdArgs.push_back(
8009 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008010 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008011 CmdArgs.push_back(
8012 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008013 }
8014 }
8015
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008016 Args.AddAllArgs(CmdArgs,
8017 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008018
8019 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8020
Douglas Katzman78b37b02015-11-17 20:28:07 +00008021 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008022 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008023 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8024 if (Args.hasArg(options::OPT_pg))
8025 CmdArgs.push_back("-lm_p");
8026 else
8027 CmdArgs.push_back("-lm");
8028 }
8029
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008030 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008031 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008032 CmdArgs.push_back("-lpthread_p");
8033 else
8034 CmdArgs.push_back("-lpthread");
8035 }
8036
Eli Friedman9fa28852012-08-08 23:57:20 +00008037 if (!Args.hasArg(options::OPT_shared)) {
8038 if (Args.hasArg(options::OPT_pg))
8039 CmdArgs.push_back("-lc_p");
8040 else
8041 CmdArgs.push_back("-lc");
8042 }
8043
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008044 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008045 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008046 case llvm::Triple::arm:
8047 MyArch = "arm";
8048 break;
8049 case llvm::Triple::x86:
8050 MyArch = "i386";
8051 break;
8052 case llvm::Triple::x86_64:
8053 MyArch = "amd64";
8054 break;
8055 default:
8056 llvm_unreachable("Unsupported architecture");
8057 }
8058 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008059 }
8060
Douglas Katzman78b37b02015-11-17 20:28:07 +00008061 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008062 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008063 CmdArgs.push_back(
8064 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008065 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008066 CmdArgs.push_back(
8067 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008068 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008070 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008071 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008072}
8073
Douglas Katzman95354292015-06-23 20:42:09 +00008074void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8075 const InputInfo &Output,
8076 const InputInfoList &Inputs,
8077 const ArgList &Args,
8078 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008079 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008080 ArgStringList CmdArgs;
8081
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008082 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8083 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008084 switch (getToolChain().getArch()) {
8085 default:
8086 break;
8087 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008088 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008089 break;
8090 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008091 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008092 break;
8093 case llvm::Triple::mips:
8094 case llvm::Triple::mipsel:
8095 case llvm::Triple::mips64:
8096 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008097 StringRef CPUName;
8098 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008099 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008100
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008101 CmdArgs.push_back("-march");
8102 CmdArgs.push_back(CPUName.data());
8103
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008104 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008105 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008106
8107 if (getToolChain().getArch() == llvm::Triple::mips ||
8108 getToolChain().getArch() == llvm::Triple::mips64)
8109 CmdArgs.push_back("-EB");
8110 else
8111 CmdArgs.push_back("-EL");
8112
Dimitry Andric46f338c2015-12-27 10:36:44 +00008113 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8114 StringRef v = A->getValue();
8115 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8116 A->claim();
8117 }
8118
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008119 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008120 break;
8121 }
8122 case llvm::Triple::arm:
8123 case llvm::Triple::armeb:
8124 case llvm::Triple::thumb:
8125 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008126 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008127
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008128 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008129 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008130 else
Renato Golinf4421f72014-02-19 10:44:07 +00008131 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008133 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008134 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008135 case llvm::Triple::GNUEABI:
8136 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008137 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008138 break;
8139
8140 default:
8141 CmdArgs.push_back("-matpcs");
8142 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008143 break;
8144 }
8145 case llvm::Triple::sparc:
8146 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008147 case llvm::Triple::sparcv9: {
8148 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8149 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008150 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008151 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008152 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008153 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008155 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008156
8157 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008158 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008159
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008160 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008161 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008162
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008163 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008164 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008165}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008166
Douglas Katzman95354292015-06-23 20:42:09 +00008167void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8168 const InputInfo &Output,
8169 const InputInfoList &Inputs,
8170 const ArgList &Args,
8171 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008172 const toolchains::FreeBSD &ToolChain =
8173 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008174 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008175 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008176 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008177 !Args.hasArg(options::OPT_shared) &&
8178 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008179 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008180
8181 // Silence warning for "clang -g foo.o -o foo"
8182 Args.ClaimAllArgs(options::OPT_g_Group);
8183 // and "clang -emit-llvm foo.o -o foo"
8184 Args.ClaimAllArgs(options::OPT_emit_llvm);
8185 // and for "clang -w foo.o -o foo". Other warning options are already
8186 // handled somewhere else.
8187 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008188
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008189 if (!D.SysRoot.empty())
8190 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8191
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008192 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008193 CmdArgs.push_back("-pie");
8194
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008195 if (Args.hasArg(options::OPT_static)) {
8196 CmdArgs.push_back("-Bstatic");
8197 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008198 if (Args.hasArg(options::OPT_rdynamic))
8199 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008200 CmdArgs.push_back("--eh-frame-hdr");
8201 if (Args.hasArg(options::OPT_shared)) {
8202 CmdArgs.push_back("-Bshareable");
8203 } else {
8204 CmdArgs.push_back("-dynamic-linker");
8205 CmdArgs.push_back("/libexec/ld-elf.so.1");
8206 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008207 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008208 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8209 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8210 CmdArgs.push_back("--hash-style=both");
8211 }
8212 }
8213 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008214 }
8215
8216 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8217 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008218 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008219 CmdArgs.push_back("-m");
8220 CmdArgs.push_back("elf_i386_fbsd");
8221 }
8222
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008223 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008224 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008225 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008226 }
8227
Dimitry Andric904895f2015-12-27 06:47:09 +00008228 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8229 if (ToolChain.getArch() == llvm::Triple::mips ||
8230 ToolChain.getArch() == llvm::Triple::mipsel ||
8231 ToolChain.getArch() == llvm::Triple::mips64 ||
8232 ToolChain.getArch() == llvm::Triple::mips64el) {
8233 StringRef v = A->getValue();
8234 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8235 A->claim();
8236 }
8237 }
8238
Daniel Dunbarb440f562010-08-02 02:38:21 +00008239 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008240 CmdArgs.push_back("-o");
8241 CmdArgs.push_back(Output.getFilename());
8242 } else {
8243 assert(Output.isNothing() && "Invalid output.");
8244 }
8245
Douglas Katzman78b37b02015-11-17 20:28:07 +00008246 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008247 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008248 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008249 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008250 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008251 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008252 crt1 = "Scrt1.o";
8253 else
8254 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008255 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008256 if (crt1)
8257 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8258
8259 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8260
Craig Topper92fc2df2014-05-17 16:56:41 +00008261 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008262 if (Args.hasArg(options::OPT_static))
8263 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008264 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008265 crtbegin = "crtbeginS.o";
8266 else
8267 crtbegin = "crtbegin.o";
8268
8269 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008270 }
8271
8272 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008273 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008274 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8275 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008276 Args.AddAllArgs(CmdArgs, options::OPT_s);
8277 Args.AddAllArgs(CmdArgs, options::OPT_t);
8278 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8279 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008280
Teresa Johnson945bc502015-10-15 20:35:53 +00008281 if (D.isUsingLTO())
8282 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008283
Alexey Samsonov52550342014-09-15 19:58:40 +00008284 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008285 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008286
Douglas Katzman78b37b02015-11-17 20:28:07 +00008287 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008288 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008289 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008290 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008291 if (Args.hasArg(options::OPT_pg))
8292 CmdArgs.push_back("-lm_p");
8293 else
8294 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008295 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008296 if (NeedsSanitizerDeps)
8297 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008298 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8299 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008300 if (Args.hasArg(options::OPT_pg))
8301 CmdArgs.push_back("-lgcc_p");
8302 else
8303 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008304 if (Args.hasArg(options::OPT_static)) {
8305 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008306 } else if (Args.hasArg(options::OPT_pg)) {
8307 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008308 } else {
8309 CmdArgs.push_back("--as-needed");
8310 CmdArgs.push_back("-lgcc_s");
8311 CmdArgs.push_back("--no-as-needed");
8312 }
8313
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008314 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008315 if (Args.hasArg(options::OPT_pg))
8316 CmdArgs.push_back("-lpthread_p");
8317 else
8318 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008319 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008320
Roman Divacky66f22762011-02-10 16:59:40 +00008321 if (Args.hasArg(options::OPT_pg)) {
8322 if (Args.hasArg(options::OPT_shared))
8323 CmdArgs.push_back("-lc");
8324 else
8325 CmdArgs.push_back("-lc_p");
8326 CmdArgs.push_back("-lgcc_p");
8327 } else {
8328 CmdArgs.push_back("-lc");
8329 CmdArgs.push_back("-lgcc");
8330 }
8331
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008332 if (Args.hasArg(options::OPT_static)) {
8333 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008334 } else if (Args.hasArg(options::OPT_pg)) {
8335 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008336 } else {
8337 CmdArgs.push_back("--as-needed");
8338 CmdArgs.push_back("-lgcc_s");
8339 CmdArgs.push_back("--no-as-needed");
8340 }
8341 }
8342
Douglas Katzman78b37b02015-11-17 20:28:07 +00008343 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008344 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008345 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008346 else
8347 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008348 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008349 }
8350
Xinliang David Li69306c02015-10-22 06:15:31 +00008351 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008352
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008353 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008354 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008355}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008356
Douglas Katzman95354292015-06-23 20:42:09 +00008357void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008358 const InputInfo &Output,
8359 const InputInfoList &Inputs,
8360 const ArgList &Args,
8361 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008362 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008363 ArgStringList CmdArgs;
8364
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008365 // GNU as needs different flags for creating the correct output format
8366 // on architectures with different ABIs or optional feature sets.
8367 switch (getToolChain().getArch()) {
8368 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008369 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008370 break;
8371 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008372 case llvm::Triple::armeb:
8373 case llvm::Triple::thumb:
8374 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008375 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008376 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8377 std::string Arch =
8378 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008379 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008380 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008381 }
8382
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008383 case llvm::Triple::mips:
8384 case llvm::Triple::mipsel:
8385 case llvm::Triple::mips64:
8386 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008387 StringRef CPUName;
8388 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008389 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008390
8391 CmdArgs.push_back("-march");
8392 CmdArgs.push_back(CPUName.data());
8393
8394 CmdArgs.push_back("-mabi");
8395 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8396
8397 if (getToolChain().getArch() == llvm::Triple::mips ||
8398 getToolChain().getArch() == llvm::Triple::mips64)
8399 CmdArgs.push_back("-EB");
8400 else
8401 CmdArgs.push_back("-EL");
8402
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008403 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008404 break;
8405 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008406
8407 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008408 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008409 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008410 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8411 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008412 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008413 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008414 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008415
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008416 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008417 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008418 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8419 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008420 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008421 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008422 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008423
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008424 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008425 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008426 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008427
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008428 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008429
8430 CmdArgs.push_back("-o");
8431 CmdArgs.push_back(Output.getFilename());
8432
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008433 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008434 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008435
David Chisnallddbd68f2011-09-27 22:03:18 +00008436 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008437 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008438}
8439
Douglas Katzman95354292015-06-23 20:42:09 +00008440void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8441 const InputInfo &Output,
8442 const InputInfoList &Inputs,
8443 const ArgList &Args,
8444 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008445 const Driver &D = getToolChain().getDriver();
8446 ArgStringList CmdArgs;
8447
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008448 if (!D.SysRoot.empty())
8449 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8450
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008451 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008452 if (Args.hasArg(options::OPT_static)) {
8453 CmdArgs.push_back("-Bstatic");
8454 } else {
8455 if (Args.hasArg(options::OPT_rdynamic))
8456 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008457 if (Args.hasArg(options::OPT_shared)) {
8458 CmdArgs.push_back("-Bshareable");
8459 } else {
8460 CmdArgs.push_back("-dynamic-linker");
8461 CmdArgs.push_back("/libexec/ld.elf_so");
8462 }
8463 }
8464
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008465 // Many NetBSD architectures support more than one ABI.
8466 // Determine the correct emulation for ld.
8467 switch (getToolChain().getArch()) {
8468 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008469 CmdArgs.push_back("-m");
8470 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008471 break;
8472 case llvm::Triple::arm:
8473 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008474 CmdArgs.push_back("-m");
8475 switch (getToolChain().getTriple().getEnvironment()) {
8476 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008477 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008478 CmdArgs.push_back("armelf_nbsd_eabi");
8479 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008480 case llvm::Triple::EABIHF:
8481 case llvm::Triple::GNUEABIHF:
8482 CmdArgs.push_back("armelf_nbsd_eabihf");
8483 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008484 default:
8485 CmdArgs.push_back("armelf_nbsd");
8486 break;
8487 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008488 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008489 case llvm::Triple::armeb:
8490 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008491 arm::appendEBLinkFlags(
8492 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008493 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008494 CmdArgs.push_back("-m");
8495 switch (getToolChain().getTriple().getEnvironment()) {
8496 case llvm::Triple::EABI:
8497 case llvm::Triple::GNUEABI:
8498 CmdArgs.push_back("armelfb_nbsd_eabi");
8499 break;
8500 case llvm::Triple::EABIHF:
8501 case llvm::Triple::GNUEABIHF:
8502 CmdArgs.push_back("armelfb_nbsd_eabihf");
8503 break;
8504 default:
8505 CmdArgs.push_back("armelfb_nbsd");
8506 break;
8507 }
8508 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008509 case llvm::Triple::mips64:
8510 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008511 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008512 CmdArgs.push_back("-m");
8513 if (getToolChain().getArch() == llvm::Triple::mips64)
8514 CmdArgs.push_back("elf32btsmip");
8515 else
8516 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008517 } else if (mips::hasMipsAbiArg(Args, "64")) {
8518 CmdArgs.push_back("-m");
8519 if (getToolChain().getArch() == llvm::Triple::mips64)
8520 CmdArgs.push_back("elf64btsmip");
8521 else
8522 CmdArgs.push_back("elf64ltsmip");
8523 }
8524 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008525 case llvm::Triple::ppc:
8526 CmdArgs.push_back("-m");
8527 CmdArgs.push_back("elf32ppc_nbsd");
8528 break;
8529
8530 case llvm::Triple::ppc64:
8531 case llvm::Triple::ppc64le:
8532 CmdArgs.push_back("-m");
8533 CmdArgs.push_back("elf64ppc");
8534 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008535
8536 case llvm::Triple::sparc:
8537 CmdArgs.push_back("-m");
8538 CmdArgs.push_back("elf32_sparc");
8539 break;
8540
8541 case llvm::Triple::sparcv9:
8542 CmdArgs.push_back("-m");
8543 CmdArgs.push_back("elf64_sparc");
8544 break;
8545
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008546 default:
8547 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008548 }
8549
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008550 if (Output.isFilename()) {
8551 CmdArgs.push_back("-o");
8552 CmdArgs.push_back(Output.getFilename());
8553 } else {
8554 assert(Output.isNothing() && "Invalid output.");
8555 }
8556
Douglas Katzman78b37b02015-11-17 20:28:07 +00008557 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008558 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008559 CmdArgs.push_back(
8560 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8561 CmdArgs.push_back(
8562 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8563 CmdArgs.push_back(
8564 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008565 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008566 CmdArgs.push_back(
8567 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8568 CmdArgs.push_back(
8569 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008570 }
8571 }
8572
8573 Args.AddAllArgs(CmdArgs, options::OPT_L);
8574 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8575 Args.AddAllArgs(CmdArgs, options::OPT_e);
8576 Args.AddAllArgs(CmdArgs, options::OPT_s);
8577 Args.AddAllArgs(CmdArgs, options::OPT_t);
8578 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8579 Args.AddAllArgs(CmdArgs, options::OPT_r);
8580
8581 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8582
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008583 unsigned Major, Minor, Micro;
8584 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8585 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008586 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008587 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008588 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008589 case llvm::Triple::arm:
8590 case llvm::Triple::armeb:
8591 case llvm::Triple::thumb:
8592 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008593 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008594 case llvm::Triple::ppc64:
8595 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008596 case llvm::Triple::sparc:
8597 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008598 case llvm::Triple::x86:
8599 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008600 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008601 break;
8602 default:
8603 break;
8604 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008605 }
8606
Douglas Katzman78b37b02015-11-17 20:28:07 +00008607 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008608 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008609 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008610 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8611 CmdArgs.push_back("-lm");
8612 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008613 if (Args.hasArg(options::OPT_pthread))
8614 CmdArgs.push_back("-lpthread");
8615 CmdArgs.push_back("-lc");
8616
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008617 if (useLibgcc) {
8618 if (Args.hasArg(options::OPT_static)) {
8619 // libgcc_eh depends on libc, so resolve as much as possible,
8620 // pull in any new requirements from libc and then get the rest
8621 // of libgcc.
8622 CmdArgs.push_back("-lgcc_eh");
8623 CmdArgs.push_back("-lc");
8624 CmdArgs.push_back("-lgcc");
8625 } else {
8626 CmdArgs.push_back("-lgcc");
8627 CmdArgs.push_back("--as-needed");
8628 CmdArgs.push_back("-lgcc_s");
8629 CmdArgs.push_back("--no-as-needed");
8630 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008631 }
8632 }
8633
Douglas Katzman78b37b02015-11-17 20:28:07 +00008634 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008635 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008636 CmdArgs.push_back(
8637 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008638 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008639 CmdArgs.push_back(
8640 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8641 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008642 }
8643
Xinliang David Li69306c02015-10-22 06:15:31 +00008644 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008645
Logan Chieneb9162f2014-06-26 14:23:45 +00008646 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008648}
8649
Douglas Katzman95354292015-06-23 20:42:09 +00008650void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8651 const InputInfo &Output,
8652 const InputInfoList &Inputs,
8653 const ArgList &Args,
8654 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008655 claimNoWarnArgs(Args);
8656
James Y Knight2db38f32015-08-15 03:45:25 +00008657 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8658 llvm::Triple Triple = llvm::Triple(TripleStr);
8659
Rafael Espindola92b00932010-08-10 00:25:48 +00008660 ArgStringList CmdArgs;
8661
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008662 llvm::Reloc::Model RelocationModel;
8663 unsigned PICLevel;
8664 bool IsPIE;
8665 std::tie(RelocationModel, PICLevel, IsPIE) =
8666 ParsePICArgs(getToolChain(), Triple, Args);
8667
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008668 switch (getToolChain().getArch()) {
8669 default:
8670 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008671 // Add --32/--64 to make sure we get the format we want.
8672 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008673 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008674 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008675 break;
8676 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008677 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8678 CmdArgs.push_back("--x32");
8679 else
8680 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008681 break;
8682 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008683 CmdArgs.push_back("-a32");
8684 CmdArgs.push_back("-mppc");
8685 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008686 break;
8687 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008688 CmdArgs.push_back("-a64");
8689 CmdArgs.push_back("-mppc64");
8690 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008691 break;
8692 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008693 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008694 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008695 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008696 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008697 break;
8698 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008699 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008700 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008701 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8702 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8703 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008704 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008705 }
8706 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008707 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008708 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8709 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8710 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008711 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008712 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008713 case llvm::Triple::arm:
8714 case llvm::Triple::armeb:
8715 case llvm::Triple::thumb:
8716 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008717 const llvm::Triple &Triple2 = getToolChain().getTriple();
8718 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008719 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008720 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008721 break;
8722 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008723 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008724 break;
8725 default:
8726 break;
8727 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008728
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008729 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008730 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8731 case arm::FloatABI::Soft:
8732 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8733 break;
8734 case arm::FloatABI::SoftFP:
8735 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8736 break;
8737 case arm::FloatABI::Hard:
8738 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8739 break;
8740 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008741
8742 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008743
8744 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008745 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008746 // march from being picked in the absence of a cpu flag.
8747 Arg *A;
8748 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008749 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008750 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008751 else
8752 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008753 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008754 break;
8755 }
8756 case llvm::Triple::mips:
8757 case llvm::Triple::mipsel:
8758 case llvm::Triple::mips64:
8759 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008760 StringRef CPUName;
8761 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008762 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008763 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008764
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008765 CmdArgs.push_back("-march");
8766 CmdArgs.push_back(CPUName.data());
8767
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008768 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008769 CmdArgs.push_back(ABIName.data());
8770
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008771 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8772 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008773 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008774 CmdArgs.push_back("-mno-shared");
8775
Daniel Sanders379d44b2014-07-16 11:52:23 +00008776 // LLVM doesn't support -mplt yet and acts as if it is always given.
8777 // However, -mplt has no effect with the N64 ABI.
8778 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008779
8780 if (getToolChain().getArch() == llvm::Triple::mips ||
8781 getToolChain().getArch() == llvm::Triple::mips64)
8782 CmdArgs.push_back("-EB");
8783 else
8784 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008785
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008786 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8787 if (StringRef(A->getValue()) == "2008")
8788 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8789 }
8790
Daniel Sanders379d44b2014-07-16 11:52:23 +00008791 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8792 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8793 options::OPT_mfp64)) {
8794 A->claim();
8795 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008796 } else if (mips::shouldUseFPXX(
8797 Args, getToolChain().getTriple(), CPUName, ABIName,
8798 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008799 CmdArgs.push_back("-mfpxx");
8800
8801 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8802 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008803 if (Arg *A =
8804 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008805 if (A->getOption().matches(options::OPT_mips16)) {
8806 A->claim();
8807 A->render(Args, CmdArgs);
8808 } else {
8809 A->claim();
8810 CmdArgs.push_back("-no-mips16");
8811 }
8812 }
8813
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008814 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8815 options::OPT_mno_micromips);
8816 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8817 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8818
Simon Atanasyanbd986632013-11-26 11:58:04 +00008819 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8820 // Do not use AddLastArg because not all versions of MIPS assembler
8821 // support -mmsa / -mno-msa options.
8822 if (A->getOption().matches(options::OPT_mmsa))
8823 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8824 }
8825
Daniel Sanders379d44b2014-07-16 11:52:23 +00008826 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8827 options::OPT_msoft_float);
8828
Toma Tabacub36d6102015-06-11 12:13:18 +00008829 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8830 options::OPT_msingle_float);
8831
Daniel Sanders379d44b2014-07-16 11:52:23 +00008832 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8833 options::OPT_mno_odd_spreg);
8834
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008835 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008836 break;
8837 }
8838 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008839 // Always pass an -march option, since our default of z10 is later
8840 // than the GNU assembler's default.
8841 StringRef CPUName = getSystemZTargetCPU(Args);
8842 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008843 break;
8844 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008845 }
8846
Renato Golina74bbc72015-07-22 15:32:36 +00008847 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008848 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008849
8850 CmdArgs.push_back("-o");
8851 CmdArgs.push_back(Output.getFilename());
8852
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008853 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008854 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008855
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008856 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008857 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008858
8859 // Handle the debug info splitting at object creation time if we're
8860 // creating an object.
8861 // TODO: Currently only works on linux with newer objcopy.
8862 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008863 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008864 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008865 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008866}
8867
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008868static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008869 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008870 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008871 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008872 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8873 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008874 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008875 CmdArgs.push_back("-lgcc");
8876
Logan Chien3d3373c2012-11-19 12:04:11 +00008877 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008878 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008879 CmdArgs.push_back("-lgcc");
8880 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008881 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008882 CmdArgs.push_back("--as-needed");
8883 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008884 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008885 CmdArgs.push_back("--no-as-needed");
8886 }
8887
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008888 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008889 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008890 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008891 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008892
8893 // According to Android ABI, we have to link with libdl if we are
8894 // linking with non-static libgcc.
8895 //
8896 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8897 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8898 if (isAndroid && !StaticLibgcc)
8899 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008900}
8901
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008902static std::string getLinuxDynamicLinker(const ArgList &Args,
8903 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008904 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8905
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008906 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008907 if (ToolChain.getTriple().isArch64Bit())
8908 return "/system/bin/linker64";
8909 else
8910 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008911 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8912 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008913 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008914 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008915 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008916 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008917 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008918 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008919 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008920 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008921 return "/lib/ld-linux-armhf.so.3";
8922 else
8923 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008924 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8925 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008926 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008927 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008928 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008929 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008930 return "/lib/ld-linux.so.3";
8931 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8932 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008933 std::string LibDir =
8934 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008935 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008936 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008937 if (mips::isUCLibc(Args))
8938 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008939 else if (!ToolChain.getTriple().hasEnvironment()) {
8940 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8941 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8942 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8943 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008944 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008945
8946 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008947 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008948 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008949 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008950 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8951 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008952 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008953 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008954 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8955 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008956 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008957 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008958 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008959 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008960 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008961 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008962 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8963 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008964 else
8965 return "/lib64/ld-linux-x86-64.so.2";
8966}
8967
Renato Golinc4b49242014-02-13 10:01:16 +00008968static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008969 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008970 // Make use of compiler-rt if --rtlib option is used
8971 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8972
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008973 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008974 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008975 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008976 default:
8977 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008978 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008979 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008980 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008981 break;
8982 }
Renato Golinc4b49242014-02-13 10:01:16 +00008983 break;
8984 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008985 // Make sure libgcc is not used under MSVC environment by default
8986 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8987 // Issue error diagnostic if libgcc is explicitly specified
8988 // through command line as --rtlib option argument.
8989 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8990 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8991 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8992 }
8993 } else
8994 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008995 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008996 }
8997}
8998
Rafael Espindola1e085772014-08-15 17:14:35 +00008999static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9000 switch (T.getArch()) {
9001 case llvm::Triple::x86:
9002 return "elf_i386";
9003 case llvm::Triple::aarch64:
9004 return "aarch64linux";
9005 case llvm::Triple::aarch64_be:
9006 return "aarch64_be_linux";
9007 case llvm::Triple::arm:
9008 case llvm::Triple::thumb:
9009 return "armelf_linux_eabi";
9010 case llvm::Triple::armeb:
9011 case llvm::Triple::thumbeb:
9012 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9013 case llvm::Triple::ppc:
9014 return "elf32ppclinux";
9015 case llvm::Triple::ppc64:
9016 return "elf64ppc";
9017 case llvm::Triple::ppc64le:
9018 return "elf64lppc";
9019 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009020 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009021 return "elf32_sparc";
9022 case llvm::Triple::sparcv9:
9023 return "elf64_sparc";
9024 case llvm::Triple::mips:
9025 return "elf32btsmip";
9026 case llvm::Triple::mipsel:
9027 return "elf32ltsmip";
9028 case llvm::Triple::mips64:
9029 if (mips::hasMipsAbiArg(Args, "n32"))
9030 return "elf32btsmipn32";
9031 return "elf64btsmip";
9032 case llvm::Triple::mips64el:
9033 if (mips::hasMipsAbiArg(Args, "n32"))
9034 return "elf32ltsmipn32";
9035 return "elf64ltsmip";
9036 case llvm::Triple::systemz:
9037 return "elf64_s390";
9038 case llvm::Triple::x86_64:
9039 if (T.getEnvironment() == llvm::Triple::GNUX32)
9040 return "elf32_x86_64";
9041 return "elf_x86_64";
9042 default:
9043 llvm_unreachable("Unexpected arch");
9044 }
9045}
9046
Douglas Katzman95354292015-06-23 20:42:09 +00009047void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9048 const InputInfo &Output,
9049 const InputInfoList &Inputs,
9050 const ArgList &Args,
9051 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009052 const toolchains::Linux &ToolChain =
9053 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009054 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009055
9056 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9057 llvm::Triple Triple = llvm::Triple(TripleStr);
9058
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009059 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009060 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009061 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009062 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9063 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009064 const bool HasCRTBeginEndFiles =
9065 ToolChain.getTriple().hasEnvironment() ||
9066 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009067
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009068 ArgStringList CmdArgs;
9069
Rafael Espindolad1002f62010-11-15 18:28:16 +00009070 // Silence warning for "clang -g foo.o -o foo"
9071 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009072 // and "clang -emit-llvm foo.o -o foo"
9073 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009074 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009075 // handled somewhere else.
9076 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009077
Peter Collingbourne39719a72015-11-20 20:49:39 +00009078 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9079 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009080 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009081 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009082 CmdArgs.push_back("-target");
9083 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9084 }
9085
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009086 if (!D.SysRoot.empty())
9087 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009088
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009089 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009090 CmdArgs.push_back("-pie");
9091
Rafael Espindola1c76c592010-11-07 22:57:16 +00009092 if (Args.hasArg(options::OPT_rdynamic))
9093 CmdArgs.push_back("-export-dynamic");
9094
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009095 if (Args.hasArg(options::OPT_s))
9096 CmdArgs.push_back("-s");
9097
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009098 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009099 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009100
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009101 for (const auto &Opt : ToolChain.ExtraOpts)
9102 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009103
9104 if (!Args.hasArg(options::OPT_static)) {
9105 CmdArgs.push_back("--eh-frame-hdr");
9106 }
9107
9108 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009109 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009110
9111 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009112 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9113 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009114 CmdArgs.push_back("-Bstatic");
9115 else
9116 CmdArgs.push_back("-static");
9117 } else if (Args.hasArg(options::OPT_shared)) {
9118 CmdArgs.push_back("-shared");
9119 }
9120
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009121 if (!Args.hasArg(options::OPT_static)) {
9122 if (Args.hasArg(options::OPT_rdynamic))
9123 CmdArgs.push_back("-export-dynamic");
9124
9125 if (!Args.hasArg(options::OPT_shared)) {
9126 const std::string Loader =
9127 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9128 CmdArgs.push_back("-dynamic-linker");
9129 CmdArgs.push_back(Args.MakeArgString(Loader));
9130 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009131 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009132
9133 CmdArgs.push_back("-o");
9134 CmdArgs.push_back(Output.getFilename());
9135
Douglas Katzman78b37b02015-11-17 20:28:07 +00009136 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009137 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009138 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009139 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009140 if (Args.hasArg(options::OPT_pg))
9141 crt1 = "gcrt1.o";
9142 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009143 crt1 = "Scrt1.o";
9144 else
9145 crt1 = "crt1.o";
9146 }
9147 if (crt1)
9148 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009149
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009150 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9151 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009152
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009153 const char *crtbegin;
9154 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009155 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009156 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009157 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009158 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009159 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009160 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009161 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009162
9163 if (HasCRTBeginEndFiles)
9164 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009165
9166 // Add crtfastmath.o if available and fast math is enabled.
9167 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009168 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009169
9170 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009171 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009172
Douglas Katzman6059ef92015-11-17 17:41:23 +00009173 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009174
Teresa Johnson945bc502015-10-15 20:35:53 +00009175 if (D.isUsingLTO())
9176 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009177
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009178 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9179 CmdArgs.push_back("--no-demangle");
9180
Alexey Samsonov52550342014-09-15 19:58:40 +00009181 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009182 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009183 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009184 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009185
Douglas Katzman78b37b02015-11-17 20:28:07 +00009186 if (D.CCCIsCXX() &&
9187 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009188 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009189 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009190 if (OnlyLibstdcxxStatic)
9191 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009192 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009193 if (OnlyLibstdcxxStatic)
9194 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009195 CmdArgs.push_back("-lm");
9196 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009197 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9198 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009199
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009200 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009201 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9202 if (Args.hasArg(options::OPT_static))
9203 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009204
Alexey Samsonov52550342014-09-15 19:58:40 +00009205 if (NeedsSanitizerDeps)
9206 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9207
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009208 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9209 Args.hasArg(options::OPT_pthreads);
9210
9211 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9212 options::OPT_fno_openmp, false)) {
9213 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9214 // FIXME: Does this really make sense for all GNU toolchains?
9215 WantPthread = true;
9216
9217 // Also link the particular OpenMP runtimes.
9218 switch (getOpenMPRuntime(ToolChain, Args)) {
9219 case OMPRT_OMP:
9220 CmdArgs.push_back("-lomp");
9221 break;
9222 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009223 CmdArgs.push_back("-lgomp");
9224
9225 // FIXME: Exclude this for platforms with libgomp that don't require
9226 // librt. Most modern Linux platforms require it, but some may not.
9227 CmdArgs.push_back("-lrt");
9228 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009229 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009230 CmdArgs.push_back("-liomp5");
9231 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009232 case OMPRT_Unknown:
9233 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009234 break;
9235 }
Chandler Carruth01538002013-01-17 13:19:29 +00009236 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009237
Renato Golinc4b49242014-02-13 10:01:16 +00009238 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009239
Richard Smith31d1de22015-05-20 22:48:44 +00009240 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009241 CmdArgs.push_back("-lpthread");
9242
Rafael Espindolab17bc532016-01-25 18:29:16 +00009243 if (Args.hasArg(options::OPT_fsplit_stack))
9244 CmdArgs.push_back("--wrap=pthread_create");
9245
Chandler Carruth94a32012012-05-14 18:31:18 +00009246 CmdArgs.push_back("-lc");
9247
9248 if (Args.hasArg(options::OPT_static))
9249 CmdArgs.push_back("--end-group");
9250 else
Renato Golinc4b49242014-02-13 10:01:16 +00009251 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009252 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009253
Rafael Espindola81937ec2010-12-01 01:52:43 +00009254 if (!Args.hasArg(options::OPT_nostartfiles)) {
9255 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009256 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009257 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009258 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009259 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009260 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009261 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009262
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009263 if (HasCRTBeginEndFiles)
9264 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009265 if (!isAndroid)
9266 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009267 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009268 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009269
Peter Collingbourne39719a72015-11-20 20:49:39 +00009270 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009271}
9272
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009273// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9274// for the various SFI requirements like register masking. The assembly tool
9275// inserts the file containing the macros as an input into all the assembly
9276// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009277void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9278 const InputInfo &Output,
9279 const InputInfoList &Inputs,
9280 const ArgList &Args,
9281 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009282 const toolchains::NaClToolChain &ToolChain =
9283 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009284 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009285 "nacl-arm-macros.s");
9286 InputInfoList NewInputs;
9287 NewInputs.push_back(NaClMacros);
9288 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009289 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9290 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009291}
9292
Douglas Katzman750cfc52015-06-29 18:42:16 +00009293// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009294// we use static by default, do not yet support sanitizers or LTO, and a few
9295// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009296// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009297void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9298 const InputInfo &Output,
9299 const InputInfoList &Inputs,
9300 const ArgList &Args,
9301 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009302
Douglas Katzman54366072015-07-27 16:53:08 +00009303 const toolchains::NaClToolChain &ToolChain =
9304 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009305 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009306 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009307 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009308 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309
9310 ArgStringList CmdArgs;
9311
9312 // Silence warning for "clang -g foo.o -o foo"
9313 Args.ClaimAllArgs(options::OPT_g_Group);
9314 // and "clang -emit-llvm foo.o -o foo"
9315 Args.ClaimAllArgs(options::OPT_emit_llvm);
9316 // and for "clang -w foo.o -o foo". Other warning options are already
9317 // handled somewhere else.
9318 Args.ClaimAllArgs(options::OPT_w);
9319
9320 if (!D.SysRoot.empty())
9321 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9322
9323 if (Args.hasArg(options::OPT_rdynamic))
9324 CmdArgs.push_back("-export-dynamic");
9325
9326 if (Args.hasArg(options::OPT_s))
9327 CmdArgs.push_back("-s");
9328
Douglas Katzman54366072015-07-27 16:53:08 +00009329 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9330 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009331 CmdArgs.push_back("--build-id");
9332
9333 if (!IsStatic)
9334 CmdArgs.push_back("--eh-frame-hdr");
9335
9336 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009337 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009338 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009339 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009340 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009341 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009342 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009343 else if (Arch == llvm::Triple::mipsel)
9344 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009345 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009346 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9347 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009348
9349 if (IsStatic)
9350 CmdArgs.push_back("-static");
9351 else if (Args.hasArg(options::OPT_shared))
9352 CmdArgs.push_back("-shared");
9353
9354 CmdArgs.push_back("-o");
9355 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009356 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009357 if (!Args.hasArg(options::OPT_shared))
9358 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9359 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9360
9361 const char *crtbegin;
9362 if (IsStatic)
9363 crtbegin = "crtbeginT.o";
9364 else if (Args.hasArg(options::OPT_shared))
9365 crtbegin = "crtbeginS.o";
9366 else
9367 crtbegin = "crtbegin.o";
9368 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9369 }
9370
9371 Args.AddAllArgs(CmdArgs, options::OPT_L);
9372 Args.AddAllArgs(CmdArgs, options::OPT_u);
9373
Douglas Katzman6059ef92015-11-17 17:41:23 +00009374 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009375
9376 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9377 CmdArgs.push_back("--no-demangle");
9378
9379 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9380
Douglas Katzman78b37b02015-11-17 20:28:07 +00009381 if (D.CCCIsCXX() &&
9382 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009383 bool OnlyLibstdcxxStatic =
9384 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009385 if (OnlyLibstdcxxStatic)
9386 CmdArgs.push_back("-Bstatic");
9387 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9388 if (OnlyLibstdcxxStatic)
9389 CmdArgs.push_back("-Bdynamic");
9390 CmdArgs.push_back("-lm");
9391 }
9392
9393 if (!Args.hasArg(options::OPT_nostdlib)) {
9394 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9395 // Always use groups, since it has no effect on dynamic libraries.
9396 CmdArgs.push_back("--start-group");
9397 CmdArgs.push_back("-lc");
9398 // NaCl's libc++ currently requires libpthread, so just always include it
9399 // in the group for C++.
9400 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009401 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009402 // Gold, used by Mips, handles nested groups differently than ld, and
9403 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9404 // which is not a desired behaviour here.
9405 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9406 if (getToolChain().getArch() == llvm::Triple::mipsel)
9407 CmdArgs.push_back("-lnacl");
9408
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009409 CmdArgs.push_back("-lpthread");
9410 }
9411
9412 CmdArgs.push_back("-lgcc");
9413 CmdArgs.push_back("--as-needed");
9414 if (IsStatic)
9415 CmdArgs.push_back("-lgcc_eh");
9416 else
9417 CmdArgs.push_back("-lgcc_s");
9418 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009419
9420 // Mips needs to create and use pnacl_legacy library that contains
9421 // definitions from bitcode/pnaclmm.c and definitions for
9422 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9423 if (getToolChain().getArch() == llvm::Triple::mipsel)
9424 CmdArgs.push_back("-lpnacl_legacy");
9425
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009426 CmdArgs.push_back("--end-group");
9427 }
9428
9429 if (!Args.hasArg(options::OPT_nostartfiles)) {
9430 const char *crtend;
9431 if (Args.hasArg(options::OPT_shared))
9432 crtend = "crtendS.o";
9433 else
9434 crtend = "crtend.o";
9435
9436 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9437 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9438 }
9439 }
9440
Peter Collingbourne39719a72015-11-20 20:49:39 +00009441 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9442 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009443}
9444
Douglas Katzman95354292015-06-23 20:42:09 +00009445void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9446 const InputInfo &Output,
9447 const InputInfoList &Inputs,
9448 const ArgList &Args,
9449 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009450 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009451 ArgStringList CmdArgs;
9452
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009453 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009454
9455 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009456 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009457
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009458 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009459 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009460
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009461 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009462 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009463}
9464
Douglas Katzman95354292015-06-23 20:42:09 +00009465void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9466 const InputInfo &Output,
9467 const InputInfoList &Inputs,
9468 const ArgList &Args,
9469 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009470 const Driver &D = getToolChain().getDriver();
9471 ArgStringList CmdArgs;
9472
Daniel Dunbarb440f562010-08-02 02:38:21 +00009473 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009474 CmdArgs.push_back("-o");
9475 CmdArgs.push_back(Output.getFilename());
9476 } else {
9477 assert(Output.isNothing() && "Invalid output.");
9478 }
9479
Douglas Katzman78b37b02015-11-17 20:28:07 +00009480 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009481 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9482 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9483 CmdArgs.push_back(
9484 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9485 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009486 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009487
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009488 Args.AddAllArgs(CmdArgs,
9489 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009490
Daniel Dunbar54423b22010-09-17 00:24:54 +00009491 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009492
Xinliang David Li69306c02015-10-22 06:15:31 +00009493 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009494
Douglas Katzman78b37b02015-11-17 20:28:07 +00009495 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009496 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009497 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009498 CmdArgs.push_back("-lm");
9499 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009500 }
9501
Douglas Katzman78b37b02015-11-17 20:28:07 +00009502 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009503 if (Args.hasArg(options::OPT_pthread))
9504 CmdArgs.push_back("-lpthread");
9505 CmdArgs.push_back("-lc");
9506 CmdArgs.push_back("-lCompilerRT-Generic");
9507 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9508 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009509 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009510 }
9511
Logan Chieneb9162f2014-06-26 14:23:45 +00009512 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009513 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009514}
9515
Daniel Dunbarcc912342009-05-02 18:28:39 +00009516/// DragonFly Tools
9517
9518// For now, DragonFly Assemble does just about the same as for
9519// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009520void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9521 const InputInfo &Output,
9522 const InputInfoList &Inputs,
9523 const ArgList &Args,
9524 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009525 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009526 ArgStringList CmdArgs;
9527
9528 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9529 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009530 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009531 CmdArgs.push_back("--32");
9532
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009533 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009534
9535 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009536 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009537
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009538 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009539 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009540
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009541 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009543}
9544
Douglas Katzman95354292015-06-23 20:42:09 +00009545void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9546 const InputInfo &Output,
9547 const InputInfoList &Inputs,
9548 const ArgList &Args,
9549 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009550 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009551 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009552
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009553 if (!D.SysRoot.empty())
9554 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9555
John McCall65b8da02013-04-11 22:55:55 +00009556 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009557 if (Args.hasArg(options::OPT_static)) {
9558 CmdArgs.push_back("-Bstatic");
9559 } else {
John McCall65b8da02013-04-11 22:55:55 +00009560 if (Args.hasArg(options::OPT_rdynamic))
9561 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009562 if (Args.hasArg(options::OPT_shared))
9563 CmdArgs.push_back("-Bshareable");
9564 else {
9565 CmdArgs.push_back("-dynamic-linker");
9566 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9567 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009568 CmdArgs.push_back("--hash-style=gnu");
9569 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009570 }
9571
9572 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9573 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009574 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009575 CmdArgs.push_back("-m");
9576 CmdArgs.push_back("elf_i386");
9577 }
9578
Daniel Dunbarb440f562010-08-02 02:38:21 +00009579 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009580 CmdArgs.push_back("-o");
9581 CmdArgs.push_back(Output.getFilename());
9582 } else {
9583 assert(Output.isNothing() && "Invalid output.");
9584 }
9585
Douglas Katzman78b37b02015-11-17 20:28:07 +00009586 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009587 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009588 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009589 CmdArgs.push_back(
9590 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009591 else {
9592 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009593 CmdArgs.push_back(
9594 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009595 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009596 CmdArgs.push_back(
9597 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009598 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009599 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009600 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009601 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009602 CmdArgs.push_back(
9603 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009604 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009605 CmdArgs.push_back(
9606 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009607 }
9608
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009609 Args.AddAllArgs(CmdArgs,
9610 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009611
Daniel Dunbar54423b22010-09-17 00:24:54 +00009612 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009613
Douglas Katzman78b37b02015-11-17 20:28:07 +00009614 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009615 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009616
9617 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009618 CmdArgs.push_back("-rpath");
9619 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009620 }
9621
Hans Wennborg70850d82013-07-18 20:29:38 +00009622 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009623 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009624 CmdArgs.push_back("-lm");
9625 }
9626
Daniel Dunbarcc912342009-05-02 18:28:39 +00009627 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009628 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009629
9630 if (!Args.hasArg(options::OPT_nolibc)) {
9631 CmdArgs.push_back("-lc");
9632 }
9633
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009634 if (Args.hasArg(options::OPT_static) ||
9635 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009636 CmdArgs.push_back("-lgcc");
9637 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009638 } else {
9639 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009640 CmdArgs.push_back("-lgcc_pic");
9641 if (!Args.hasArg(options::OPT_shared))
9642 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009643 } else {
John McCall65b8da02013-04-11 22:55:55 +00009644 CmdArgs.push_back("-lgcc");
9645 CmdArgs.push_back("--as-needed");
9646 CmdArgs.push_back("-lgcc_pic");
9647 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009648 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009649 }
9650 }
9651
Douglas Katzman78b37b02015-11-17 20:28:07 +00009652 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009653 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009654 CmdArgs.push_back(
9655 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009656 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009657 CmdArgs.push_back(
9658 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9659 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009660 }
9661
Xinliang David Li69306c02015-10-22 06:15:31 +00009662 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009663
Logan Chieneb9162f2014-06-26 14:23:45 +00009664 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009665 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009666}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009667
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009668// Try to find Exe from a Visual Studio distribution. This first tries to find
9669// an installed copy of Visual Studio and, failing that, looks in the PATH,
9670// making sure that whatever executable that's found is not a same-named exe
9671// from clang itself to prevent clang from falling back to itself.
9672static std::string FindVisualStudioExecutable(const ToolChain &TC,
9673 const char *Exe,
9674 const char *ClangProgramPath) {
9675 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9676 std::string visualStudioBinDir;
9677 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9678 visualStudioBinDir)) {
9679 SmallString<128> FilePath(visualStudioBinDir);
9680 llvm::sys::path::append(FilePath, Exe);
9681 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9682 return FilePath.str();
9683 }
9684
9685 return Exe;
9686}
9687
Douglas Katzman95354292015-06-23 20:42:09 +00009688void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9689 const InputInfo &Output,
9690 const InputInfoList &Inputs,
9691 const ArgList &Args,
9692 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009693 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009694 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009695
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009696 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9697 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009698 CmdArgs.push_back(
9699 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009700
Douglas Katzman78b37b02015-11-17 20:28:07 +00009701 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9702 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009703 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009704
Zachary Turner10d75b22014-10-22 20:40:43 +00009705 if (!llvm::sys::Process::GetEnv("LIB")) {
9706 // If the VC environment hasn't been configured (perhaps because the user
9707 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009708 // the environment variable is set however, assume the user knows what
9709 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009710 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009711 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009712 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9713 SmallString<128> LibDir(VisualStudioDir);
9714 llvm::sys::path::append(LibDir, "VC", "lib");
9715 switch (MSVC.getArch()) {
9716 case llvm::Triple::x86:
9717 // x86 just puts the libraries directly in lib
9718 break;
9719 case llvm::Triple::x86_64:
9720 llvm::sys::path::append(LibDir, "amd64");
9721 break;
9722 case llvm::Triple::arm:
9723 llvm::sys::path::append(LibDir, "arm");
9724 break;
9725 default:
9726 break;
9727 }
9728 CmdArgs.push_back(
9729 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009730
9731 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9732 std::string UniversalCRTLibPath;
9733 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9734 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9735 UniversalCRTLibPath.c_str()));
9736 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009737 }
9738
9739 std::string WindowsSdkLibPath;
9740 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9741 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9742 WindowsSdkLibPath.c_str()));
9743 }
9744
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009745 CmdArgs.push_back("-nologo");
9746
Reid Kleckner124955a2015-08-05 18:51:13 +00009747 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009748 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009749
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009750 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009751 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009752 if (DLL) {
9753 CmdArgs.push_back(Args.MakeArgString("-dll"));
9754
9755 SmallString<128> ImplibName(Output.getFilename());
9756 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009757 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009758 }
9759
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009760 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009761 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009762 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009763 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009764 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9765 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009766 // Make sure the dynamic runtime thunk is not optimized out at link time
9767 // to ensure proper SEH handling.
9768 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009769 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009770 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009771 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009772 for (const auto &Lib : {"asan", "asan_cxx"})
9773 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009774 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009775 }
9776
Hans Wennborg2e274592013-08-13 23:38:57 +00009777 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009778
Alexey Bataevc7e84352015-08-19 04:49:01 +00009779 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9780 options::OPT_fno_openmp, false)) {
9781 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9782 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9783 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9784 TC.getDriver().Dir + "/../lib"));
9785 switch (getOpenMPRuntime(getToolChain(), Args)) {
9786 case OMPRT_OMP:
9787 CmdArgs.push_back("-defaultlib:libomp.lib");
9788 break;
9789 case OMPRT_IOMP5:
9790 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9791 break;
9792 case OMPRT_GOMP:
9793 break;
9794 case OMPRT_Unknown:
9795 // Already diagnosed.
9796 break;
9797 }
9798 }
9799
Andrey Turetskiya4868572016-03-14 11:19:43 +00009800 // Add compiler-rt lib in case if it was explicitly
9801 // specified as an argument for --rtlib option.
9802 if (!Args.hasArg(options::OPT_nostdlib)) {
9803 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9804 }
9805
Reid Kleckner337188f2014-09-16 19:22:00 +00009806 // Add filenames, libraries, and other linker inputs.
9807 for (const auto &Input : Inputs) {
9808 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009809 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009810 continue;
9811 }
9812
9813 const Arg &A = Input.getInputArg();
9814
9815 // Render -l options differently for the MSVC linker.
9816 if (A.getOption().matches(options::OPT_l)) {
9817 StringRef Lib = A.getValue();
9818 const char *LinkLibArg;
9819 if (Lib.endswith(".lib"))
9820 LinkLibArg = Args.MakeArgString(Lib);
9821 else
9822 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9823 CmdArgs.push_back(LinkLibArg);
9824 continue;
9825 }
9826
9827 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9828 // or -L. Render it, even if MSVC doesn't understand it.
9829 A.renderAsInput(Args, CmdArgs);
9830 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009831
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009832 TC.addProfileRTLibs(Args, CmdArgs);
9833
Zachary Turner719f58c2014-12-01 23:06:47 +00009834 // We need to special case some linker paths. In the case of lld, we need to
9835 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9836 // linker, we need to use a special search algorithm.
9837 llvm::SmallString<128> linkPath;
9838 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9839 if (Linker.equals_lower("lld"))
9840 Linker = "lld-link";
9841
9842 if (Linker.equals_lower("link")) {
9843 // If we're using the MSVC linker, it's not sufficient to just use link
9844 // from the program PATH, because other environments like GnuWin32 install
9845 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009846 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009847 C.getDriver().getClangProgramPath());
9848 } else {
9849 linkPath = Linker;
9850 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009851 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009852 }
9853
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009854 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009855 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009856}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009857
Douglas Katzman95354292015-06-23 20:42:09 +00009858void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9859 const InputInfo &Output,
9860 const InputInfoList &Inputs,
9861 const ArgList &Args,
9862 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009863 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9864}
9865
Douglas Katzman95354292015-06-23 20:42:09 +00009866std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009867 Compilation &C, const JobAction &JA, const InputInfo &Output,
9868 const InputInfoList &Inputs, const ArgList &Args,
9869 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009870 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009871 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009872 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009873 CmdArgs.push_back("/W0"); // No warnings.
9874
9875 // The goal is to be able to invoke this tool correctly based on
9876 // any flag accepted by clang-cl.
9877
9878 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009879 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009880
9881 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009882 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9883 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9884 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009885 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9886 if (A->getOption().getID() == options::OPT_O0) {
9887 CmdArgs.push_back("/Od");
9888 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009889 CmdArgs.push_back("/Og");
9890
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009891 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009892 if (OptLevel == "s" || OptLevel == "z")
9893 CmdArgs.push_back("/Os");
9894 else
9895 CmdArgs.push_back("/Ot");
9896
9897 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009898 }
9899 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009900 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9901 options::OPT_fno_omit_frame_pointer))
9902 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9903 ? "/Oy"
9904 : "/Oy-");
9905 if (!Args.hasArg(options::OPT_fwritable_strings))
9906 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009907
Nico Weber3f8dafb2015-03-12 19:37:10 +00009908 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009909 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9910
David Majnemerf6072342014-07-01 22:24:56 +00009911 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9912 /*default=*/false))
9913 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009914 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9915 options::OPT_fno_function_sections))
9916 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9917 ? "/Gy"
9918 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009919 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9920 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009921 CmdArgs.push_back(
9922 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009923 if (Args.hasArg(options::OPT_fsyntax_only))
9924 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009925 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9926 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009927 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009928
Nico Weber3f8dafb2015-03-12 19:37:10 +00009929 std::vector<std::string> Includes =
9930 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009931 for (const auto &Include : Includes)
9932 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009933
Hans Wennborg87cfa712013-09-19 20:32:16 +00009934 // Flags that can simply be passed through.
9935 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9936 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009937 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9938 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009939 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009940 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009941
9942 // The order of these flags is relevant, so pick the last one.
9943 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9944 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9945 A->render(Args, CmdArgs);
9946
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009947 // Pass through all unknown arguments so that the fallback command can see
9948 // them too.
9949 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9950
Hans Wennborg87cfa712013-09-19 20:32:16 +00009951 // Input filename.
9952 assert(Inputs.size() == 1);
9953 const InputInfo &II = Inputs[0];
9954 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9955 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9956 if (II.isFilename())
9957 CmdArgs.push_back(II.getFilename());
9958 else
9959 II.getInputArg().renderAsInput(Args, CmdArgs);
9960
9961 // Output filename.
9962 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009963 const char *Fo =
9964 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009965 CmdArgs.push_back(Fo);
9966
Hans Wennborg188382e2013-09-20 18:16:35 +00009967 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009968 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9969 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009970 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009971 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009972}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009973
Yaron Keren1c0070c2015-07-02 04:45:27 +00009974/// MinGW Tools
9975void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9976 const InputInfo &Output,
9977 const InputInfoList &Inputs,
9978 const ArgList &Args,
9979 const char *LinkingOutput) const {
9980 claimNoWarnArgs(Args);
9981 ArgStringList CmdArgs;
9982
9983 if (getToolChain().getArch() == llvm::Triple::x86) {
9984 CmdArgs.push_back("--32");
9985 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9986 CmdArgs.push_back("--64");
9987 }
9988
9989 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9990
9991 CmdArgs.push_back("-o");
9992 CmdArgs.push_back(Output.getFilename());
9993
9994 for (const auto &II : Inputs)
9995 CmdArgs.push_back(II.getFilename());
9996
9997 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009998 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009999
10000 if (Args.hasArg(options::OPT_gsplit_dwarf))
10001 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10002 SplitDebugName(Args, Inputs[0]));
10003}
10004
10005void MinGW::Linker::AddLibGCC(const ArgList &Args,
10006 ArgStringList &CmdArgs) const {
10007 if (Args.hasArg(options::OPT_mthreads))
10008 CmdArgs.push_back("-lmingwthrd");
10009 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010010
Yaron Kerenaa281332015-08-09 00:24:07 +000010011 // Make use of compiler-rt if --rtlib option is used
10012 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10013 if (RLT == ToolChain::RLT_Libgcc) {
10014 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10015 Args.hasArg(options::OPT_static);
10016 bool Shared = Args.hasArg(options::OPT_shared);
10017 bool CXX = getToolChain().getDriver().CCCIsCXX();
10018
10019 if (Static || (!CXX && !Shared)) {
10020 CmdArgs.push_back("-lgcc");
10021 CmdArgs.push_back("-lgcc_eh");
10022 } else {
10023 CmdArgs.push_back("-lgcc_s");
10024 CmdArgs.push_back("-lgcc");
10025 }
10026 } else {
10027 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10028 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010029
Yaron Keren1c0070c2015-07-02 04:45:27 +000010030 CmdArgs.push_back("-lmoldname");
10031 CmdArgs.push_back("-lmingwex");
10032 CmdArgs.push_back("-lmsvcrt");
10033}
10034
10035void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10036 const InputInfo &Output,
10037 const InputInfoList &Inputs,
10038 const ArgList &Args,
10039 const char *LinkingOutput) const {
10040 const ToolChain &TC = getToolChain();
10041 const Driver &D = TC.getDriver();
10042 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10043
10044 ArgStringList CmdArgs;
10045
10046 // Silence warning for "clang -g foo.o -o foo"
10047 Args.ClaimAllArgs(options::OPT_g_Group);
10048 // and "clang -emit-llvm foo.o -o foo"
10049 Args.ClaimAllArgs(options::OPT_emit_llvm);
10050 // and for "clang -w foo.o -o foo". Other warning options are already
10051 // handled somewhere else.
10052 Args.ClaimAllArgs(options::OPT_w);
10053
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010054 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10055 if (LinkerName.equals_lower("lld")) {
10056 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010057 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010058 } else if (!LinkerName.equals_lower("ld")) {
10059 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010060 }
10061
Yaron Keren1c0070c2015-07-02 04:45:27 +000010062 if (!D.SysRoot.empty())
10063 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10064
10065 if (Args.hasArg(options::OPT_s))
10066 CmdArgs.push_back("-s");
10067
10068 CmdArgs.push_back("-m");
10069 if (TC.getArch() == llvm::Triple::x86)
10070 CmdArgs.push_back("i386pe");
10071 if (TC.getArch() == llvm::Triple::x86_64)
10072 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010073 if (TC.getArch() == llvm::Triple::arm)
10074 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010075
10076 if (Args.hasArg(options::OPT_mwindows)) {
10077 CmdArgs.push_back("--subsystem");
10078 CmdArgs.push_back("windows");
10079 } else if (Args.hasArg(options::OPT_mconsole)) {
10080 CmdArgs.push_back("--subsystem");
10081 CmdArgs.push_back("console");
10082 }
10083
10084 if (Args.hasArg(options::OPT_static))
10085 CmdArgs.push_back("-Bstatic");
10086 else {
10087 if (Args.hasArg(options::OPT_mdll))
10088 CmdArgs.push_back("--dll");
10089 else if (Args.hasArg(options::OPT_shared))
10090 CmdArgs.push_back("--shared");
10091 CmdArgs.push_back("-Bdynamic");
10092 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10093 CmdArgs.push_back("-e");
10094 if (TC.getArch() == llvm::Triple::x86)
10095 CmdArgs.push_back("_DllMainCRTStartup@12");
10096 else
10097 CmdArgs.push_back("DllMainCRTStartup");
10098 CmdArgs.push_back("--enable-auto-image-base");
10099 }
10100 }
10101
10102 CmdArgs.push_back("-o");
10103 CmdArgs.push_back(Output.getFilename());
10104
10105 Args.AddAllArgs(CmdArgs, options::OPT_e);
10106 // FIXME: add -N, -n flags
10107 Args.AddLastArg(CmdArgs, options::OPT_r);
10108 Args.AddLastArg(CmdArgs, options::OPT_s);
10109 Args.AddLastArg(CmdArgs, options::OPT_t);
10110 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10111 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10112
Douglas Katzman78b37b02015-11-17 20:28:07 +000010113 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010114 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10115 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10116 } else {
10117 if (Args.hasArg(options::OPT_municode))
10118 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10119 else
10120 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10121 }
10122 if (Args.hasArg(options::OPT_pg))
10123 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10124 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10125 }
10126
10127 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010128 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010129 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10130
10131 // TODO: Add ASan stuff here
10132
10133 // TODO: Add profile stuff here
10134
Douglas Katzman78b37b02015-11-17 20:28:07 +000010135 if (D.CCCIsCXX() &&
10136 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010137 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10138 !Args.hasArg(options::OPT_static);
10139 if (OnlyLibstdcxxStatic)
10140 CmdArgs.push_back("-Bstatic");
10141 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10142 if (OnlyLibstdcxxStatic)
10143 CmdArgs.push_back("-Bdynamic");
10144 }
10145
10146 if (!Args.hasArg(options::OPT_nostdlib)) {
10147 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10148 if (Args.hasArg(options::OPT_static))
10149 CmdArgs.push_back("--start-group");
10150
10151 if (Args.hasArg(options::OPT_fstack_protector) ||
10152 Args.hasArg(options::OPT_fstack_protector_strong) ||
10153 Args.hasArg(options::OPT_fstack_protector_all)) {
10154 CmdArgs.push_back("-lssp_nonshared");
10155 CmdArgs.push_back("-lssp");
10156 }
10157 if (Args.hasArg(options::OPT_fopenmp))
10158 CmdArgs.push_back("-lgomp");
10159
10160 AddLibGCC(Args, CmdArgs);
10161
10162 if (Args.hasArg(options::OPT_pg))
10163 CmdArgs.push_back("-lgmon");
10164
Yaron Kerenadce68e2015-07-06 18:52:19 +000010165 if (Args.hasArg(options::OPT_pthread))
10166 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010167
10168 // add system libraries
10169 if (Args.hasArg(options::OPT_mwindows)) {
10170 CmdArgs.push_back("-lgdi32");
10171 CmdArgs.push_back("-lcomdlg32");
10172 }
10173 CmdArgs.push_back("-ladvapi32");
10174 CmdArgs.push_back("-lshell32");
10175 CmdArgs.push_back("-luser32");
10176 CmdArgs.push_back("-lkernel32");
10177
10178 if (Args.hasArg(options::OPT_static))
10179 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010180 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010181 AddLibGCC(Args, CmdArgs);
10182 }
10183
10184 if (!Args.hasArg(options::OPT_nostartfiles)) {
10185 // Add crtfastmath.o if available and fast math is enabled.
10186 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10187
10188 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10189 }
10190 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010191 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010192 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010193}
10194
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010195/// XCore Tools
10196// We pass assemble and link construction to the xcc tool.
10197
Douglas Katzman95354292015-06-23 20:42:09 +000010198void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10199 const InputInfo &Output,
10200 const InputInfoList &Inputs,
10201 const ArgList &Args,
10202 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010203 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010204 ArgStringList CmdArgs;
10205
10206 CmdArgs.push_back("-o");
10207 CmdArgs.push_back(Output.getFilename());
10208
10209 CmdArgs.push_back("-c");
10210
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010211 if (Args.hasArg(options::OPT_v))
10212 CmdArgs.push_back("-v");
10213
Robert Lytton894d25c2014-05-02 09:33:25 +000010214 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10215 if (!A->getOption().matches(options::OPT_g0))
10216 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010217
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010218 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10219 false))
10220 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010221
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010222 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010223
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010224 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010225 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010226
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010227 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010228 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010229}
10230
Douglas Katzman95354292015-06-23 20:42:09 +000010231void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10232 const InputInfo &Output,
10233 const InputInfoList &Inputs,
10234 const ArgList &Args,
10235 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010236 ArgStringList CmdArgs;
10237
10238 if (Output.isFilename()) {
10239 CmdArgs.push_back("-o");
10240 CmdArgs.push_back(Output.getFilename());
10241 } else {
10242 assert(Output.isNothing() && "Invalid output.");
10243 }
10244
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010245 if (Args.hasArg(options::OPT_v))
10246 CmdArgs.push_back("-v");
10247
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010248 // Pass -fexceptions through to the linker if it was present.
10249 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10250 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010251 CmdArgs.push_back("-fexceptions");
10252
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010253 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10254
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010255 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010256 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010257}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010258
Douglas Katzman95354292015-06-23 20:42:09 +000010259void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10260 const InputInfo &Output,
10261 const InputInfoList &Inputs,
10262 const ArgList &Args,
10263 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010264 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010265 const auto &TC =
10266 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10267 ArgStringList CmdArgs;
10268 const char *Exec;
10269
10270 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010271 default:
10272 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010273 case llvm::Triple::arm:
10274 case llvm::Triple::thumb:
10275 break;
10276 case llvm::Triple::x86:
10277 CmdArgs.push_back("--32");
10278 break;
10279 case llvm::Triple::x86_64:
10280 CmdArgs.push_back("--64");
10281 break;
10282 }
10283
10284 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10285
10286 CmdArgs.push_back("-o");
10287 CmdArgs.push_back(Output.getFilename());
10288
10289 for (const auto &Input : Inputs)
10290 CmdArgs.push_back(Input.getFilename());
10291
10292 const std::string Assembler = TC.GetProgramPath("as");
10293 Exec = Args.MakeArgString(Assembler);
10294
Justin Bognerd3371d82015-07-17 03:35:54 +000010295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010296}
10297
Douglas Katzman95354292015-06-23 20:42:09 +000010298void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10299 const InputInfo &Output,
10300 const InputInfoList &Inputs,
10301 const ArgList &Args,
10302 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010303 const auto &TC =
10304 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10305 const llvm::Triple &T = TC.getTriple();
10306 const Driver &D = TC.getDriver();
10307 SmallString<128> EntryPoint;
10308 ArgStringList CmdArgs;
10309 const char *Exec;
10310
10311 // Silence warning for "clang -g foo.o -o foo"
10312 Args.ClaimAllArgs(options::OPT_g_Group);
10313 // and "clang -emit-llvm foo.o -o foo"
10314 Args.ClaimAllArgs(options::OPT_emit_llvm);
10315 // and for "clang -w foo.o -o foo"
10316 Args.ClaimAllArgs(options::OPT_w);
10317 // Other warning options are already handled somewhere else.
10318
10319 if (!D.SysRoot.empty())
10320 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10321
10322 if (Args.hasArg(options::OPT_pie))
10323 CmdArgs.push_back("-pie");
10324 if (Args.hasArg(options::OPT_rdynamic))
10325 CmdArgs.push_back("-export-dynamic");
10326 if (Args.hasArg(options::OPT_s))
10327 CmdArgs.push_back("--strip-all");
10328
10329 CmdArgs.push_back("-m");
10330 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010331 default:
10332 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010333 case llvm::Triple::arm:
10334 case llvm::Triple::thumb:
10335 // FIXME: this is incorrect for WinCE
10336 CmdArgs.push_back("thumb2pe");
10337 break;
10338 case llvm::Triple::x86:
10339 CmdArgs.push_back("i386pe");
10340 EntryPoint.append("_");
10341 break;
10342 case llvm::Triple::x86_64:
10343 CmdArgs.push_back("i386pep");
10344 break;
10345 }
10346
10347 if (Args.hasArg(options::OPT_shared)) {
10348 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010349 default:
10350 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010351 case llvm::Triple::arm:
10352 case llvm::Triple::thumb:
10353 case llvm::Triple::x86_64:
10354 EntryPoint.append("_DllMainCRTStartup");
10355 break;
10356 case llvm::Triple::x86:
10357 EntryPoint.append("_DllMainCRTStartup@12");
10358 break;
10359 }
10360
10361 CmdArgs.push_back("-shared");
10362 CmdArgs.push_back("-Bdynamic");
10363
10364 CmdArgs.push_back("--enable-auto-image-base");
10365
10366 CmdArgs.push_back("--entry");
10367 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10368 } else {
10369 EntryPoint.append("mainCRTStartup");
10370
10371 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10372 : "-Bdynamic");
10373
Douglas Katzman78b37b02015-11-17 20:28:07 +000010374 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010375 CmdArgs.push_back("--entry");
10376 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10377 }
10378
10379 // FIXME: handle subsystem
10380 }
10381
10382 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010383 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010384
10385 CmdArgs.push_back("-o");
10386 CmdArgs.push_back(Output.getFilename());
10387
10388 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10389 SmallString<261> ImpLib(Output.getFilename());
10390 llvm::sys::path::replace_extension(ImpLib, ".lib");
10391
10392 CmdArgs.push_back("--out-implib");
10393 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10394 }
10395
Douglas Katzman78b37b02015-11-17 20:28:07 +000010396 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010397 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10398 const char *CRTBegin;
10399
10400 CRTBegin =
10401 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10402 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10403 }
10404
10405 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010406 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010407 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10408
10409 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10410 !Args.hasArg(options::OPT_nodefaultlibs)) {
10411 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10412 !Args.hasArg(options::OPT_static);
10413 if (StaticCXX)
10414 CmdArgs.push_back("-Bstatic");
10415 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10416 if (StaticCXX)
10417 CmdArgs.push_back("-Bdynamic");
10418 }
10419
10420 if (!Args.hasArg(options::OPT_nostdlib)) {
10421 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10422 // TODO handle /MT[d] /MD[d]
10423 CmdArgs.push_back("-lmsvcrt");
10424 AddRunTimeLibs(TC, D, CmdArgs, Args);
10425 }
10426 }
10427
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010428 if (TC.getSanitizerArgs().needsAsanRt()) {
10429 // TODO handle /MT[d] /MD[d]
10430 if (Args.hasArg(options::OPT_shared)) {
10431 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10432 } else {
10433 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10434 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10435 // Make sure the dynamic runtime thunk is not optimized out at link time
10436 // to ensure proper SEH handling.
10437 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10438 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10439 ? "___asan_seh_interceptor"
10440 : "__asan_seh_interceptor"));
10441 }
10442 }
10443
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010444 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010445
Justin Bognerd3371d82015-07-17 03:35:54 +000010446 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010447}
Douglas Katzman84a75642015-06-19 14:55:19 +000010448
Douglas Katzman95354292015-06-23 20:42:09 +000010449void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10450 const InputInfo &Output,
10451 const InputInfoList &Inputs,
10452 const ArgList &Args,
10453 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010454 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010455 assert(Inputs.size() == 1);
10456 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010457 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10458 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010459
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010460 if (JA.getKind() == Action::PreprocessJobClass) {
10461 Args.ClaimAllArgs();
10462 CmdArgs.push_back("-E");
10463 } else {
10464 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10465 CmdArgs.push_back("-S");
10466 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10467 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010468 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010469
Douglas Katzmanf6071112015-08-03 14:34:22 +000010470 // Append all -I, -iquote, -isystem paths, defines/undefines,
10471 // 'f' flags, optimize flags, and warning options.
10472 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010473 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010474 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010475 options::OPT_f_Group, options::OPT_f_clang_Group,
10476 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010477 options::OPT_O_Group, options::OPT_W_Group,
10478 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010479
10480 // If we're producing a dependency file, and assembly is the final action,
10481 // then the name of the target in the dependency file should be the '.o'
10482 // file, not the '.s' file produced by this step. For example, instead of
10483 // /tmp/mumble.s: mumble.c .../someheader.h
10484 // the filename on the lefthand side should be "mumble.o"
10485 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10486 C.getActions().size() == 1 &&
10487 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10488 Arg *A = Args.getLastArg(options::OPT_o);
10489 if (A) {
10490 CmdArgs.push_back("-MT");
10491 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10492 }
10493 }
10494
Douglas Katzman84a75642015-06-19 14:55:19 +000010495 CmdArgs.push_back(II.getFilename());
10496 CmdArgs.push_back("-o");
10497 CmdArgs.push_back(Output.getFilename());
10498
10499 std::string Exec =
10500 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010501 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10502 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010503}
10504
Douglas Katzman95354292015-06-23 20:42:09 +000010505void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10506 const InputInfo &Output,
10507 const InputInfoList &Inputs,
10508 const ArgList &Args,
10509 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010510 ArgStringList CmdArgs;
10511
10512 assert(Inputs.size() == 1);
10513 const InputInfo &II = Inputs[0];
10514 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10515 assert(Output.getType() == types::TY_Object);
10516
10517 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010518 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10519 if (CPUArg)
10520 CmdArgs.push_back(
10521 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010522 CmdArgs.push_back("-noSPrefixing");
10523 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010524 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10525 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10526 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010527 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010528 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010529 }
10530 CmdArgs.push_back("-elf"); // Output format.
10531 CmdArgs.push_back(II.getFilename());
10532 CmdArgs.push_back(
10533 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10534
10535 std::string Exec =
10536 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010537 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10538 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010539}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010540
10541void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10542 const InputInfo &Output,
10543 const InputInfoList &Inputs,
10544 const ArgList &Args,
10545 const char *LinkingOutput) const {
10546 const auto &TC =
10547 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10548 const llvm::Triple &T = TC.getTriple();
10549 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010550 bool UseStartfiles =
10551 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010552 bool UseDefaultLibs =
10553 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010554
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010555 if (T.getArch() == llvm::Triple::sparc)
10556 CmdArgs.push_back("-EB");
10557 else // SHAVE assumes little-endian, and sparcel is expressly so.
10558 CmdArgs.push_back("-EL");
10559
10560 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10561 // but we never pass through a --sysroot option and various other bits.
10562 // For example, there are no sanitizers (yet) nor gold linker.
10563
10564 // Eat some arguments that may be present but have no effect.
10565 Args.ClaimAllArgs(options::OPT_g_Group);
10566 Args.ClaimAllArgs(options::OPT_w);
10567 Args.ClaimAllArgs(options::OPT_static_libgcc);
10568
10569 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10570 CmdArgs.push_back("-s");
10571
10572 CmdArgs.push_back("-o");
10573 CmdArgs.push_back(Output.getFilename());
10574
10575 if (UseStartfiles) {
10576 // If you want startfiles, it means you want the builtin crti and crtbegin,
10577 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010578 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10579 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010580 }
10581
10582 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10583 options::OPT_e, options::OPT_s, options::OPT_t,
10584 options::OPT_Z_Flag, options::OPT_r});
10585
Douglas Katzman674a3122015-11-18 16:24:46 +000010586 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010587
10588 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10589
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010590 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010591 if (C.getDriver().CCCIsCXX())
10592 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010593 if (T.getOS() == llvm::Triple::RTEMS) {
10594 CmdArgs.push_back("--start-group");
10595 CmdArgs.push_back("-lc");
10596 // You must provide your own "-L" option to enable finding these.
10597 CmdArgs.push_back("-lrtemscpu");
10598 CmdArgs.push_back("-lrtemsbsp");
10599 CmdArgs.push_back("--end-group");
10600 } else {
10601 CmdArgs.push_back("-lc");
10602 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010603 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010604 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010605 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010606 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10607 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010608 }
10609
10610 std::string Exec =
10611 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10612 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10613 CmdArgs, Inputs));
10614}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010615
10616void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10617 const InputInfo &Output,
10618 const InputInfoList &Inputs,
10619 const ArgList &Args,
10620 const char *LinkingOutput) const {
10621 claimNoWarnArgs(Args);
10622 ArgStringList CmdArgs;
10623
10624 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10625
10626 CmdArgs.push_back("-o");
10627 CmdArgs.push_back(Output.getFilename());
10628
10629 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10630 const InputInfo &Input = Inputs[0];
10631 assert(Input.isFilename() && "Invalid input.");
10632 CmdArgs.push_back(Input.getFilename());
10633
10634 const char *Exec =
10635 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10636 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10637}
10638
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010639static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10640 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10641 if (SanArgs.needsUbsanRt()) {
10642 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10643 }
10644 if (SanArgs.needsAsanRt()) {
10645 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10646 }
10647}
10648
10649static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10650 const JobAction &JA, const InputInfo &Output,
10651 const InputInfoList &Inputs,
10652 const ArgList &Args,
10653 const char *LinkingOutput) {
10654 const toolchains::FreeBSD &ToolChain =
10655 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10656 const Driver &D = ToolChain.getDriver();
10657 ArgStringList CmdArgs;
10658
10659 // Silence warning for "clang -g foo.o -o foo"
10660 Args.ClaimAllArgs(options::OPT_g_Group);
10661 // and "clang -emit-llvm foo.o -o foo"
10662 Args.ClaimAllArgs(options::OPT_emit_llvm);
10663 // and for "clang -w foo.o -o foo". Other warning options are already
10664 // handled somewhere else.
10665 Args.ClaimAllArgs(options::OPT_w);
10666
10667 if (!D.SysRoot.empty())
10668 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10669
10670 if (Args.hasArg(options::OPT_pie))
10671 CmdArgs.push_back("-pie");
10672
10673 if (Args.hasArg(options::OPT_rdynamic))
10674 CmdArgs.push_back("-export-dynamic");
10675 if (Args.hasArg(options::OPT_shared))
10676 CmdArgs.push_back("--oformat=so");
10677
10678 if (Output.isFilename()) {
10679 CmdArgs.push_back("-o");
10680 CmdArgs.push_back(Output.getFilename());
10681 } else {
10682 assert(Output.isNothing() && "Invalid output.");
10683 }
10684
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010685 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10686
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010687 Args.AddAllArgs(CmdArgs, options::OPT_L);
10688 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10689 Args.AddAllArgs(CmdArgs, options::OPT_e);
10690 Args.AddAllArgs(CmdArgs, options::OPT_s);
10691 Args.AddAllArgs(CmdArgs, options::OPT_t);
10692 Args.AddAllArgs(CmdArgs, options::OPT_r);
10693
10694 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10695 CmdArgs.push_back("--no-demangle");
10696
10697 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10698
10699 if (Args.hasArg(options::OPT_pthread)) {
10700 CmdArgs.push_back("-lpthread");
10701 }
10702
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010703 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10704
10705 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10706}
10707
10708static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10709 const JobAction &JA, const InputInfo &Output,
10710 const InputInfoList &Inputs,
10711 const ArgList &Args,
10712 const char *LinkingOutput) {
10713 const toolchains::FreeBSD &ToolChain =
10714 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10715 const Driver &D = ToolChain.getDriver();
10716 ArgStringList CmdArgs;
10717
10718 // Silence warning for "clang -g foo.o -o foo"
10719 Args.ClaimAllArgs(options::OPT_g_Group);
10720 // and "clang -emit-llvm foo.o -o foo"
10721 Args.ClaimAllArgs(options::OPT_emit_llvm);
10722 // and for "clang -w foo.o -o foo". Other warning options are already
10723 // handled somewhere else.
10724 Args.ClaimAllArgs(options::OPT_w);
10725
10726 if (!D.SysRoot.empty())
10727 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10728
10729 if (Args.hasArg(options::OPT_pie))
10730 CmdArgs.push_back("-pie");
10731
10732 if (Args.hasArg(options::OPT_static)) {
10733 CmdArgs.push_back("-Bstatic");
10734 } else {
10735 if (Args.hasArg(options::OPT_rdynamic))
10736 CmdArgs.push_back("-export-dynamic");
10737 CmdArgs.push_back("--eh-frame-hdr");
10738 if (Args.hasArg(options::OPT_shared)) {
10739 CmdArgs.push_back("-Bshareable");
10740 } else {
10741 CmdArgs.push_back("-dynamic-linker");
10742 CmdArgs.push_back("/libexec/ld-elf.so.1");
10743 }
10744 CmdArgs.push_back("--enable-new-dtags");
10745 }
10746
10747 if (Output.isFilename()) {
10748 CmdArgs.push_back("-o");
10749 CmdArgs.push_back(Output.getFilename());
10750 } else {
10751 assert(Output.isNothing() && "Invalid output.");
10752 }
10753
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010754 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10755
Douglas Katzman78b37b02015-11-17 20:28:07 +000010756 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010757 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010758 if (!Args.hasArg(options::OPT_shared)) {
10759 if (Args.hasArg(options::OPT_pg))
10760 crt1 = "gcrt1.o";
10761 else if (Args.hasArg(options::OPT_pie))
10762 crt1 = "Scrt1.o";
10763 else
10764 crt1 = "crt1.o";
10765 }
10766 if (crt1)
10767 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10768
10769 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10770
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010771 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010772 if (Args.hasArg(options::OPT_static))
10773 crtbegin = "crtbeginT.o";
10774 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10775 crtbegin = "crtbeginS.o";
10776 else
10777 crtbegin = "crtbegin.o";
10778
10779 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10780 }
10781
10782 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010783 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010784 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10785 Args.AddAllArgs(CmdArgs, options::OPT_e);
10786 Args.AddAllArgs(CmdArgs, options::OPT_s);
10787 Args.AddAllArgs(CmdArgs, options::OPT_t);
10788 Args.AddAllArgs(CmdArgs, options::OPT_r);
10789
10790 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10791 CmdArgs.push_back("--no-demangle");
10792
10793 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10794
Douglas Katzman78b37b02015-11-17 20:28:07 +000010795 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010796 // For PS4, we always want to pass libm, libstdc++ and libkernel
10797 // libraries for both C and C++ compilations.
10798 CmdArgs.push_back("-lkernel");
10799 if (D.CCCIsCXX()) {
10800 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10801 if (Args.hasArg(options::OPT_pg))
10802 CmdArgs.push_back("-lm_p");
10803 else
10804 CmdArgs.push_back("-lm");
10805 }
10806 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10807 // the default system libraries. Just mimic this for now.
10808 if (Args.hasArg(options::OPT_pg))
10809 CmdArgs.push_back("-lgcc_p");
10810 else
10811 CmdArgs.push_back("-lcompiler_rt");
10812 if (Args.hasArg(options::OPT_static)) {
10813 CmdArgs.push_back("-lstdc++");
10814 } else if (Args.hasArg(options::OPT_pg)) {
10815 CmdArgs.push_back("-lgcc_eh_p");
10816 } else {
10817 CmdArgs.push_back("--as-needed");
10818 CmdArgs.push_back("-lstdc++");
10819 CmdArgs.push_back("--no-as-needed");
10820 }
10821
10822 if (Args.hasArg(options::OPT_pthread)) {
10823 if (Args.hasArg(options::OPT_pg))
10824 CmdArgs.push_back("-lpthread_p");
10825 else
10826 CmdArgs.push_back("-lpthread");
10827 }
10828
10829 if (Args.hasArg(options::OPT_pg)) {
10830 if (Args.hasArg(options::OPT_shared))
10831 CmdArgs.push_back("-lc");
10832 else {
10833 if (Args.hasArg(options::OPT_static)) {
10834 CmdArgs.push_back("--start-group");
10835 CmdArgs.push_back("-lc_p");
10836 CmdArgs.push_back("-lpthread_p");
10837 CmdArgs.push_back("--end-group");
10838 } else {
10839 CmdArgs.push_back("-lc_p");
10840 }
10841 }
10842 CmdArgs.push_back("-lgcc_p");
10843 } else {
10844 if (Args.hasArg(options::OPT_static)) {
10845 CmdArgs.push_back("--start-group");
10846 CmdArgs.push_back("-lc");
10847 CmdArgs.push_back("-lpthread");
10848 CmdArgs.push_back("--end-group");
10849 } else {
10850 CmdArgs.push_back("-lc");
10851 }
10852 CmdArgs.push_back("-lcompiler_rt");
10853 }
10854
10855 if (Args.hasArg(options::OPT_static)) {
10856 CmdArgs.push_back("-lstdc++");
10857 } else if (Args.hasArg(options::OPT_pg)) {
10858 CmdArgs.push_back("-lgcc_eh_p");
10859 } else {
10860 CmdArgs.push_back("--as-needed");
10861 CmdArgs.push_back("-lstdc++");
10862 CmdArgs.push_back("--no-as-needed");
10863 }
10864 }
10865
Douglas Katzman78b37b02015-11-17 20:28:07 +000010866 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010867 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10868 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10869 else
10870 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10871 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10872 }
10873
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010874 const char *Exec =
10875#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010876 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010877#else
10878 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10879#endif
10880
10881 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10882}
10883
10884void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10885 const InputInfo &Output,
10886 const InputInfoList &Inputs,
10887 const ArgList &Args,
10888 const char *LinkingOutput) const {
10889 const toolchains::FreeBSD &ToolChain =
10890 static_cast<const toolchains::FreeBSD &>(getToolChain());
10891 const Driver &D = ToolChain.getDriver();
10892 bool PS4Linker;
10893 StringRef LinkerOptName;
10894 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10895 LinkerOptName = A->getValue();
10896 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10897 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10898 }
10899
10900 if (LinkerOptName == "gold")
10901 PS4Linker = false;
10902 else if (LinkerOptName == "ps4")
10903 PS4Linker = true;
10904 else
10905 PS4Linker = !Args.hasArg(options::OPT_shared);
10906
10907 if (PS4Linker)
10908 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10909 else
10910 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10911}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010912
10913void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10914 const InputInfo &Output,
10915 const InputInfoList &Inputs,
10916 const ArgList &Args,
10917 const char *LinkingOutput) const {
10918 const auto &TC =
10919 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010920 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010921
10922 std::vector<std::string> gpu_archs =
10923 Args.getAllArgValues(options::OPT_march_EQ);
10924 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10925 const std::string& gpu_arch = gpu_archs[0];
10926
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010927 ArgStringList CmdArgs;
10928 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010929 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10930 // ptxas does not accept -g option if optimization is enabled, so
10931 // we ignore the compiler's -O* options if we want debug info.
10932 CmdArgs.push_back("-g");
10933 CmdArgs.push_back("--dont-merge-basicblocks");
10934 CmdArgs.push_back("--return-at-end");
10935 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10936 // Map the -O we received to -O{0,1,2,3}.
10937 //
10938 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10939 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010940
Justin Lebar2836dcd2016-01-19 19:52:21 +000010941 // -O3 seems like the least-bad option when -Osomething is specified to
10942 // clang but it isn't handled below.
10943 StringRef OOpt = "3";
10944 if (A->getOption().matches(options::OPT_O4) ||
10945 A->getOption().matches(options::OPT_Ofast))
10946 OOpt = "3";
10947 else if (A->getOption().matches(options::OPT_O0))
10948 OOpt = "0";
10949 else if (A->getOption().matches(options::OPT_O)) {
10950 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10951 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10952 .Case("1", "1")
10953 .Case("2", "2")
10954 .Case("3", "3")
10955 .Case("s", "2")
10956 .Case("z", "2")
10957 .Default("2");
10958 }
10959 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10960 } else {
10961 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10962 // to no optimizations, but ptxas's default is -O3.
10963 CmdArgs.push_back("-O0");
10964 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010965
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010966 CmdArgs.push_back("--gpu-name");
10967 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10968 CmdArgs.push_back("--output-file");
10969 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10970 for (const auto& II : Inputs)
10971 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10972
10973 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10974 CmdArgs.push_back(Args.MakeArgString(A));
10975
10976 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10977 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10978}
10979
10980// All inputs to this linker must be from CudaDeviceActions, as we need to look
10981// at the Inputs' Actions in order to figure out which GPU architecture they
10982// correspond to.
10983void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10984 const InputInfo &Output,
10985 const InputInfoList &Inputs,
10986 const ArgList &Args,
10987 const char *LinkingOutput) const {
10988 const auto &TC =
10989 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010990 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010991
10992 ArgStringList CmdArgs;
10993 CmdArgs.push_back("--cuda");
10994 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10995 CmdArgs.push_back(Args.MakeArgString("--create"));
10996 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10997
10998 for (const auto& II : Inputs) {
10999 auto* A = cast<const CudaDeviceAction>(II.getAction());
11000 // We need to pass an Arch of the form "sm_XX" for cubin files and
11001 // "compute_XX" for ptx.
11002 const char *Arch = (II.getType() == types::TY_PP_Asm)
11003 ? A->getComputeArchName()
11004 : A->getGpuArchName();
11005 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11006 Arch + ",file=" + II.getFilename()));
11007 }
11008
11009 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11010 CmdArgs.push_back(Args.MakeArgString(A));
11011
11012 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11013 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11014}