blob: 118e1afb214d7863e4dd54eb860dac18687fe3dc [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
419 if (getToolChain().getDriver().IsCLMode()) {
Junmo Parke19d6792016-03-17 06:41:27 +0000420 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000421 // include is compiled into foo.h, and everything after goes into
422 // the .obj file. /Yufoo.h means that all includes prior to and including
423 // foo.h are completely skipped and replaced with a use of the pch file
424 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
425 // just mean that the last one wins.) If /Yc and /Yu are both present
426 // and refer to the same file, /Yc wins.
427 // Note that OPT__SLASH_FI gets mapped to OPT_include.
428 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
429 // cl.exe seems to support both flags with different values, but that
430 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000431 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000432 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
433 if (PchIndex != -1) {
434 if (isa<PrecompileJobAction>(JA)) {
435 // When building the pch, skip all includes after the pch.
436 assert(YcIndex != -1 && PchIndex == YcIndex);
437 if (AI >= YcIndex)
438 continue;
439 } else {
440 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000441 if (AI < PchIndex) {
442 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000443 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000444 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000445 if (AI == PchIndex) {
446 A->claim();
447 CmdArgs.push_back("-include-pch");
448 CmdArgs.push_back(
449 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
450 continue;
451 }
452 }
453 }
454 } else if (A->getOption().matches(options::OPT_include)) {
455 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000456 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
457 RenderedImplicitInclude = true;
458
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000459 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000460 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000462 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000463 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000464 SmallString<128> P(A->getValue());
465 // We want the files to have a name like foo.h.pch. Add a dummy extension
466 // so that replace_extension does the right thing.
467 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000468 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000469 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000470 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000471 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000472 }
473
Douglas Gregor111af7d2009-04-18 00:34:01 +0000474 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000475 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000476 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000477 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000478 }
479
Douglas Gregor111af7d2009-04-18 00:34:01 +0000480 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000481 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000482 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000483 FoundPCH = UsePCH;
484 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000485 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
487
488 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000489 if (IsFirstImplicitInclude) {
490 A->claim();
491 if (UsePCH)
492 CmdArgs.push_back("-include-pch");
493 else
494 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000495 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000496 continue;
497 } else {
498 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000499 D.Diag(diag::warn_drv_pch_not_first_include) << P
500 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000501 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000502 }
503 }
504
505 // Not translated, render as usual.
506 A->claim();
507 A->render(Args, CmdArgs);
508 }
509
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000510 Args.AddAllArgs(CmdArgs,
511 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
512 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000513
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000514 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000515
516 // FIXME: There is a very unfortunate problem here, some troubled
517 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
518 // really support that we would have to parse and then translate
519 // those options. :(
520 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
521 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000522
523 // -I- is a deprecated GCC feature, reject it.
524 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000525 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000526
527 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
528 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000529 StringRef sysroot = C.getSysRoot();
530 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000531 if (!Args.hasArg(options::OPT_isysroot)) {
532 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000533 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000534 }
535 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000536
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000537 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000538 // FIXME: We should probably sink the logic for handling these from the
539 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000540 // CPATH - included following the user specified includes (but prior to
541 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000542 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000543 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000544 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000545 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000546 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000547 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000548 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000549 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000550 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000551
Artem Belevichfa11ab52015-11-17 22:28:46 +0000552 // Optional AuxToolChain indicates that we need to include headers
553 // for more than one target. If that's the case, add include paths
554 // from AuxToolChain right after include paths of the same kind for
555 // the current target.
556
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000557 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000558 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000559 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000560 if (AuxToolChain)
561 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
562 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000563
564 // Add system include arguments.
565 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000566 if (AuxToolChain)
567 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
568
569 // Add CUDA include arguments, if needed.
570 if (types::isCuda(Inputs[0].getType()))
571 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000572}
573
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000574// FIXME: Move to target hook.
575static bool isSignedCharDefault(const llvm::Triple &Triple) {
576 switch (Triple.getArch()) {
577 default:
578 return true;
579
Tim Northover9bb857a2013-01-31 12:13:10 +0000580 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000581 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000582 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000583 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000584 case llvm::Triple::thumb:
585 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000586 if (Triple.isOSDarwin() || Triple.isOSWindows())
587 return true;
588 return false;
589
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000590 case llvm::Triple::ppc:
591 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000592 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000593 return true;
594 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000595
David Majnemerdcecd932015-05-23 19:23:55 +0000596 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000597 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000598 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000599 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000600 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000601 }
602}
603
Robert Lytton0e076492013-08-13 09:43:10 +0000604static bool isNoCommonDefault(const llvm::Triple &Triple) {
605 switch (Triple.getArch()) {
606 default:
607 return false;
608
609 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000610 case llvm::Triple::wasm32:
611 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000612 return true;
613 }
614}
615
Renato Goline17c5802015-07-27 23:44:42 +0000616// ARM tools start.
617
618// Get SubArch (vN).
619static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
620 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000621 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000622}
623
624// True if M-profile.
625static bool isARMMProfile(const llvm::Triple &Triple) {
626 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000627 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000628 return Profile == llvm::ARM::PK_M;
629}
630
631// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000632static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
633 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000634 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
635 CPU = A->getValue();
636 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
637 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000638 if (!FromAs)
639 return;
640
641 for (const Arg *A :
642 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
643 StringRef Value = A->getValue();
644 if (Value.startswith("-mcpu="))
645 CPU = Value.substr(6);
646 if (Value.startswith("-march="))
647 Arch = Value.substr(7);
648 }
Renato Goline17c5802015-07-27 23:44:42 +0000649}
650
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000651// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000652// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000653static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000654 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000655 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000656 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
657 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000658 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
659}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000660
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000661// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000663 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000664 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000665 unsigned FPUID = llvm::ARM::parseFPU(FPU);
666 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000667 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
668}
669
Bradley Smithbbf5a002015-11-18 16:33:48 +0000670// Decode ARM features from string like +[no]featureA+[no]featureB+...
671static bool DecodeARMFeatures(const Driver &D, StringRef text,
672 std::vector<const char *> &Features) {
673 SmallVector<StringRef, 8> Split;
674 text.split(Split, StringRef("+"), -1, false);
675
676 for (StringRef Feature : Split) {
677 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
678 if (FeatureName)
679 Features.push_back(FeatureName);
680 else
681 return false;
682 }
683 return true;
684}
685
Renato Golin7c542b42015-07-27 23:44:45 +0000686// Check if -march is valid by checking if it can be canonicalised and parsed.
687// getARMArch is used here instead of just checking the -march value in order
688// to handle -march=native correctly.
689static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000690 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000691 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000692 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000693 std::pair<StringRef, StringRef> Split = ArchName.split("+");
694
Renato Goline17c5802015-07-27 23:44:42 +0000695 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000696 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
697 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000698 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000699}
700
Renato Golin7c542b42015-07-27 23:44:45 +0000701// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
702static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
703 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000704 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000705 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000706 std::pair<StringRef, StringRef> Split = CPUName.split("+");
707
Renato Goline17c5802015-07-27 23:44:42 +0000708 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000709 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
710 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000711 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000712}
713
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000714static bool useAAPCSForMachO(const llvm::Triple &T) {
715 // The backend is hardwired to assume AAPCS for M-class processors, ensure
716 // the frontend matches that.
717 return T.getEnvironment() == llvm::Triple::EABI ||
718 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
719}
720
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000721// Select the float ABI as determined by -msoft-float, -mhard-float, and
722// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000723arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
724 const Driver &D = TC.getDriver();
725 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000726 auto SubArch = getARMSubArchVersionNumber(Triple);
727 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000728 if (Arg *A =
729 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
730 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000731 if (A->getOption().matches(options::OPT_msoft_float)) {
732 ABI = FloatABI::Soft;
733 } else if (A->getOption().matches(options::OPT_mhard_float)) {
734 ABI = FloatABI::Hard;
735 } else {
736 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
737 .Case("soft", FloatABI::Soft)
738 .Case("softfp", FloatABI::SoftFP)
739 .Case("hard", FloatABI::Hard)
740 .Default(FloatABI::Invalid);
741 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000742 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000743 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000744 }
745 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000746
747 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
748 // "apcs-gnu".
749 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000750 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000751 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
752 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000753 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000754 }
755
756 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000757 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000758 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000759 case llvm::Triple::Darwin:
760 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000761 case llvm::Triple::IOS:
762 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000763 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000764 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000765 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000766 break;
767 }
Tim Northover756447a2015-10-30 16:30:36 +0000768 case llvm::Triple::WatchOS:
769 ABI = FloatABI::Hard;
770 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000771
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000772 // FIXME: this is invalid for WindowsCE
773 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000774 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000775 break;
776
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000777 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000778 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000779 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000780 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000781 break;
782 default:
783 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000784 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000785 break;
786 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000787 break;
788
Daniel Dunbar78485922009-09-10 23:00:09 +0000789 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000790 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000791 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000792 case llvm::Triple::EABIHF:
793 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000794 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000795 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::EABI:
797 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000799 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000800 case llvm::Triple::Android:
801 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000802 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000803 default:
804 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000805 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000806 if (Triple.getOS() != llvm::Triple::UnknownOS ||
807 !Triple.isOSBinFormatMachO())
808 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000809 break;
810 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000811 }
812 }
813
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000814 assert(ABI != FloatABI::Invalid && "must select an ABI");
815 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000816}
817
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000818static void getARMTargetFeatures(const ToolChain &TC,
819 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000820 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000821 std::vector<const char *> &Features,
822 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000823 const Driver &D = TC.getDriver();
824
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000825 bool KernelOrKext =
826 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000827 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000828 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
829 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
830
Nico Weber6e0ebae2015-04-29 21:16:40 +0000831 if (!ForAS) {
832 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
833 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
834 // stripped out by the ARM target. We should probably pass this a new
835 // -target-option, which is handled by the -cc1/-cc1as invocation.
836 //
837 // FIXME2: For consistency, it would be ideal if we set up the target
838 // machine state the same when using the frontend or the assembler. We don't
839 // currently do that for the assembler, we pass the options directly to the
840 // backend and never even instantiate the frontend TargetInfo. If we did,
841 // and used its handleTargetFeatures hook, then we could ensure the
842 // assembler and the frontend behave the same.
843
844 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000845 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000846 Features.push_back("+soft-float");
847
848 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000849 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000850 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000851 } else {
852 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
853 // to the assembler correctly.
854 for (const Arg *A :
855 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
856 StringRef Value = A->getValue();
857 if (Value.startswith("-mfpu=")) {
858 WaFPU = A;
859 } else if (Value.startswith("-mcpu=")) {
860 WaCPU = A;
861 } else if (Value.startswith("-mhwdiv=")) {
862 WaHDiv = A;
863 } else if (Value.startswith("-march=")) {
864 WaArch = A;
865 }
866 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000867 }
868
Renato Golin7c542b42015-07-27 23:44:45 +0000869 // Check -march. ClangAs gives preference to -Wa,-march=.
870 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000871 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000872 if (WaArch) {
873 if (ArchArg)
874 D.Diag(clang::diag::warn_drv_unused_argument)
875 << ArchArg->getAsString(Args);
876 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000877 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000878 // FIXME: Set Arch.
879 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
880 } else if (ArchArg) {
881 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000882 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000883 }
884
Renato Golin7c542b42015-07-27 23:44:45 +0000885 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
886 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000887 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000888 if (WaCPU) {
889 if (CPUArg)
890 D.Diag(clang::diag::warn_drv_unused_argument)
891 << CPUArg->getAsString(Args);
892 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000893 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000894 } else if (CPUArg) {
895 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000896 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000897 }
John Brawna95c1a82015-05-08 12:52:18 +0000898
Renato Golin23459c62015-07-30 16:40:17 +0000899 // Add CPU features for generic CPUs
900 if (CPUName == "native") {
901 llvm::StringMap<bool> HostFeatures;
902 if (llvm::sys::getHostCPUFeatures(HostFeatures))
903 for (auto &F : HostFeatures)
904 Features.push_back(
905 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
906 }
907
908 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
909 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
910 if (WaFPU) {
911 if (FPUArg)
912 D.Diag(clang::diag::warn_drv_unused_argument)
913 << FPUArg->getAsString(Args);
914 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
915 Features);
916 } else if (FPUArg) {
917 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
918 }
919
920 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
921 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
922 if (WaHDiv) {
923 if (HDivArg)
924 D.Diag(clang::diag::warn_drv_unused_argument)
925 << HDivArg->getAsString(Args);
926 getARMHWDivFeatures(D, WaHDiv, Args,
927 StringRef(WaHDiv->getValue()).substr(8), Features);
928 } else if (HDivArg)
929 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
930
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000931 // Setting -msoft-float effectively disables NEON because of the GCC
932 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000933 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000934 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000935 // Also need to explicitly disable features which imply NEON.
936 Features.push_back("-crypto");
937 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000938
Eric Christopher269c2a22015-04-04 03:34:43 +0000939 // En/disable crc code generation.
940 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000941 if (A->getOption().matches(options::OPT_mcrc))
942 Features.push_back("+crc");
943 else
944 Features.push_back("-crc");
945 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000946
Akira Hatanakac2694822015-07-07 08:28:42 +0000947 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
948 // neither options are specified, see if we are compiling for kernel/kext and
949 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000950 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
951 options::OPT_mno_long_calls)) {
952 if (A->getOption().matches(options::OPT_mlong_calls))
953 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000954 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
955 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 Features.push_back("+long-calls");
957 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000958
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000959 // Kernel code has more strict alignment requirements.
960 if (KernelOrKext)
961 Features.push_back("+strict-align");
962 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
963 options::OPT_munaligned_access)) {
964 if (A->getOption().matches(options::OPT_munaligned_access)) {
965 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
966 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
967 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000968 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
969 // access either.
970 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
971 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000972 } else
973 Features.push_back("+strict-align");
974 } else {
975 // Assume pre-ARMv6 doesn't support unaligned accesses.
976 //
977 // ARMv6 may or may not support unaligned accesses depending on the
978 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
979 // Darwin and NetBSD targets support unaligned accesses, and others don't.
980 //
981 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
982 // which raises an alignment fault on unaligned accesses. Linux
983 // defaults this bit to 0 and handles it as a system-wide (not
984 // per-process) setting. It is therefore safe to assume that ARMv7+
985 // Linux targets support unaligned accesses. The same goes for NaCl.
986 //
987 // The above behavior is consistent with GCC.
988 int VersionNum = getARMSubArchVersionNumber(Triple);
989 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000990 if (VersionNum < 6 ||
991 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000992 Features.push_back("+strict-align");
993 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
994 if (VersionNum < 7)
995 Features.push_back("+strict-align");
996 } else
997 Features.push_back("+strict-align");
998 }
999
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001000 // llvm does not support reserving registers in general. There is support
1001 // for reserving r9 on ARM though (defined as a platform-specific register
1002 // in ARM EABI).
1003 if (Args.hasArg(options::OPT_ffixed_r9))
1004 Features.push_back("+reserve-r9");
1005
Dimitry Andric08107392016-01-06 07:42:18 +00001006 // The kext linker doesn't know how to deal with movw/movt.
1007 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001008 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001009}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001010
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001011void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1012 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001013 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001014 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001015 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001016 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001017 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001018 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001019 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001020 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001021 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001022 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001023 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001024 } else {
1025 ABIName = "apcs-gnu";
1026 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001027 } else if (Triple.isOSWindows()) {
1028 // FIXME: this is invalid for WindowsCE
1029 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001030 } else {
1031 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001032 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001033 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001034 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001035 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 ABIName = "aapcs-linux";
1037 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001038 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001039 case llvm::Triple::EABI:
1040 ABIName = "aapcs";
1041 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001042 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001043 if (Triple.getOS() == llvm::Triple::NetBSD)
1044 ABIName = "apcs-gnu";
1045 else
1046 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001047 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001048 }
1049 }
1050 CmdArgs.push_back("-target-abi");
1051 CmdArgs.push_back(ABIName);
1052
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001053 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001054 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001055 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001056 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001057 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001058 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001059 CmdArgs.push_back("-mfloat-abi");
1060 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001063 CmdArgs.push_back("-mfloat-abi");
1064 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001065 } else {
1066 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001068 CmdArgs.push_back("-mfloat-abi");
1069 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001070 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001071
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001072 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001073 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1074 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001076 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001077 CmdArgs.push_back("-arm-global-merge=false");
1078 else
1079 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001080 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001081
Bob Wilson9c8af452013-04-11 18:53:25 +00001082 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001084 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001085}
Renato Goline17c5802015-07-27 23:44:42 +00001086// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001087
Tim Northover573cbee2014-05-24 12:52:07 +00001088/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1089/// targeting.
1090static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001091 Arg *A;
1092 std::string CPU;
1093 // If we have -mtune or -mcpu, use that.
1094 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001095 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001096 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001097 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001098 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001099 }
1100
Kevin Qin110db6f2014-07-18 07:03:22 +00001101 // Handle CPU name is 'native'.
1102 if (CPU == "native")
1103 return llvm::sys::getHostCPUName();
1104 else if (CPU.size())
1105 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001106
James Molloy9b1586b2014-04-17 12:51:17 +00001107 // Make sure we pick "cyclone" if -arch is used.
1108 // FIXME: Should this be picked by checking the target triple instead?
1109 if (Args.getLastArg(options::OPT_arch))
1110 return "cyclone";
1111
1112 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001113}
1114
Tim Northover573cbee2014-05-24 12:52:07 +00001115void Clang::AddAArch64TargetArgs(const ArgList &Args,
1116 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001117 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1118 llvm::Triple Triple(TripleStr);
1119
1120 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1121 Args.hasArg(options::OPT_mkernel) ||
1122 Args.hasArg(options::OPT_fapple_kext))
1123 CmdArgs.push_back("-disable-red-zone");
1124
1125 if (!Args.hasFlag(options::OPT_mimplicit_float,
1126 options::OPT_mno_implicit_float, true))
1127 CmdArgs.push_back("-no-implicit-float");
1128
Craig Topper92fc2df2014-05-17 16:56:41 +00001129 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001130 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1131 ABIName = A->getValue();
1132 else if (Triple.isOSDarwin())
1133 ABIName = "darwinpcs";
1134 else
1135 ABIName = "aapcs";
1136
1137 CmdArgs.push_back("-target-abi");
1138 CmdArgs.push_back(ABIName);
1139
Bradley Smith9ff64332014-10-13 10:16:06 +00001140 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1141 options::OPT_mno_fix_cortex_a53_835769)) {
1142 CmdArgs.push_back("-backend-option");
1143 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1144 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1145 else
1146 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001147 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001148 // Enabled A53 errata (835769) workaround by default on android
1149 CmdArgs.push_back("-backend-option");
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001151 }
1152
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001153 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001154 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1155 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001156 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001157 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001158 CmdArgs.push_back("-aarch64-global-merge=false");
1159 else
1160 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001161 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001162}
1163
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001164// Get CPU and ABI names. They are not independent
1165// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001166void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1167 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001168 const char *DefMips32CPU = "mips32r2";
1169 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001170
Daniel Sanders2bf13662014-07-10 14:40:57 +00001171 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1172 // default for mips64(el)?-img-linux-gnu.
1173 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1174 Triple.getEnvironment() == llvm::Triple::GNU) {
1175 DefMips32CPU = "mips32r6";
1176 DefMips64CPU = "mips64r6";
1177 }
Renato Golin7c542b42015-07-27 23:44:45 +00001178
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001179 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001180 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001181 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001182
Brad Smithba26f582015-01-06 02:53:17 +00001183 // MIPS3 is the default for mips64*-unknown-openbsd.
1184 if (Triple.getOS() == llvm::Triple::OpenBSD)
1185 DefMips64CPU = "mips3";
1186
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001187 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001188 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001189
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001190 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001191 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001192 // Convert a GNU style Mips ABI name to the name
1193 // accepted by LLVM Mips backend.
1194 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001195 .Case("32", "o32")
1196 .Case("64", "n64")
1197 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001199
1200 // Setup default CPU and ABI names.
1201 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001202 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001203 default:
1204 llvm_unreachable("Unexpected triple arch name");
1205 case llvm::Triple::mips:
1206 case llvm::Triple::mipsel:
1207 CPUName = DefMips32CPU;
1208 break;
1209 case llvm::Triple::mips64:
1210 case llvm::Triple::mips64el:
1211 CPUName = DefMips64CPU;
1212 break;
1213 }
1214 }
1215
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001216 if (ABIName.empty()) {
1217 // Deduce ABI name from the target triple.
1218 if (Triple.getArch() == llvm::Triple::mips ||
1219 Triple.getArch() == llvm::Triple::mipsel)
1220 ABIName = "o32";
1221 else
1222 ABIName = "n64";
1223 }
1224
1225 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001226 // Deduce CPU name from ABI name.
1227 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001228 .Cases("o32", "eabi", DefMips32CPU)
1229 .Cases("n32", "n64", DefMips64CPU)
1230 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001231 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001232
1233 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001234}
1235
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001236std::string mips::getMipsABILibSuffix(const ArgList &Args,
1237 const llvm::Triple &Triple) {
1238 StringRef CPUName, ABIName;
1239 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1240 return llvm::StringSwitch<std::string>(ABIName)
1241 .Case("o32", "")
1242 .Case("n32", "32")
1243 .Case("n64", "64");
1244}
1245
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001246// Convert ABI name to the GNU tools acceptable variant.
1247static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1248 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001249 .Case("o32", "32")
1250 .Case("n64", "64")
1251 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252}
1253
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001254// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1255// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001256static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1257 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001258 if (Arg *A =
1259 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1260 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001261 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001263 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001264 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001265 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001266 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1267 .Case("soft", mips::FloatABI::Soft)
1268 .Case("hard", mips::FloatABI::Hard)
1269 .Default(mips::FloatABI::Invalid);
1270 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001271 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001273 }
1274 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001275 }
1276
1277 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 // Assume "hard", because it's a default value used by gcc.
1280 // When we start to recognize specific target MIPS processors,
1281 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001282 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001283 }
1284
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001285 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1286 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001287}
1288
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001289static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001290 std::vector<const char *> &Features,
1291 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001292 StringRef FeatureName) {
1293 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001294 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001295 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001296 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001297 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 }
1299}
1300
Daniel Sanders379d44b2014-07-16 11:52:23 +00001301static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1302 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001304 StringRef CPUName;
1305 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001306 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307 ABIName = getGnuCompatibleMipsABIName(ABIName);
1308
Daniel Sandersfeb61302014-08-08 15:47:17 +00001309 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1310 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001311
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001312 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1313 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001314 // FIXME: Note, this is a hack. We need to pass the selected float
1315 // mode to the MipsTargetInfoBase to define appropriate macros there.
1316 // Now it is the only method.
1317 Features.push_back("+soft-float");
1318 }
1319
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001320 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001321 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001322 if (Val == "2008") {
1323 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1324 Features.push_back("+nan2008");
1325 else {
1326 Features.push_back("-nan2008");
1327 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1328 }
1329 } else if (Val == "legacy") {
1330 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1331 Features.push_back("-nan2008");
1332 else {
1333 Features.push_back("+nan2008");
1334 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1335 }
1336 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001337 D.Diag(diag::err_drv_unsupported_option_argument)
1338 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001339 }
1340
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001341 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1342 options::OPT_mdouble_float, "single-float");
1343 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1344 "mips16");
1345 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1346 options::OPT_mno_micromips, "micromips");
1347 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1348 "dsp");
1349 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1350 "dspr2");
1351 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1352 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001353
1354 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1355 // pass -mfpxx
1356 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1357 options::OPT_mfp64)) {
1358 if (A->getOption().matches(options::OPT_mfp32))
1359 Features.push_back(Args.MakeArgString("-fp64"));
1360 else if (A->getOption().matches(options::OPT_mfpxx)) {
1361 Features.push_back(Args.MakeArgString("+fpxx"));
1362 Features.push_back(Args.MakeArgString("+nooddspreg"));
1363 } else
1364 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001365 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001366 Features.push_back(Args.MakeArgString("+fpxx"));
1367 Features.push_back(Args.MakeArgString("+nooddspreg"));
1368 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001369
Daniel Sanders28e5d392014-07-10 10:39:51 +00001370 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1371 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001372}
1373
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001374void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001375 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001376 const Driver &D = getToolChain().getDriver();
1377 StringRef CPUName;
1378 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001379 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001380 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001381
1382 CmdArgs.push_back("-target-abi");
1383 CmdArgs.push_back(ABIName.data());
1384
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001385 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1386 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001387 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001388 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001389 CmdArgs.push_back("-mfloat-abi");
1390 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001391 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001392 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001393 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001394 CmdArgs.push_back("-mfloat-abi");
1395 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001396 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001397
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001398 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1399 if (A->getOption().matches(options::OPT_mxgot)) {
1400 CmdArgs.push_back("-mllvm");
1401 CmdArgs.push_back("-mxgot");
1402 }
1403 }
1404
Simon Atanasyanc580b322013-05-11 06:33:44 +00001405 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1406 options::OPT_mno_ldc1_sdc1)) {
1407 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1408 CmdArgs.push_back("-mllvm");
1409 CmdArgs.push_back("-mno-ldc1-sdc1");
1410 }
1411 }
1412
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001413 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1414 options::OPT_mno_check_zero_division)) {
1415 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1416 CmdArgs.push_back("-mllvm");
1417 CmdArgs.push_back("-mno-check-zero-division");
1418 }
1419 }
1420
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001421 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001422 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001423 CmdArgs.push_back("-mllvm");
1424 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1425 A->claim();
1426 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001427}
1428
Hal Finkel8eb59282012-06-11 22:35:19 +00001429/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1430static std::string getPPCTargetCPU(const ArgList &Args) {
1431 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001432 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001433
1434 if (CPUName == "native") {
1435 std::string CPU = llvm::sys::getHostCPUName();
1436 if (!CPU.empty() && CPU != "generic")
1437 return CPU;
1438 else
1439 return "";
1440 }
1441
1442 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001443 .Case("common", "generic")
1444 .Case("440", "440")
1445 .Case("440fp", "440")
1446 .Case("450", "450")
1447 .Case("601", "601")
1448 .Case("602", "602")
1449 .Case("603", "603")
1450 .Case("603e", "603e")
1451 .Case("603ev", "603ev")
1452 .Case("604", "604")
1453 .Case("604e", "604e")
1454 .Case("620", "620")
1455 .Case("630", "pwr3")
1456 .Case("G3", "g3")
1457 .Case("7400", "7400")
1458 .Case("G4", "g4")
1459 .Case("7450", "7450")
1460 .Case("G4+", "g4+")
1461 .Case("750", "750")
1462 .Case("970", "970")
1463 .Case("G5", "g5")
1464 .Case("a2", "a2")
1465 .Case("a2q", "a2q")
1466 .Case("e500mc", "e500mc")
1467 .Case("e5500", "e5500")
1468 .Case("power3", "pwr3")
1469 .Case("power4", "pwr4")
1470 .Case("power5", "pwr5")
1471 .Case("power5x", "pwr5x")
1472 .Case("power6", "pwr6")
1473 .Case("power6x", "pwr6x")
1474 .Case("power7", "pwr7")
1475 .Case("power8", "pwr8")
1476 .Case("pwr3", "pwr3")
1477 .Case("pwr4", "pwr4")
1478 .Case("pwr5", "pwr5")
1479 .Case("pwr5x", "pwr5x")
1480 .Case("pwr6", "pwr6")
1481 .Case("pwr6x", "pwr6x")
1482 .Case("pwr7", "pwr7")
1483 .Case("pwr8", "pwr8")
1484 .Case("powerpc", "ppc")
1485 .Case("powerpc64", "ppc64")
1486 .Case("powerpc64le", "ppc64le")
1487 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001488 }
1489
1490 return "";
1491}
1492
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001493static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1494 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001495 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001496 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001497
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001498 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1499 if (FloatABI == ppc::FloatABI::Soft &&
1500 !(Triple.getArch() == llvm::Triple::ppc64 ||
1501 Triple.getArch() == llvm::Triple::ppc64le))
1502 Features.push_back("+soft-float");
1503 else if (FloatABI == ppc::FloatABI::Soft &&
1504 (Triple.getArch() == llvm::Triple::ppc64 ||
1505 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001506 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001507 << "soft float is not supported for ppc64";
1508
Eric Christopher643bb6a2013-10-16 20:40:08 +00001509 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001510 AddTargetFeature(Args, Features, options::OPT_faltivec,
1511 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001512}
1513
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001514ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1515 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1516 if (Arg *A =
1517 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1518 options::OPT_mfloat_abi_EQ)) {
1519 if (A->getOption().matches(options::OPT_msoft_float))
1520 ABI = ppc::FloatABI::Soft;
1521 else if (A->getOption().matches(options::OPT_mhard_float))
1522 ABI = ppc::FloatABI::Hard;
1523 else {
1524 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1525 .Case("soft", ppc::FloatABI::Soft)
1526 .Case("hard", ppc::FloatABI::Hard)
1527 .Default(ppc::FloatABI::Invalid);
1528 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1529 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1530 ABI = ppc::FloatABI::Hard;
1531 }
1532 }
1533 }
1534
1535 // If unspecified, choose the default based on the platform.
1536 if (ABI == ppc::FloatABI::Invalid) {
1537 ABI = ppc::FloatABI::Hard;
1538 }
1539
1540 return ABI;
1541}
1542
Ulrich Weigand8afad612014-07-28 13:17:52 +00001543void Clang::AddPPCTargetArgs(const ArgList &Args,
1544 ArgStringList &CmdArgs) const {
1545 // Select the ABI to use.
1546 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001547 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001548 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001549 case llvm::Triple::ppc64: {
1550 // When targeting a processor that supports QPX, or if QPX is
1551 // specifically enabled, default to using the ABI that supports QPX (so
1552 // long as it is not specifically disabled).
1553 bool HasQPX = false;
1554 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1555 HasQPX = A->getValue() == StringRef("a2q");
1556 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1557 if (HasQPX) {
1558 ABIName = "elfv1-qpx";
1559 break;
1560 }
1561
Ulrich Weigand8afad612014-07-28 13:17:52 +00001562 ABIName = "elfv1";
1563 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001564 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001565 case llvm::Triple::ppc64le:
1566 ABIName = "elfv2";
1567 break;
1568 default:
1569 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001570 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001572 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1573 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1574 // the option if given as we don't have backend support for any targets
1575 // that don't use the altivec abi.
1576 if (StringRef(A->getValue()) != "altivec")
1577 ABIName = A->getValue();
1578
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001579 ppc::FloatABI FloatABI =
1580 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1581
1582 if (FloatABI == ppc::FloatABI::Soft) {
1583 // Floating point operations and argument passing are soft.
1584 CmdArgs.push_back("-msoft-float");
1585 CmdArgs.push_back("-mfloat-abi");
1586 CmdArgs.push_back("soft");
1587 } else {
1588 // Floating point operations and argument passing are hard.
1589 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1590 CmdArgs.push_back("-mfloat-abi");
1591 CmdArgs.push_back("hard");
1592 }
1593
Ulrich Weigand8afad612014-07-28 13:17:52 +00001594 if (ABIName) {
1595 CmdArgs.push_back("-target-abi");
1596 CmdArgs.push_back(ABIName);
1597 }
1598}
1599
1600bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1601 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1602 return A && (A->getValue() == StringRef(Value));
1603}
1604
Tom Stellard6674c702013-04-01 20:56:53 +00001605/// Get the (LLVM) name of the R600 gpu we are targeting.
1606static std::string getR600TargetGPU(const ArgList &Args) {
1607 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001608 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001609 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001610 .Cases("rv630", "rv635", "r600")
1611 .Cases("rv610", "rv620", "rs780", "rs880")
1612 .Case("rv740", "rv770")
1613 .Case("palm", "cedar")
1614 .Cases("sumo", "sumo2", "sumo")
1615 .Case("hemlock", "cypress")
1616 .Case("aruba", "cayman")
1617 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001618 }
1619 return "";
1620}
1621
Jacques Pienaard964cc22016-03-28 21:02:54 +00001622static std::string getLanaiTargetCPU(const ArgList &Args) {
1623 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1624 return A->getValue();
1625 }
1626 return "";
1627}
1628
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001629void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001630 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001631 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001632 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001633
James Y Knightb2406522015-06-15 20:51:24 +00001634 bool SoftFloatABI = false;
1635 if (Arg *A =
1636 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001637 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001638 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001639 }
1640
James Y Knightb2406522015-06-15 20:51:24 +00001641 // Only the hard-float ABI on Sparc is standardized, and it is the
1642 // default. GCC also supports a nonstandard soft-float ABI mode, and
1643 // perhaps LLVM should implement that, too. However, since llvm
1644 // currently does not support Sparc soft-float, at all, display an
1645 // error if it's requested.
1646 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001647 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1648 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001649 }
1650}
1651
Richard Sandiford4652d892013-07-19 16:51:51 +00001652static const char *getSystemZTargetCPU(const ArgList &Args) {
1653 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1654 return A->getValue();
1655 return "z10";
1656}
1657
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001658static void getSystemZTargetFeatures(const ArgList &Args,
1659 std::vector<const char *> &Features) {
1660 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001661 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001662 if (A->getOption().matches(options::OPT_mhtm))
1663 Features.push_back("+transactional-execution");
1664 else
1665 Features.push_back("-transactional-execution");
1666 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001667 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001668 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001669 if (A->getOption().matches(options::OPT_mvx))
1670 Features.push_back("+vector");
1671 else
1672 Features.push_back("-vector");
1673 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001674}
1675
Chandler Carruth953fb082013-01-13 11:46:33 +00001676static const char *getX86TargetCPU(const ArgList &Args,
1677 const llvm::Triple &Triple) {
1678 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001679 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001680 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001681 return "core-avx2";
1682
Chandler Carruth953fb082013-01-13 11:46:33 +00001683 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001684 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001685
1686 // FIXME: Reject attempts to use -march=native unless the target matches
1687 // the host.
1688 //
1689 // FIXME: We should also incorporate the detected target features for use
1690 // with -native.
1691 std::string CPU = llvm::sys::getHostCPUName();
1692 if (!CPU.empty() && CPU != "generic")
1693 return Args.MakeArgString(CPU);
1694 }
1695
Reid Kleckner3123eff2015-06-30 16:32:04 +00001696 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1697 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1698 StringRef Arch = A->getValue();
1699 const char *CPU;
1700 if (Triple.getArch() == llvm::Triple::x86) {
1701 CPU = llvm::StringSwitch<const char *>(Arch)
1702 .Case("IA32", "i386")
1703 .Case("SSE", "pentium3")
1704 .Case("SSE2", "pentium4")
1705 .Case("AVX", "sandybridge")
1706 .Case("AVX2", "haswell")
1707 .Default(nullptr);
1708 } else {
1709 CPU = llvm::StringSwitch<const char *>(Arch)
1710 .Case("AVX", "sandybridge")
1711 .Case("AVX2", "haswell")
1712 .Default(nullptr);
1713 }
1714 if (CPU)
1715 return CPU;
1716 }
1717
Chandler Carruth953fb082013-01-13 11:46:33 +00001718 // Select the default CPU if none was given (or detection failed).
1719
1720 if (Triple.getArch() != llvm::Triple::x86_64 &&
1721 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001722 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001723
1724 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1725
1726 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001727 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001728 if (Triple.getArchName() == "x86_64h")
1729 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001730 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001731 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001732
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001733 // Set up default CPU name for PS4 compilers.
1734 if (Triple.isPS4CPU())
1735 return "btver2";
1736
Alexey Bataev286d1b92014-01-31 04:07:13 +00001737 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001738 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001739 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001740
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001741 // Everything else goes to x86-64 in 64-bit mode.
1742 if (Is64Bit)
1743 return "x86-64";
1744
1745 switch (Triple.getOS()) {
1746 case llvm::Triple::FreeBSD:
1747 case llvm::Triple::NetBSD:
1748 case llvm::Triple::OpenBSD:
1749 return "i486";
1750 case llvm::Triple::Haiku:
1751 return "i586";
1752 case llvm::Triple::Bitrig:
1753 return "i686";
1754 default:
1755 // Fallback to p4.
1756 return "pentium4";
1757 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001758}
1759
Dan Gohmanc2853072015-09-03 22:51:53 +00001760/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1761static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1762 // If we have -mcpu=, use that.
1763 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1764 StringRef CPU = A->getValue();
1765
1766#ifdef __wasm__
1767 // Handle "native" by examining the host. "native" isn't meaningful when
1768 // cross compiling, so only support this when the host is also WebAssembly.
1769 if (CPU == "native")
1770 return llvm::sys::getHostCPUName();
1771#endif
1772
1773 return CPU;
1774 }
1775
1776 return "generic";
1777}
1778
Renato Golin7c542b42015-07-27 23:44:45 +00001779static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1780 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001781 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001782 default:
1783 return "";
1784
Amara Emerson703da2e2013-10-31 09:32:33 +00001785 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001786 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001787 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001788
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001789 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001790 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001791 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001792 case llvm::Triple::thumbeb: {
1793 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001794 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001795 return arm::getARMTargetCPU(MCPU, MArch, T);
1796 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001797 case llvm::Triple::mips:
1798 case llvm::Triple::mipsel:
1799 case llvm::Triple::mips64:
1800 case llvm::Triple::mips64el: {
1801 StringRef CPUName;
1802 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001803 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001804 return CPUName;
1805 }
1806
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001807 case llvm::Triple::nvptx:
1808 case llvm::Triple::nvptx64:
1809 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1810 return A->getValue();
1811 return "";
1812
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001813 case llvm::Triple::ppc:
1814 case llvm::Triple::ppc64:
1815 case llvm::Triple::ppc64le: {
1816 std::string TargetCPUName = getPPCTargetCPU(Args);
1817 // LLVM may default to generating code for the native CPU,
1818 // but, like gcc, we default to a more generic option for
1819 // each architecture. (except on Darwin)
1820 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1821 if (T.getArch() == llvm::Triple::ppc64)
1822 TargetCPUName = "ppc64";
1823 else if (T.getArch() == llvm::Triple::ppc64le)
1824 TargetCPUName = "ppc64le";
1825 else
1826 TargetCPUName = "ppc";
1827 }
1828 return TargetCPUName;
1829 }
1830
1831 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001832 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001833 case llvm::Triple::sparcv9:
1834 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001835 return A->getValue();
1836 return "";
1837
1838 case llvm::Triple::x86:
1839 case llvm::Triple::x86_64:
1840 return getX86TargetCPU(Args, T);
1841
1842 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001843 return "hexagon" +
1844 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001845
Jacques Pienaard964cc22016-03-28 21:02:54 +00001846 case llvm::Triple::lanai:
1847 return getLanaiTargetCPU(Args);
1848
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001849 case llvm::Triple::systemz:
1850 return getSystemZTargetCPU(Args);
1851
1852 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001853 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001854 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001855
1856 case llvm::Triple::wasm32:
1857 case llvm::Triple::wasm64:
1858 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001859 }
1860}
1861
Alp Tokerce365ca2013-12-02 12:43:03 +00001862static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001863 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001864 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1865 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1866 // forward.
1867 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001868 std::string Plugin =
1869 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001870 CmdArgs.push_back(Args.MakeArgString(Plugin));
1871
1872 // Try to pass driver level flags relevant to LTO code generation down to
1873 // the plugin.
1874
1875 // Handle flags for selecting CPU variants.
1876 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1877 if (!CPU.empty())
1878 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001879
James Molloyf97fdae2015-12-21 10:44:36 +00001880 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1881 StringRef OOpt;
1882 if (A->getOption().matches(options::OPT_O4) ||
1883 A->getOption().matches(options::OPT_Ofast))
1884 OOpt = "3";
1885 else if (A->getOption().matches(options::OPT_O))
1886 OOpt = A->getValue();
1887 else if (A->getOption().matches(options::OPT_O0))
1888 OOpt = "0";
1889 if (!OOpt.empty())
1890 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1891 }
1892
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001893 if (IsThinLTO)
1894 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001895
1896 // If an explicit debugger tuning argument appeared, pass it along.
1897 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1898 options::OPT_ggdbN_Group)) {
1899 if (A->getOption().matches(options::OPT_glldb))
1900 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1901 else if (A->getOption().matches(options::OPT_gsce))
1902 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1903 else
1904 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1905 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001906}
1907
Sanjay Patel2987c292015-06-11 14:53:41 +00001908/// This is a helper function for validating the optional refinement step
1909/// parameter in reciprocal argument strings. Return false if there is an error
1910/// parsing the refinement step. Otherwise, return true and set the Position
1911/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001912static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001913 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001914 const char RefinementStepToken = ':';
1915 Position = In.find(RefinementStepToken);
1916 if (Position != StringRef::npos) {
1917 StringRef Option = A.getOption().getName();
1918 StringRef RefStep = In.substr(Position + 1);
1919 // Allow exactly one numeric character for the additional refinement
1920 // step parameter. This is reasonable for all currently-supported
1921 // operations and architectures because we would expect that a larger value
1922 // of refinement steps would cause the estimate "optimization" to
1923 // under-perform the native operation. Also, if the estimate does not
1924 // converge quickly, it probably will not ever converge, so further
1925 // refinement steps will not produce a better answer.
1926 if (RefStep.size() != 1) {
1927 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1928 return false;
1929 }
1930 char RefStepChar = RefStep[0];
1931 if (RefStepChar < '0' || RefStepChar > '9') {
1932 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1933 return false;
1934 }
1935 }
1936 return true;
1937}
1938
1939/// The -mrecip flag requires processing of many optional parameters.
1940static void ParseMRecip(const Driver &D, const ArgList &Args,
1941 ArgStringList &OutStrings) {
1942 StringRef DisabledPrefixIn = "!";
1943 StringRef DisabledPrefixOut = "!";
1944 StringRef EnabledPrefixOut = "";
1945 StringRef Out = "-mrecip=";
1946
1947 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1948 if (!A)
1949 return;
1950
1951 unsigned NumOptions = A->getNumValues();
1952 if (NumOptions == 0) {
1953 // No option is the same as "all".
1954 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1955 return;
1956 }
1957
1958 // Pass through "all", "none", or "default" with an optional refinement step.
1959 if (NumOptions == 1) {
1960 StringRef Val = A->getValue(0);
1961 size_t RefStepLoc;
1962 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1963 return;
1964 StringRef ValBase = Val.slice(0, RefStepLoc);
1965 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1966 OutStrings.push_back(Args.MakeArgString(Out + Val));
1967 return;
1968 }
1969 }
1970
1971 // Each reciprocal type may be enabled or disabled individually.
1972 // Check each input value for validity, concatenate them all back together,
1973 // and pass through.
1974
1975 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001976 OptionStrings.insert(std::make_pair("divd", false));
1977 OptionStrings.insert(std::make_pair("divf", false));
1978 OptionStrings.insert(std::make_pair("vec-divd", false));
1979 OptionStrings.insert(std::make_pair("vec-divf", false));
1980 OptionStrings.insert(std::make_pair("sqrtd", false));
1981 OptionStrings.insert(std::make_pair("sqrtf", false));
1982 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1983 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001984
1985 for (unsigned i = 0; i != NumOptions; ++i) {
1986 StringRef Val = A->getValue(i);
1987
1988 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1989 // Ignore the disablement token for string matching.
1990 if (IsDisabled)
1991 Val = Val.substr(1);
1992
1993 size_t RefStep;
1994 if (!getRefinementStep(Val, D, *A, RefStep))
1995 return;
1996
1997 StringRef ValBase = Val.slice(0, RefStep);
1998 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1999 if (OptionIter == OptionStrings.end()) {
2000 // Try again specifying float suffix.
2001 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2002 if (OptionIter == OptionStrings.end()) {
2003 // The input name did not match any known option string.
2004 D.Diag(diag::err_drv_unknown_argument) << Val;
2005 return;
2006 }
2007 // The option was specified without a float or double suffix.
2008 // Make sure that the double entry was not already specified.
2009 // The float entry will be checked below.
2010 if (OptionStrings[ValBase.str() + 'd']) {
2011 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2012 return;
2013 }
2014 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002015
Sanjay Patel2987c292015-06-11 14:53:41 +00002016 if (OptionIter->second == true) {
2017 // Duplicate option specified.
2018 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2019 return;
2020 }
2021
2022 // Mark the matched option as found. Do not allow duplicate specifiers.
2023 OptionIter->second = true;
2024
2025 // If the precision was not specified, also mark the double entry as found.
2026 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2027 OptionStrings[ValBase.str() + 'd'] = true;
2028
2029 // Build the output string.
2030 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2031 Out = Args.MakeArgString(Out + Prefix + Val);
2032 if (i != NumOptions - 1)
2033 Out = Args.MakeArgString(Out + ",");
2034 }
2035
2036 OutStrings.push_back(Args.MakeArgString(Out));
2037}
2038
Eric Christopherc54920a2015-03-23 19:26:05 +00002039static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002040 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002041 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002042 // If -march=native, autodetect the feature list.
2043 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2044 if (StringRef(A->getValue()) == "native") {
2045 llvm::StringMap<bool> HostFeatures;
2046 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2047 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002048 Features.push_back(
2049 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002050 }
2051 }
2052
Jim Grosbach82eee262013-11-16 00:53:35 +00002053 if (Triple.getArchName() == "x86_64h") {
2054 // x86_64h implies quite a few of the more modern subtarget features
2055 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2056 Features.push_back("-rdrnd");
2057 Features.push_back("-aes");
2058 Features.push_back("-pclmul");
2059 Features.push_back("-rtm");
2060 Features.push_back("-hle");
2061 Features.push_back("-fsgsbase");
2062 }
2063
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002064 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002065 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002066 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002067 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002068 Features.push_back("+sse4.2");
2069 Features.push_back("+popcnt");
2070 } else
2071 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002072 }
2073
Eric Christopherc54920a2015-03-23 19:26:05 +00002074 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002075 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2076 StringRef Arch = A->getValue();
2077 bool ArchUsed = false;
2078 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002079 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002080 if (Arch == "AVX" || Arch == "AVX2") {
2081 ArchUsed = true;
2082 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2083 }
2084 }
2085 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002086 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002087 if (Arch == "IA32") {
2088 ArchUsed = true;
2089 } else if (Arch == "SSE" || Arch == "SSE2") {
2090 ArchUsed = true;
2091 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2092 }
2093 }
2094 if (!ArchUsed)
2095 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2096 }
2097
Jim Grosbach82eee262013-11-16 00:53:35 +00002098 // Now add any that the user explicitly requested on the command line,
2099 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002100 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002101}
2102
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002103void Clang::AddX86TargetArgs(const ArgList &Args,
2104 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002105 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002106 Args.hasArg(options::OPT_mkernel) ||
2107 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002108 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002109
Bob Wilson2616e2e2013-02-10 16:01:41 +00002110 // Default to avoid implicit floating-point for kernel/kext code, but allow
2111 // that to be overridden with -mno-soft-float.
2112 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2113 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002114 if (Arg *A = Args.getLastArg(
2115 options::OPT_msoft_float, options::OPT_mno_soft_float,
2116 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002117 const Option &O = A->getOption();
2118 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2119 O.matches(options::OPT_msoft_float));
2120 }
2121 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002122 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002123
2124 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2125 StringRef Value = A->getValue();
2126 if (Value == "intel" || Value == "att") {
2127 CmdArgs.push_back("-mllvm");
2128 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2129 } else {
2130 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2131 << A->getOption().getName() << Value;
2132 }
2133 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002134}
2135
Tony Linthicum76329bf2011-12-12 21:14:55 +00002136void Clang::AddHexagonTargetArgs(const ArgList &Args,
2137 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002138 CmdArgs.push_back("-mqdsp6-compat");
2139 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002140
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002141 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2142 std::string N = llvm::utostr(G.getValue());
2143 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002144 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002145 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002146 }
2147
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002148 if (!Args.hasArg(options::OPT_fno_short_enums))
2149 CmdArgs.push_back("-fshort-enums");
2150 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002151 CmdArgs.push_back("-mllvm");
2152 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002153 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002154 CmdArgs.push_back("-mllvm");
2155 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002156}
2157
Jacques Pienaard964cc22016-03-28 21:02:54 +00002158void Clang::AddLanaiTargetArgs(const ArgList &Args,
2159 ArgStringList &CmdArgs) const {
2160 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2161 StringRef CPUName = A->getValue();
2162
2163 CmdArgs.push_back("-target-cpu");
2164 CmdArgs.push_back(Args.MakeArgString(CPUName));
2165 }
2166 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2167 StringRef Value = A->getValue();
2168 // Only support mregparm=4 to support old usage. Report error for all other
2169 // cases.
2170 int Mregparm;
2171 if (Value.getAsInteger(10, Mregparm)) {
2172 if (Mregparm != 4) {
2173 getToolChain().getDriver().Diag(
2174 diag::err_drv_unsupported_option_argument)
2175 << A->getOption().getName() << Value;
2176 }
2177 }
2178 }
2179}
2180
Dan Gohmane3d71e12016-01-07 01:00:21 +00002181void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2182 ArgStringList &CmdArgs) const {
2183 // Default to "hidden" visibility.
2184 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2185 options::OPT_fvisibility_ms_compat)) {
2186 CmdArgs.push_back("-fvisibility");
2187 CmdArgs.push_back("hidden");
2188 }
2189}
2190
Kevin Qin110db6f2014-07-18 07:03:22 +00002191// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002192static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002193 std::vector<const char *> &Features) {
2194 SmallVector<StringRef, 8> Split;
2195 text.split(Split, StringRef("+"), -1, false);
2196
Benjamin Kramer72e64312015-09-24 14:48:49 +00002197 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002198 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002199 .Case("fp", "+fp-armv8")
2200 .Case("simd", "+neon")
2201 .Case("crc", "+crc")
2202 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002203 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002204 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002205 .Case("nofp", "-fp-armv8")
2206 .Case("nosimd", "-neon")
2207 .Case("nocrc", "-crc")
2208 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002209 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002210 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002211 .Default(nullptr);
2212 if (result)
2213 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002214 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002215 D.Diag(diag::err_drv_no_neon_modifier);
2216 else
2217 return false;
2218 }
2219 return true;
2220}
2221
2222// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2223// decode CPU and feature.
2224static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2225 std::vector<const char *> &Features) {
2226 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2227 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002228 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002229 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2230 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002231 Features.push_back("+neon");
2232 Features.push_back("+crc");
2233 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002234 } else if (CPU == "cyclone") {
2235 Features.push_back("+neon");
2236 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002237 } else if (CPU == "generic") {
2238 Features.push_back("+neon");
2239 } else {
2240 return false;
2241 }
2242
2243 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2244 return false;
2245
2246 return true;
2247}
2248
2249static bool
2250getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2251 const ArgList &Args,
2252 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002253 std::string MarchLowerCase = March.lower();
2254 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002256 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002257 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002258 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002259 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002260 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2261 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002262 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002263 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002264 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002265
2266 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2267 return false;
2268
2269 return true;
2270}
2271
2272static bool
2273getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2274 const ArgList &Args,
2275 std::vector<const char *> &Features) {
2276 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002277 std::string McpuLowerCase = Mcpu.lower();
2278 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002279 return false;
2280
2281 return true;
2282}
2283
2284static bool
2285getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2286 const ArgList &Args,
2287 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002288 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002289 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002290 if (MtuneLowerCase == "native")
2291 MtuneLowerCase = llvm::sys::getHostCPUName();
2292 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002293 Features.push_back("+zcm");
2294 Features.push_back("+zcz");
2295 }
2296 return true;
2297}
2298
2299static bool
2300getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2301 const ArgList &Args,
2302 std::vector<const char *> &Features) {
2303 StringRef CPU;
2304 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002305 std::string McpuLowerCase = Mcpu.lower();
2306 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002307 return false;
2308
2309 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2310}
2311
Justin Bognerf9052562015-11-13 23:07:31 +00002312static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002313 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002314 Arg *A;
2315 bool success = true;
2316 // Enable NEON by default.
2317 Features.push_back("+neon");
2318 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2319 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2320 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2321 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002322 else if (Args.hasArg(options::OPT_arch))
2323 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2324 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002325
2326 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2327 success =
2328 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2329 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2330 success =
2331 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002332 else if (Args.hasArg(options::OPT_arch))
2333 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2334 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002335
2336 if (!success)
2337 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002338
2339 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2340 Features.push_back("-fp-armv8");
2341 Features.push_back("-crypto");
2342 Features.push_back("-neon");
2343 }
Bradley Smith418c5932014-05-02 15:17:51 +00002344
2345 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002346 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002347 if (A->getOption().matches(options::OPT_mcrc))
2348 Features.push_back("+crc");
2349 else
2350 Features.push_back("-crc");
2351 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002352
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002353 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2354 options::OPT_munaligned_access))
2355 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2356 Features.push_back("+strict-align");
2357
Justin Bognerf9052562015-11-13 23:07:31 +00002358 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002359 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002360}
2361
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002362static void getHexagonTargetFeatures(const ArgList &Args,
2363 std::vector<const char *> &Features) {
2364 bool HasHVX = false, HasHVXD = false;
2365
Eric Christopher49062a52015-12-22 03:12:34 +00002366 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2367 // doing dependent option handling here rather than in initFeatureMap or a
2368 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002369 for (auto &A : Args) {
2370 auto &Opt = A->getOption();
2371 if (Opt.matches(options::OPT_mhexagon_hvx))
2372 HasHVX = true;
2373 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2374 HasHVXD = HasHVX = false;
2375 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2376 HasHVXD = HasHVX = true;
2377 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2378 HasHVXD = false;
2379 else
2380 continue;
2381 A->claim();
2382 }
2383
2384 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2385 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2386}
2387
Dan Gohmanc2853072015-09-03 22:51:53 +00002388static void getWebAssemblyTargetFeatures(const ArgList &Args,
2389 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002390 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002391}
2392
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002393static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002394 const ArgList &Args, ArgStringList &CmdArgs,
2395 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002396 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002397 std::vector<const char *> Features;
2398 switch (Triple.getArch()) {
2399 default:
2400 break;
2401 case llvm::Triple::mips:
2402 case llvm::Triple::mipsel:
2403 case llvm::Triple::mips64:
2404 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002405 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002406 break;
2407
2408 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002409 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002410 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002411 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002412 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002413 break;
2414
2415 case llvm::Triple::ppc:
2416 case llvm::Triple::ppc64:
2417 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002418 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002419 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002420 case llvm::Triple::systemz:
2421 getSystemZTargetFeatures(Args, Features);
2422 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002423 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002424 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002425 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002426 break;
2427 case llvm::Triple::x86:
2428 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002429 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002430 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002431 case llvm::Triple::hexagon:
2432 getHexagonTargetFeatures(Args, Features);
2433 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002434 case llvm::Triple::wasm32:
2435 case llvm::Triple::wasm64:
2436 getWebAssemblyTargetFeatures(Args, Features);
2437 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002438 }
Rafael Espindola43964802013-08-21 17:34:32 +00002439
2440 // Find the last of each feature.
2441 llvm::StringMap<unsigned> LastOpt;
2442 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2443 const char *Name = Features[I];
2444 assert(Name[0] == '-' || Name[0] == '+');
2445 LastOpt[Name + 1] = I;
2446 }
2447
2448 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2449 // If this feature was overridden, ignore it.
2450 const char *Name = Features[I];
2451 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2452 assert(LastI != LastOpt.end());
2453 unsigned Last = LastI->second;
2454 if (Last != I)
2455 continue;
2456
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002457 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002458 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002459 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002460}
2461
David Majnemerae394812014-12-09 00:12:30 +00002462static bool
2463shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2464 const llvm::Triple &Triple) {
2465 // We use the zero-cost exception tables for Objective-C if the non-fragile
2466 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2467 // later.
2468 if (runtime.isNonFragile())
2469 return true;
2470
2471 if (!Triple.isMacOSX())
2472 return false;
2473
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002474 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002475 (Triple.getArch() == llvm::Triple::x86_64 ||
2476 Triple.getArch() == llvm::Triple::arm));
2477}
2478
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002479/// Adds exception related arguments to the driver command arguments. There's a
2480/// master flag, -fexceptions and also language specific flags to enable/disable
2481/// C++ and Objective-C exceptions. This makes it possible to for example
2482/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002483static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002484 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002485 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002486 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002487 const Driver &D = TC.getDriver();
2488 const llvm::Triple &Triple = TC.getTriple();
2489
Chad Rosier4fab82c2012-03-26 22:04:46 +00002490 if (KernelOrKext) {
2491 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2492 // arguments now to avoid warnings about unused arguments.
2493 Args.ClaimAllArgs(options::OPT_fexceptions);
2494 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2495 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2496 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2497 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2498 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002499 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002500 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002501
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002502 // See if the user explicitly enabled exceptions.
2503 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2504 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002505
David Majnemerae394812014-12-09 00:12:30 +00002506 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2507 // is not necessarily sensible, but follows GCC.
2508 if (types::isObjC(InputType) &&
2509 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002510 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002511 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002512
David Majnemerae394812014-12-09 00:12:30 +00002513 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002514 }
2515
2516 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002517 // Disable C++ EH by default on XCore and PS4.
2518 bool CXXExceptionsEnabled =
2519 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002520 Arg *ExceptionArg = Args.getLastArg(
2521 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2522 options::OPT_fexceptions, options::OPT_fno_exceptions);
2523 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002524 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002525 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2526 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002527
2528 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002529 if (Triple.isPS4CPU()) {
2530 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2531 assert(ExceptionArg &&
2532 "On the PS4 exceptions should only be enabled if passing "
2533 "an argument");
2534 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2535 const Arg *RTTIArg = TC.getRTTIArg();
2536 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2537 D.Diag(diag::err_drv_argument_not_allowed_with)
2538 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2539 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2540 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2541 } else
2542 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2543
Anders Carlssone96ab552011-02-28 02:27:16 +00002544 CmdArgs.push_back("-fcxx-exceptions");
2545
David Majnemer8de68642014-12-05 08:11:58 +00002546 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002547 }
2548 }
2549
David Majnemer8de68642014-12-05 08:11:58 +00002550 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002551 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002552}
2553
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002554static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002555 bool Default = true;
2556 if (TC.getTriple().isOSDarwin()) {
2557 // The native darwin assembler doesn't support the linker_option directives,
2558 // so we disable them if we think the .s file will be passed to it.
2559 Default = TC.useIntegratedAs();
2560 }
2561 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2562 Default);
2563}
2564
Ted Kremenek62093662013-03-12 17:02:12 +00002565static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2566 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002567 bool UseDwarfDirectory =
2568 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2569 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002570 return !UseDwarfDirectory;
2571}
2572
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002573/// \brief Check whether the given input tree contains any compilation actions.
2574static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002575 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002576 return true;
2577
Nico Weber5a459f82016-02-23 19:30:43 +00002578 for (const auto &AI : A->inputs())
2579 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002580 return true;
2581
2582 return false;
2583}
2584
2585/// \brief Check if -relax-all should be passed to the internal assembler.
2586/// This is done by default when compiling non-assembler source with -O0.
2587static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2588 bool RelaxDefault = true;
2589
2590 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2591 RelaxDefault = A->getOption().matches(options::OPT_O0);
2592
2593 if (RelaxDefault) {
2594 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002595 for (const auto &Act : C.getActions()) {
2596 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002597 RelaxDefault = true;
2598 break;
2599 }
2600 }
2601 }
2602
2603 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002604 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002605}
2606
Paul Robinson0334a042015-12-19 19:41:48 +00002607// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2608// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002609static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002610 assert(A.getOption().matches(options::OPT_gN_Group) &&
2611 "Not a -g option that specifies a debug-info level");
2612 if (A.getOption().matches(options::OPT_g0) ||
2613 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002614 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002615 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2616 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002617 return codegenoptions::DebugLineTablesOnly;
2618 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002619}
2620
Douglas Katzman3459ce22015-10-08 04:24:12 +00002621// Extract the integer N from a string spelled "-dwarf-N", returning 0
2622// on mismatch. The StringRef input (rather than an Arg) allows
2623// for use by the "-Xassembler" option parser.
2624static unsigned DwarfVersionNum(StringRef ArgValue) {
2625 return llvm::StringSwitch<unsigned>(ArgValue)
2626 .Case("-gdwarf-2", 2)
2627 .Case("-gdwarf-3", 3)
2628 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002629 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002630 .Default(0);
2631}
2632
2633static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002634 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002635 unsigned DwarfVersion,
2636 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002637 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002638 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002639 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2640 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002641 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002642 CmdArgs.push_back("-debug-info-kind=limited");
2643 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002644 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002645 CmdArgs.push_back("-debug-info-kind=standalone");
2646 break;
2647 default:
2648 break;
2649 }
2650 if (DwarfVersion > 0)
2651 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002652 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002653 switch (DebuggerTuning) {
2654 case llvm::DebuggerKind::GDB:
2655 CmdArgs.push_back("-debugger-tuning=gdb");
2656 break;
2657 case llvm::DebuggerKind::LLDB:
2658 CmdArgs.push_back("-debugger-tuning=lldb");
2659 break;
2660 case llvm::DebuggerKind::SCE:
2661 CmdArgs.push_back("-debugger-tuning=sce");
2662 break;
2663 default:
2664 break;
2665 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002666}
2667
David Blaikie9260ed62013-07-25 21:19:01 +00002668static void CollectArgsForIntegratedAssembler(Compilation &C,
2669 const ArgList &Args,
2670 ArgStringList &CmdArgs,
2671 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002672 if (UseRelaxAll(C, Args))
2673 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002674
David Majnemer2b9349d2015-12-21 22:09:34 +00002675 // Only default to -mincremental-linker-compatible if we think we are
2676 // targeting the MSVC linker.
2677 bool DefaultIncrementalLinkerCompatible =
2678 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2679 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2680 options::OPT_mno_incremental_linker_compatible,
2681 DefaultIncrementalLinkerCompatible))
2682 CmdArgs.push_back("-mincremental-linker-compatible");
2683
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002684 // When passing -I arguments to the assembler we sometimes need to
2685 // unconditionally take the next argument. For example, when parsing
2686 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2687 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2688 // arg after parsing the '-I' arg.
2689 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002690
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002691 // When using an integrated assembler, translate -Wa, and -Xassembler
2692 // options.
2693 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002694 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002695 for (const Arg *A :
2696 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2697 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002698
Benjamin Kramer72e64312015-09-24 14:48:49 +00002699 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002700 if (TakeNextArg) {
2701 CmdArgs.push_back(Value.data());
2702 TakeNextArg = false;
2703 continue;
2704 }
David Blaikie9260ed62013-07-25 21:19:01 +00002705
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002706 switch (C.getDefaultToolChain().getArch()) {
2707 default:
2708 break;
2709 case llvm::Triple::mips:
2710 case llvm::Triple::mipsel:
2711 case llvm::Triple::mips64:
2712 case llvm::Triple::mips64el:
2713 if (Value == "--trap") {
2714 CmdArgs.push_back("-target-feature");
2715 CmdArgs.push_back("+use-tcc-in-div");
2716 continue;
2717 }
2718 if (Value == "--break") {
2719 CmdArgs.push_back("-target-feature");
2720 CmdArgs.push_back("-use-tcc-in-div");
2721 continue;
2722 }
2723 if (Value.startswith("-msoft-float")) {
2724 CmdArgs.push_back("-target-feature");
2725 CmdArgs.push_back("+soft-float");
2726 continue;
2727 }
2728 if (Value.startswith("-mhard-float")) {
2729 CmdArgs.push_back("-target-feature");
2730 CmdArgs.push_back("-soft-float");
2731 continue;
2732 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002733
2734 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2735 .Case("-mips1", "+mips1")
2736 .Case("-mips2", "+mips2")
2737 .Case("-mips3", "+mips3")
2738 .Case("-mips4", "+mips4")
2739 .Case("-mips5", "+mips5")
2740 .Case("-mips32", "+mips32")
2741 .Case("-mips32r2", "+mips32r2")
2742 .Case("-mips32r3", "+mips32r3")
2743 .Case("-mips32r5", "+mips32r5")
2744 .Case("-mips32r6", "+mips32r6")
2745 .Case("-mips64", "+mips64")
2746 .Case("-mips64r2", "+mips64r2")
2747 .Case("-mips64r3", "+mips64r3")
2748 .Case("-mips64r5", "+mips64r5")
2749 .Case("-mips64r6", "+mips64r6")
2750 .Default(nullptr);
2751 if (MipsTargetFeature)
2752 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002753 }
2754
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002755 if (Value == "-force_cpusubtype_ALL") {
2756 // Do nothing, this is the default and we don't support anything else.
2757 } else if (Value == "-L") {
2758 CmdArgs.push_back("-msave-temp-labels");
2759 } else if (Value == "--fatal-warnings") {
2760 CmdArgs.push_back("-massembler-fatal-warnings");
2761 } else if (Value == "--noexecstack") {
2762 CmdArgs.push_back("-mnoexecstack");
2763 } else if (Value == "-compress-debug-sections" ||
2764 Value == "--compress-debug-sections") {
2765 CompressDebugSections = true;
2766 } else if (Value == "-nocompress-debug-sections" ||
2767 Value == "--nocompress-debug-sections") {
2768 CompressDebugSections = false;
2769 } else if (Value.startswith("-I")) {
2770 CmdArgs.push_back(Value.data());
2771 // We need to consume the next argument if the current arg is a plain
2772 // -I. The next arg will be the include directory.
2773 if (Value == "-I")
2774 TakeNextArg = true;
2775 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002776 // "-gdwarf-N" options are not cc1as options.
2777 unsigned DwarfVersion = DwarfVersionNum(Value);
2778 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2779 CmdArgs.push_back(Value.data());
2780 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002781 RenderDebugEnablingArgs(Args, CmdArgs,
2782 codegenoptions::LimitedDebugInfo,
2783 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002784 }
Renato Golin7c542b42015-07-27 23:44:45 +00002785 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2786 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2787 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002788 } else {
2789 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002790 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002791 }
2792 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002793 }
2794 if (CompressDebugSections) {
2795 if (llvm::zlib::isAvailable())
2796 CmdArgs.push_back("-compress-debug-sections");
2797 else
2798 D.Diag(diag::warn_debug_compression_unavailable);
2799 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002800 if (MipsTargetFeature != nullptr) {
2801 CmdArgs.push_back("-target-feature");
2802 CmdArgs.push_back(MipsTargetFeature);
2803 }
David Blaikie9260ed62013-07-25 21:19:01 +00002804}
2805
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002806// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002807// FIXME: Make sure we can also emit shared objects if they're requested
2808// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002809static void addClangRT(const ToolChain &TC, const ArgList &Args,
2810 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002811 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002812}
2813
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002814namespace {
2815enum OpenMPRuntimeKind {
2816 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2817 /// without knowing what runtime to target.
2818 OMPRT_Unknown,
2819
2820 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2821 /// the default for Clang.
2822 OMPRT_OMP,
2823
2824 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2825 /// this runtime but can swallow the pragmas, and find and link against the
2826 /// runtime library itself.
2827 OMPRT_GOMP,
2828
Chandler Carruthc6625c62015-05-28 21:10:31 +00002829 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002830 /// OpenMP runtime. We support this mode for users with existing dependencies
2831 /// on this runtime library name.
2832 OMPRT_IOMP5
2833};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002834}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002835
2836/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002837static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2838 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002839 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2840
2841 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2842 if (A)
2843 RuntimeName = A->getValue();
2844
2845 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002846 .Case("libomp", OMPRT_OMP)
2847 .Case("libgomp", OMPRT_GOMP)
2848 .Case("libiomp5", OMPRT_IOMP5)
2849 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002850
2851 if (RT == OMPRT_Unknown) {
2852 if (A)
2853 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002854 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002855 else
2856 // FIXME: We could use a nicer diagnostic here.
2857 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2858 }
2859
2860 return RT;
2861}
2862
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002863static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2864 const ArgList &Args) {
2865 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2866 options::OPT_fno_openmp, false))
2867 return;
2868
2869 switch (getOpenMPRuntime(TC, Args)) {
2870 case OMPRT_OMP:
2871 CmdArgs.push_back("-lomp");
2872 break;
2873 case OMPRT_GOMP:
2874 CmdArgs.push_back("-lgomp");
2875 break;
2876 case OMPRT_IOMP5:
2877 CmdArgs.push_back("-liomp5");
2878 break;
2879 case OMPRT_Unknown:
2880 // Already diagnosed.
2881 break;
2882 }
2883}
2884
Alexey Samsonov52550342014-09-15 19:58:40 +00002885static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2886 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002887 bool IsShared, bool IsWhole) {
2888 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002889 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002890 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002891 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002892 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002893}
2894
Alexey Samsonov52550342014-09-15 19:58:40 +00002895// Tries to use a file with the list of dynamic symbols that need to be exported
2896// from the runtime library. Returns true if the file was found.
2897static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2898 ArgStringList &CmdArgs,
2899 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002900 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002901 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2902 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002903 return true;
2904 }
2905 return false;
2906}
2907
2908static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2909 ArgStringList &CmdArgs) {
2910 // Force linking against the system libraries sanitizers depends on
2911 // (see PR15823 why this is necessary).
2912 CmdArgs.push_back("--no-as-needed");
2913 CmdArgs.push_back("-lpthread");
2914 CmdArgs.push_back("-lrt");
2915 CmdArgs.push_back("-lm");
2916 // There's no libdl on FreeBSD.
2917 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2918 CmdArgs.push_back("-ldl");
2919}
2920
2921static void
2922collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2923 SmallVectorImpl<StringRef> &SharedRuntimes,
2924 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002925 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2926 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2927 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002928 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2929 // Collect shared runtimes.
2930 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2931 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002932 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002933 // The stats_client library is also statically linked into DSOs.
2934 if (SanArgs.needsStatsRt())
2935 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002936
Alexey Samsonov52550342014-09-15 19:58:40 +00002937 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002938 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002939 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002940 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002941 }
2942 if (SanArgs.needsAsanRt()) {
2943 if (SanArgs.needsSharedAsanRt()) {
2944 HelperStaticRuntimes.push_back("asan-preinit");
2945 } else {
2946 StaticRuntimes.push_back("asan");
2947 if (SanArgs.linkCXXRuntimes())
2948 StaticRuntimes.push_back("asan_cxx");
2949 }
2950 }
2951 if (SanArgs.needsDfsanRt())
2952 StaticRuntimes.push_back("dfsan");
2953 if (SanArgs.needsLsanRt())
2954 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002955 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002956 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002957 if (SanArgs.linkCXXRuntimes())
2958 StaticRuntimes.push_back("msan_cxx");
2959 }
2960 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002962 if (SanArgs.linkCXXRuntimes())
2963 StaticRuntimes.push_back("tsan_cxx");
2964 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002965 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002966 StaticRuntimes.push_back("ubsan_standalone");
2967 if (SanArgs.linkCXXRuntimes())
2968 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002969 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002970 if (SanArgs.needsSafeStackRt())
2971 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002972 if (SanArgs.needsCfiRt())
2973 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002974 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002975 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002976 if (SanArgs.linkCXXRuntimes())
2977 StaticRuntimes.push_back("ubsan_standalone_cxx");
2978 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002979 if (SanArgs.needsStatsRt()) {
2980 NonWholeStaticRuntimes.push_back("stats");
2981 RequiredSymbols.push_back("__sanitizer_stats_register");
2982 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002983}
2984
Alexey Samsonov52550342014-09-15 19:58:40 +00002985// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2986// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2987static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002988 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002989 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002990 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002991 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002992 NonWholeStaticRuntimes, HelperStaticRuntimes,
2993 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002994 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002995 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002996 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002997 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002998 bool AddExportDynamic = false;
2999 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003000 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003001 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3002 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003003 for (auto RT : NonWholeStaticRuntimes) {
3004 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3005 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3006 }
3007 for (auto S : RequiredSymbols) {
3008 CmdArgs.push_back("-u");
3009 CmdArgs.push_back(Args.MakeArgString(S));
3010 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003011 // If there is a static runtime with no dynamic list, force all the symbols
3012 // to be dynamic to be sure we export sanitizer interface functions.
3013 if (AddExportDynamic)
3014 CmdArgs.push_back("-export-dynamic");
3015 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003016}
3017
Reid Kleckner86ea7702015-02-04 23:45:07 +00003018static bool areOptimizationsEnabled(const ArgList &Args) {
3019 // Find the last -O arg and see if it is non-zero.
3020 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3021 return !A->getOption().matches(options::OPT_O0);
3022 // Defaults to -O0.
3023 return false;
3024}
3025
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003026static bool shouldUseFramePointerForTarget(const ArgList &Args,
3027 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003028 switch (Triple.getArch()) {
3029 case llvm::Triple::xcore:
3030 case llvm::Triple::wasm32:
3031 case llvm::Triple::wasm64:
3032 // XCore never wants frame pointers, regardless of OS.
3033 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003034 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003035 default:
3036 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003037 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003038
3039 if (Triple.isOSLinux()) {
3040 switch (Triple.getArch()) {
3041 // Don't use a frame pointer on linux if optimizing for certain targets.
3042 case llvm::Triple::mips64:
3043 case llvm::Triple::mips64el:
3044 case llvm::Triple::mips:
3045 case llvm::Triple::mipsel:
3046 case llvm::Triple::systemz:
3047 case llvm::Triple::x86:
3048 case llvm::Triple::x86_64:
3049 return !areOptimizationsEnabled(Args);
3050 default:
3051 return true;
3052 }
3053 }
3054
3055 if (Triple.isOSWindows()) {
3056 switch (Triple.getArch()) {
3057 case llvm::Triple::x86:
3058 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003059 case llvm::Triple::x86_64:
3060 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003061 case llvm::Triple::arm:
3062 case llvm::Triple::thumb:
3063 // Windows on ARM builds with FPO disabled to aid fast stack walking
3064 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003065 default:
3066 // All other supported Windows ISAs use xdata unwind information, so frame
3067 // pointers are not generally useful.
3068 return false;
3069 }
3070 }
3071
3072 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003073}
3074
Rafael Espindola224dd632011-12-14 21:02:23 +00003075static bool shouldUseFramePointer(const ArgList &Args,
3076 const llvm::Triple &Triple) {
3077 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3078 options::OPT_fomit_frame_pointer))
3079 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003080 if (Args.hasArg(options::OPT_pg))
3081 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003082
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003083 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003084}
3085
Eric Christopherb7d97e92013-04-03 01:58:53 +00003086static bool shouldUseLeafFramePointer(const ArgList &Args,
3087 const llvm::Triple &Triple) {
3088 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3089 options::OPT_momit_leaf_frame_pointer))
3090 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003091 if (Args.hasArg(options::OPT_pg))
3092 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003093
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003094 if (Triple.isPS4CPU())
3095 return false;
3096
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003097 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003098}
3099
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003100/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003101static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003102 SmallString<128> cwd;
3103 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003104 CmdArgs.push_back("-fdebug-compilation-dir");
3105 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003106 }
3107}
3108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003109static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003110 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3111 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3112 SmallString<128> T(FinalOutput->getValue());
3113 llvm::sys::path::replace_extension(T, "dwo");
3114 return Args.MakeArgString(T);
3115 } else {
3116 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003117 SmallString<128> T(
3118 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003119 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003120 llvm::sys::path::replace_extension(F, "dwo");
3121 T += F;
3122 return Args.MakeArgString(F);
3123 }
3124}
3125
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003126static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3127 const JobAction &JA, const ArgList &Args,
3128 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003129 ArgStringList ExtractArgs;
3130 ExtractArgs.push_back("--extract-dwo");
3131
3132 ArgStringList StripArgs;
3133 StripArgs.push_back("--strip-dwo");
3134
3135 // Grabbing the output of the earlier compile step.
3136 StripArgs.push_back(Output.getFilename());
3137 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003138 ExtractArgs.push_back(OutFile);
3139
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003140 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003141 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003142
3143 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003144 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003145
3146 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003147 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003148}
3149
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003150/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003151/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3152static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003153 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003154 if (A->getOption().matches(options::OPT_O4) ||
3155 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003156 return true;
3157
3158 if (A->getOption().matches(options::OPT_O0))
3159 return false;
3160
3161 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3162
Rafael Espindola91780de2013-08-26 14:05:41 +00003163 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003164 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003165 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003166 return true;
3167
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003168 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003169 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003170 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003171
3172 unsigned OptLevel = 0;
3173 if (S.getAsInteger(10, OptLevel))
3174 return false;
3175
3176 return OptLevel > 1;
3177 }
3178
3179 return false;
3180}
3181
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003182/// Add -x lang to \p CmdArgs for \p Input.
3183static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3184 ArgStringList &CmdArgs) {
3185 // When using -verify-pch, we don't want to provide the type
3186 // 'precompiled-header' if it was inferred from the file extension
3187 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3188 return;
3189
3190 CmdArgs.push_back("-x");
3191 if (Args.hasArg(options::OPT_rewrite_objc))
3192 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3193 else
3194 CmdArgs.push_back(types::getTypeName(Input.getType()));
3195}
3196
David Majnemerc371ff02015-03-22 08:39:22 +00003197static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003198 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003199 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003200
3201 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003202 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003203
3204 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003205 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003206 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003207 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003208}
3209
Rafael Espindola577637a2015-01-03 00:06:04 +00003210// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003211// options that build systems might add but are unused when assembling or only
3212// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003213static void claimNoWarnArgs(const ArgList &Args) {
3214 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003215 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003216 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003217 Args.ClaimAllArgs(options::OPT_flto);
3218 Args.ClaimAllArgs(options::OPT_fno_lto);
3219}
3220
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003221static void appendUserToPath(SmallVectorImpl<char> &Result) {
3222#ifdef LLVM_ON_UNIX
3223 const char *Username = getenv("LOGNAME");
3224#else
3225 const char *Username = getenv("USERNAME");
3226#endif
3227 if (Username) {
3228 // Validate that LoginName can be used in a path, and get its length.
3229 size_t Len = 0;
3230 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003231 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003232 Username = nullptr;
3233 break;
3234 }
3235 }
3236
3237 if (Username && Len > 0) {
3238 Result.append(Username, Username + Len);
3239 return;
3240 }
3241 }
3242
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003243// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003244#ifdef LLVM_ON_UNIX
3245 std::string UID = llvm::utostr(getuid());
3246#else
3247 // FIXME: Windows seems to have an 'SID' that might work.
3248 std::string UID = "9999";
3249#endif
3250 Result.append(UID.begin(), UID.end());
3251}
3252
David Majnemere11d3732015-06-08 00:22:46 +00003253VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3254 const llvm::Triple &Triple,
3255 const llvm::opt::ArgList &Args,
3256 bool IsWindowsMSVC) {
3257 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3258 IsWindowsMSVC) ||
3259 Args.hasArg(options::OPT_fmsc_version) ||
3260 Args.hasArg(options::OPT_fms_compatibility_version)) {
3261 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3262 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003263 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003264
3265 if (MSCVersion && MSCompatibilityVersion) {
3266 if (D)
3267 D->Diag(diag::err_drv_argument_not_allowed_with)
3268 << MSCVersion->getAsString(Args)
3269 << MSCompatibilityVersion->getAsString(Args);
3270 return VersionTuple();
3271 }
3272
3273 if (MSCompatibilityVersion) {
3274 VersionTuple MSVT;
3275 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3276 D->Diag(diag::err_drv_invalid_value)
3277 << MSCompatibilityVersion->getAsString(Args)
3278 << MSCompatibilityVersion->getValue();
3279 return MSVT;
3280 }
3281
3282 if (MSCVersion) {
3283 unsigned Version = 0;
3284 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3285 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3286 << MSCVersion->getValue();
3287 return getMSCompatibilityVersion(Version);
3288 }
3289
3290 unsigned Major, Minor, Micro;
3291 Triple.getEnvironmentVersion(Major, Minor, Micro);
3292 if (Major || Minor || Micro)
3293 return VersionTuple(Major, Minor, Micro);
3294
Nico Weber9a952752016-03-23 23:26:59 +00003295 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003296 return VersionTuple(18);
3297 }
3298 return VersionTuple();
3299}
3300
Diego Novilloa0545962015-07-10 18:00:07 +00003301static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3302 const InputInfo &Output, const ArgList &Args,
3303 ArgStringList &CmdArgs) {
3304 auto *ProfileGenerateArg = Args.getLastArg(
3305 options::OPT_fprofile_instr_generate,
3306 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003307 options::OPT_fprofile_generate_EQ,
3308 options::OPT_fno_profile_instr_generate);
3309 if (ProfileGenerateArg &&
3310 ProfileGenerateArg->getOption().matches(
3311 options::OPT_fno_profile_instr_generate))
3312 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003313
3314 auto *ProfileUseArg = Args.getLastArg(
3315 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003316 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3317 options::OPT_fno_profile_instr_use);
3318 if (ProfileUseArg &&
3319 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3320 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003321
3322 if (ProfileGenerateArg && ProfileUseArg)
3323 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003324 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003325
Diego Novillo758f3f52015-08-05 21:49:51 +00003326 if (ProfileGenerateArg) {
3327 if (ProfileGenerateArg->getOption().matches(
3328 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003329 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3330 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003331 else if (ProfileGenerateArg->getOption().matches(
3332 options::OPT_fprofile_generate_EQ)) {
3333 SmallString<128> Path(ProfileGenerateArg->getValue());
3334 llvm::sys::path::append(Path, "default.profraw");
3335 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003336 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3337 }
3338 // The default is to use Clang Instrumentation.
3339 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003340 }
Diego Novilloa0545962015-07-10 18:00:07 +00003341
Diego Novillo758f3f52015-08-05 21:49:51 +00003342 if (ProfileUseArg) {
3343 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003344 CmdArgs.push_back(Args.MakeArgString(
3345 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003346 else if ((ProfileUseArg->getOption().matches(
3347 options::OPT_fprofile_use_EQ) ||
3348 ProfileUseArg->getOption().matches(
3349 options::OPT_fprofile_instr_use))) {
3350 SmallString<128> Path(
3351 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3352 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3353 llvm::sys::path::append(Path, "default.profdata");
3354 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003355 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003356 }
Diego Novilloa0545962015-07-10 18:00:07 +00003357 }
3358
3359 if (Args.hasArg(options::OPT_ftest_coverage) ||
3360 Args.hasArg(options::OPT_coverage))
3361 CmdArgs.push_back("-femit-coverage-notes");
3362 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3363 false) ||
3364 Args.hasArg(options::OPT_coverage))
3365 CmdArgs.push_back("-femit-coverage-data");
3366
Diego Novilloc4b94da2015-08-05 23:27:40 +00003367 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3368 options::OPT_fno_coverage_mapping, false) &&
3369 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003370 D.Diag(diag::err_drv_argument_only_allowed_with)
3371 << "-fcoverage-mapping"
3372 << "-fprofile-instr-generate";
3373
Diego Novilloc4b94da2015-08-05 23:27:40 +00003374 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3375 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003376 CmdArgs.push_back("-fcoverage-mapping");
3377
3378 if (C.getArgs().hasArg(options::OPT_c) ||
3379 C.getArgs().hasArg(options::OPT_S)) {
3380 if (Output.isFilename()) {
3381 CmdArgs.push_back("-coverage-file");
3382 SmallString<128> CoverageFilename;
3383 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3384 CoverageFilename = FinalOutput->getValue();
3385 } else {
3386 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3387 }
3388 if (llvm::sys::path::is_relative(CoverageFilename)) {
3389 SmallString<128> Pwd;
3390 if (!llvm::sys::fs::current_path(Pwd)) {
3391 llvm::sys::path::append(Pwd, CoverageFilename);
3392 CoverageFilename.swap(Pwd);
3393 }
3394 }
3395 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3396 }
3397 }
3398}
3399
Paul Robinsond083b9a2015-12-16 17:25:27 +00003400static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3401 ArgStringList &CmdArgs) {
3402 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3403 false) ||
3404 Args.hasFlag(options::OPT_fprofile_generate,
3405 options::OPT_fno_profile_instr_generate, false) ||
3406 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3407 options::OPT_fno_profile_instr_generate, false) ||
3408 Args.hasFlag(options::OPT_fprofile_instr_generate,
3409 options::OPT_fno_profile_instr_generate, false) ||
3410 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3411 options::OPT_fno_profile_instr_generate, false) ||
3412 Args.hasArg(options::OPT_fcreate_profile) ||
3413 Args.hasArg(options::OPT_coverage)))
3414 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3415}
3416
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003417/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3418/// smooshes them together with platform defaults, to decide whether
3419/// this compile should be using PIC mode or not. Returns a tuple of
3420/// (RelocationModel, PICLevel, IsPIE).
3421static std::tuple<llvm::Reloc::Model, unsigned, bool>
3422ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3423 const ArgList &Args) {
3424 // FIXME: why does this code...and so much everywhere else, use both
3425 // ToolChain.getTriple() and Triple?
3426 bool PIE = ToolChain.isPIEDefault();
3427 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003428 // The Darwin/MachO default to use PIC does not apply when using -static.
3429 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3430 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003431 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003432 bool IsPICLevelTwo = PIC;
3433
3434 bool KernelOrKext =
3435 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3436
3437 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003438 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003439 switch (ToolChain.getArch()) {
3440 case llvm::Triple::arm:
3441 case llvm::Triple::armeb:
3442 case llvm::Triple::thumb:
3443 case llvm::Triple::thumbeb:
3444 case llvm::Triple::aarch64:
3445 case llvm::Triple::mips:
3446 case llvm::Triple::mipsel:
3447 case llvm::Triple::mips64:
3448 case llvm::Triple::mips64el:
3449 PIC = true; // "-fpic"
3450 break;
3451
3452 case llvm::Triple::x86:
3453 case llvm::Triple::x86_64:
3454 PIC = true; // "-fPIC"
3455 IsPICLevelTwo = true;
3456 break;
3457
3458 default:
3459 break;
3460 }
3461 }
3462
3463 // OpenBSD-specific defaults for PIE
3464 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3465 switch (ToolChain.getArch()) {
3466 case llvm::Triple::mips64:
3467 case llvm::Triple::mips64el:
3468 case llvm::Triple::sparcel:
3469 case llvm::Triple::x86:
3470 case llvm::Triple::x86_64:
3471 IsPICLevelTwo = false; // "-fpie"
3472 break;
3473
3474 case llvm::Triple::ppc:
3475 case llvm::Triple::sparc:
3476 case llvm::Triple::sparcv9:
3477 IsPICLevelTwo = true; // "-fPIE"
3478 break;
3479
3480 default:
3481 break;
3482 }
3483 }
3484
3485 // The last argument relating to either PIC or PIE wins, and no
3486 // other argument is used. If the last argument is any flavor of the
3487 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3488 // option implicitly enables PIC at the same level.
3489 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3490 options::OPT_fpic, options::OPT_fno_pic,
3491 options::OPT_fPIE, options::OPT_fno_PIE,
3492 options::OPT_fpie, options::OPT_fno_pie);
3493 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3494 // is forced, then neither PIC nor PIE flags will have no effect.
3495 if (!ToolChain.isPICDefaultForced()) {
3496 if (LastPICArg) {
3497 Option O = LastPICArg->getOption();
3498 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3499 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3500 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3501 PIC =
3502 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3503 IsPICLevelTwo =
3504 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3505 } else {
3506 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003507 if (Triple.isPS4CPU()) {
3508 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3509 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3510 if (Model != "kernel") {
3511 PIC = true;
3512 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3513 << LastPICArg->getSpelling();
3514 }
3515 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003516 }
3517 }
3518 }
3519
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003520 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3521 // PIC level would've been set to level 1, force it back to level 2 PIC
3522 // instead.
3523 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003524 IsPICLevelTwo |= ToolChain.isPICDefault();
3525
James Y Knightc4015d32015-08-21 04:14:55 +00003526 // This kernel flags are a trump-card: they will disable PIC/PIE
3527 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003528 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3529 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003530 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003531
3532 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3533 // This is a very special mode. It trumps the other modes, almost no one
3534 // uses it, and it isn't even valid on any OS but Darwin.
3535 if (!ToolChain.getTriple().isOSDarwin())
3536 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3537 << A->getSpelling() << ToolChain.getTriple().str();
3538
3539 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3540
3541 // Only a forced PIC mode can cause the actual compile to have PIC defines
3542 // etc., no flags are sufficient. This behavior was selected to closely
3543 // match that of llvm-gcc and Apple GCC before that.
3544 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3545
3546 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3547 }
3548
3549 if (PIC)
3550 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3551
3552 return std::make_tuple(llvm::Reloc::Static, 0, false);
3553}
3554
3555static const char *RelocationModelName(llvm::Reloc::Model Model) {
3556 switch (Model) {
3557 case llvm::Reloc::Default:
3558 return nullptr;
3559 case llvm::Reloc::Static:
3560 return "static";
3561 case llvm::Reloc::PIC_:
3562 return "pic";
3563 case llvm::Reloc::DynamicNoPIC:
3564 return "dynamic-no-pic";
3565 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003566 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003567}
3568
3569static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3570 ArgStringList &CmdArgs) {
3571 llvm::Reloc::Model RelocationModel;
3572 unsigned PICLevel;
3573 bool IsPIE;
3574 std::tie(RelocationModel, PICLevel, IsPIE) =
3575 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3576
3577 if (RelocationModel != llvm::Reloc::Static)
3578 CmdArgs.push_back("-KPIC");
3579}
3580
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003581void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003582 const InputInfo &Output, const InputInfoList &Inputs,
3583 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003584 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3585 const llvm::Triple Triple(TripleStr);
3586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003587 bool KernelOrKext =
3588 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003589 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003590 ArgStringList CmdArgs;
3591
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003592 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003593 bool IsWindowsCygnus =
3594 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003595 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003596 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003597
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003598 // Check number of inputs for sanity. We need at least one input.
3599 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003600 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003601 // CUDA compilation may have multiple inputs (source file + results of
3602 // device-side compilations). All other jobs are expected to have exactly one
3603 // input.
3604 bool IsCuda = types::isCuda(Input.getType());
3605 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003606
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003607 // Invoke ourselves in -cc1 mode.
3608 //
3609 // FIXME: Implement custom jobs for internal actions.
3610 CmdArgs.push_back("-cc1");
3611
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003612 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003613 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003614 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003615
Artem Belevichfa11ab52015-11-17 22:28:46 +00003616 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003617 if (IsCuda) {
3618 // FIXME: We need a (better) way to pass information about
3619 // particular compilation pass we're constructing here. For now we
3620 // can check which toolchain we're using and pick the other one to
3621 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003622 if (&getToolChain() == C.getCudaDeviceToolChain())
3623 AuxToolChain = C.getCudaHostToolChain();
3624 else if (&getToolChain() == C.getCudaHostToolChain())
3625 AuxToolChain = C.getCudaDeviceToolChain();
3626 else
3627 llvm_unreachable("Can't figure out CUDA compilation mode.");
3628 assert(AuxToolChain != nullptr && "No aux toolchain.");
3629 CmdArgs.push_back("-aux-triple");
3630 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003631 CmdArgs.push_back("-fcuda-target-overloads");
3632 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003633 }
3634
James Y Knight2db38f32015-08-15 03:45:25 +00003635 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3636 Triple.getArch() == llvm::Triple::thumb)) {
3637 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003638 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003639 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003640 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003641 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003642 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003643 }
3644
Tim Northover336f1892014-03-29 13:16:12 +00003645 // Push all default warning arguments that are specific to
3646 // the given target. These come before user provided warning options
3647 // are provided.
3648 getToolChain().addClangWarningOptions(CmdArgs);
3649
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003650 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003651 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003652
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 if (isa<AnalyzeJobAction>(JA)) {
3654 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3655 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003656 } else if (isa<MigrateJobAction>(JA)) {
3657 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003658 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003659 if (Output.getType() == types::TY_Dependencies)
3660 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003661 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003662 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003663 if (Args.hasArg(options::OPT_rewrite_objc) &&
3664 !Args.hasArg(options::OPT_g_Group))
3665 CmdArgs.push_back("-P");
3666 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003667 } else if (isa<AssembleJobAction>(JA)) {
3668 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003669
David Blaikie9260ed62013-07-25 21:19:01 +00003670 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003671
3672 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003673 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003674 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003675 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003676 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003677
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003678 if (JA.getType() == types::TY_Nothing)
3679 CmdArgs.push_back("-fsyntax-only");
3680 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003681 CmdArgs.push_back("-emit-pch");
3682 else
3683 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003684 } else if (isa<VerifyPCHJobAction>(JA)) {
3685 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003687 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3688 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003689 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003690 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003691 } else if (JA.getType() == types::TY_LLVM_IR ||
3692 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003693 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003694 } else if (JA.getType() == types::TY_LLVM_BC ||
3695 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003696 CmdArgs.push_back("-emit-llvm-bc");
3697 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003698 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003699 } else if (JA.getType() == types::TY_AST) {
3700 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003701 } else if (JA.getType() == types::TY_ModuleFile) {
3702 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003703 } else if (JA.getType() == types::TY_RewrittenObjC) {
3704 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003705 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003706 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3707 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003708 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003709 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003710 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003711 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003712
3713 // Preserve use-list order by default when emitting bitcode, so that
3714 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3715 // same result as running passes here. For LTO, we don't need to preserve
3716 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003717 if (JA.getType() == types::TY_LLVM_BC)
3718 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003719
3720 if (D.isUsingLTO())
3721 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003722 }
3723
Teresa Johnsonaff22322015-12-07 19:21:34 +00003724 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3725 if (!types::isLLVMIR(Input.getType()))
3726 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3727 << "-x ir";
3728 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3729 }
3730
Steven Wu574b0f22016-03-01 01:07:58 +00003731 // Embed-bitcode option.
3732 if (C.getDriver().embedBitcodeEnabled() &&
3733 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3734 // Add flags implied by -fembed-bitcode.
3735 CmdArgs.push_back("-fembed-bitcode");
3736 // Disable all llvm IR level optimizations.
3737 CmdArgs.push_back("-disable-llvm-optzns");
3738 }
3739 if (C.getDriver().embedBitcodeMarkerOnly())
3740 CmdArgs.push_back("-fembed-bitcode-marker");
3741
Justin Bognera88f0122014-06-20 22:59:50 +00003742 // We normally speed up the clang process a bit by skipping destructors at
3743 // exit, but when we're generating diagnostics we can rely on some of the
3744 // cleanup.
3745 if (!C.isForDiagnostics())
3746 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003747
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003748// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003749#ifdef NDEBUG
3750 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003751 // Discard LLVM value names in -asserts builds.
3752 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003753#endif
3754
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003755 // Set the main file name, so that debug info works even with
3756 // -save-temps.
3757 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003758 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003759
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003760 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003761 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003762 if (Args.hasArg(options::OPT_static))
3763 CmdArgs.push_back("-static-define");
3764
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003765 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003766 // Enable region store model by default.
3767 CmdArgs.push_back("-analyzer-store=region");
3768
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003769 // Treat blocks as analysis entry points.
3770 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3771
Ted Kremenek49c79792011-03-24 00:28:47 +00003772 CmdArgs.push_back("-analyzer-eagerly-assume");
3773
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003774 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003775 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003776 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003777
Devin Coughlin65c77082016-01-21 20:09:49 +00003778 if (!IsWindowsMSVC) {
3779 CmdArgs.push_back("-analyzer-checker=unix");
3780 } else {
3781 // Enable "unix" checkers that also work on Windows.
3782 CmdArgs.push_back("-analyzer-checker=unix.API");
3783 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3784 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3785 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3786 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3787 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3788 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003789
Sean Evesonb38c32b2016-01-06 10:03:58 +00003790 // Disable some unix checkers for PS4.
3791 if (IsPS4CPU) {
3792 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3793 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3794 }
3795
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003796 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003797 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003798
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003799 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003800
Artem Belevichba558952015-05-06 18:20:23 +00003801 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003802 CmdArgs.push_back("-analyzer-checker=cplusplus");
3803
Sean Evesonb38c32b2016-01-06 10:03:58 +00003804 if (!IsPS4CPU) {
3805 CmdArgs.push_back(
3806 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3807 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3808 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3809 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3810 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3811 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3812 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003813
3814 // Default nullability checks.
3815 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3816 CmdArgs.push_back(
3817 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003818 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003819
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003820 // Set the output format. The default is plist, for (lame) historical
3821 // reasons.
3822 CmdArgs.push_back("-analyzer-output");
3823 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003824 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003825 else
3826 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003827
Ted Kremenekfe449a22010-03-22 22:32:05 +00003828 // Disable the presentation of standard compiler warnings when
3829 // using --analyze. We only want to show static analyzer diagnostics
3830 // or frontend errors.
3831 CmdArgs.push_back("-w");
3832
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003833 // Add -Xanalyzer arguments when running as analyzer.
3834 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003835 }
3836
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003837 CheckCodeGenerationOptions(D, Args);
3838
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003839 llvm::Reloc::Model RelocationModel;
3840 unsigned PICLevel;
3841 bool IsPIE;
3842 std::tie(RelocationModel, PICLevel, IsPIE) =
3843 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003844
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003845 const char *RMName = RelocationModelName(RelocationModel);
3846 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003847 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003848 CmdArgs.push_back(RMName);
3849 }
3850 if (PICLevel > 0) {
3851 CmdArgs.push_back("-pic-level");
3852 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3853 if (IsPIE) {
3854 CmdArgs.push_back("-pie-level");
3855 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003856 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003857 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003858
Renato Golin4854d802015-11-09 12:40:41 +00003859 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3860 CmdArgs.push_back("-meabi");
3861 CmdArgs.push_back(A->getValue());
3862 }
3863
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003864 CmdArgs.push_back("-mthread-model");
3865 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3866 CmdArgs.push_back(A->getValue());
3867 else
3868 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3869
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003870 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3871
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003872 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3873 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003874 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003875
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003876 // LLVM Code Generator Options.
3877
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003878 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3879 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003880 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3881 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003882 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003883 CmdArgs.push_back(A->getValue());
3884 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003885 }
3886 }
3887
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003888 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3889 StringRef v = A->getValue();
3890 CmdArgs.push_back("-mllvm");
3891 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3892 A->claim();
3893 }
3894
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003895 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3896 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003897 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003898 }
3899
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003900 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3901 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003902 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003903 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003904 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003905 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3906 CmdArgs.push_back("-fpcc-struct-return");
3907 } else {
3908 assert(A->getOption().matches(options::OPT_freg_struct_return));
3909 CmdArgs.push_back("-freg-struct-return");
3910 }
3911 }
3912
Roman Divacky65b88cd2011-03-01 17:40:53 +00003913 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3914 CmdArgs.push_back("-mrtd");
3915
Rafael Espindola224dd632011-12-14 21:02:23 +00003916 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003917 CmdArgs.push_back("-mdisable-fp-elim");
3918 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3919 options::OPT_fno_zero_initialized_in_bss))
3920 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003921
3922 bool OFastEnabled = isOptimizationLevelFast(Args);
3923 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3924 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003925 OptSpecifier StrictAliasingAliasOption =
3926 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003927 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3928 // doesn't do any TBAA.
3929 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003930 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003931 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003932 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003933 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3934 options::OPT_fno_struct_path_tbaa))
3935 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003936 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3937 false))
3938 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003939 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3940 options::OPT_fno_strict_vtable_pointers,
3941 false))
3942 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003943 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3944 options::OPT_fno_optimize_sibling_calls))
3945 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003946
Eric Christopher006208c2013-04-04 06:29:47 +00003947 // Handle segmented stacks.
3948 if (Args.hasArg(options::OPT_fsplit_stack))
3949 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003950
3951 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3952 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953 OptSpecifier FastMathAliasOption =
3954 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3955
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003956 // Handle various floating point optimization flags, mapping them to the
3957 // appropriate LLVM code generation flags. The pattern for all of these is to
3958 // default off the codegen optimizations, and if any flag enables them and no
3959 // flag disables them after the flag enabling them, enable the codegen
3960 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003961 if (Arg *A = Args.getLastArg(
3962 options::OPT_ffast_math, FastMathAliasOption,
3963 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3964 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3965 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003966 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3967 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003968 A->getOption().getID() != options::OPT_fhonor_infinities)
3969 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003970 if (Arg *A = Args.getLastArg(
3971 options::OPT_ffast_math, FastMathAliasOption,
3972 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3973 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3974 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003975 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3976 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003977 A->getOption().getID() != options::OPT_fhonor_nans)
3978 CmdArgs.push_back("-menable-no-nans");
3979
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003980 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3981 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003982 if (Arg *A =
3983 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3984 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3985 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003986 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3987 // However, turning *off* -ffast_math merely restores the toolchain default
3988 // (which may be false).
3989 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3990 A->getOption().getID() == options::OPT_ffast_math ||
3991 A->getOption().getID() == options::OPT_Ofast)
3992 MathErrno = false;
3993 else if (A->getOption().getID() == options::OPT_fmath_errno)
3994 MathErrno = true;
3995 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003996 if (MathErrno)
3997 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003998
3999 // There are several flags which require disabling very specific
4000 // optimizations. Any of these being disabled forces us to turn off the
4001 // entire set of LLVM optimizations, so collect them through all the flag
4002 // madness.
4003 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004004 if (Arg *A = Args.getLastArg(
4005 options::OPT_ffast_math, FastMathAliasOption,
4006 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4007 options::OPT_fno_unsafe_math_optimizations,
4008 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004009 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4010 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004011 A->getOption().getID() != options::OPT_fno_associative_math)
4012 AssociativeMath = true;
4013 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004014 if (Arg *A = Args.getLastArg(
4015 options::OPT_ffast_math, FastMathAliasOption,
4016 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4017 options::OPT_fno_unsafe_math_optimizations,
4018 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004019 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4020 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004021 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4022 ReciprocalMath = true;
4023 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004024 if (Arg *A = Args.getLastArg(
4025 options::OPT_ffast_math, FastMathAliasOption,
4026 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4027 options::OPT_fno_unsafe_math_optimizations,
4028 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004029 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4030 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004031 A->getOption().getID() != options::OPT_fsigned_zeros)
4032 SignedZeros = false;
4033 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004034 if (Arg *A = Args.getLastArg(
4035 options::OPT_ffast_math, FastMathAliasOption,
4036 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4037 options::OPT_fno_unsafe_math_optimizations,
4038 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004039 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4040 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004041 A->getOption().getID() != options::OPT_ftrapping_math)
4042 TrappingMath = false;
4043 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4044 !TrappingMath)
4045 CmdArgs.push_back("-menable-unsafe-fp-math");
4046
Sanjay Patel76c9e092015-01-23 16:40:50 +00004047 if (!SignedZeros)
4048 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004049
Sanjay Patel359b1052015-04-09 15:03:23 +00004050 if (ReciprocalMath)
4051 CmdArgs.push_back("-freciprocal-math");
4052
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004053 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004054 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004055 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004056 options::OPT_ffp_contract)) {
4057 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004058 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004059 if (Val == "fast" || Val == "on" || Val == "off") {
4060 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4061 } else {
4062 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004063 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004064 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004065 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4066 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004067 // If fast-math is set then set the fp-contract mode to fast.
4068 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4069 }
4070 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004071
Sanjay Patel2987c292015-06-11 14:53:41 +00004072 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004073
Bob Wilson6a039162012-07-19 03:52:53 +00004074 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4075 // and if we find them, tell the frontend to provide the appropriate
4076 // preprocessor macros. This is distinct from enabling any optimizations as
4077 // these options induce language changes which must survive serialization
4078 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004079 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4080 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004081 if (!A->getOption().matches(options::OPT_fno_fast_math))
4082 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004083 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4084 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004085 if (A->getOption().matches(options::OPT_ffinite_math_only))
4086 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004087
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004088 // Decide whether to use verbose asm. Verbose assembly is the default on
4089 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004090 bool IsIntegratedAssemblerDefault =
4091 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004092 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004093 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004094 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004095 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004096
Rafael Espindolab8a12932015-05-22 20:44:03 +00004097 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4098 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004099 CmdArgs.push_back("-no-integrated-as");
4100
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004101 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4102 CmdArgs.push_back("-mdebug-pass");
4103 CmdArgs.push_back("Structure");
4104 }
4105 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4106 CmdArgs.push_back("-mdebug-pass");
4107 CmdArgs.push_back("Arguments");
4108 }
4109
Justin Lebar710a35f2016-01-25 22:36:35 +00004110 // Enable -mconstructor-aliases except on darwin, where we have to work around
4111 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4112 // aliases aren't supported.
4113 if (!getToolChain().getTriple().isOSDarwin() &&
4114 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004115 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004116
John McCall7ef5cb32011-03-18 02:56:14 +00004117 // Darwin's kernel doesn't support guard variables; just die if we
4118 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004119 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004120 CmdArgs.push_back("-fforbid-guard-variables");
4121
Akira Hatanaka02028482015-11-12 17:21:22 +00004122 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4123 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004124 CmdArgs.push_back("-mms-bitfields");
4125 }
John McCall8517abc2010-02-19 02:45:38 +00004126
Daniel Dunbar306945d2009-09-16 06:17:29 +00004127 // This is a coarse approximation of what llvm-gcc actually does, both
4128 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4129 // complicated ways.
4130 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004131 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4132 options::OPT_fno_asynchronous_unwind_tables,
4133 (getToolChain().IsUnwindTablesDefault() ||
4134 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4135 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004136 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4137 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004138 CmdArgs.push_back("-munwind-tables");
4139
Chandler Carruth05fb5852012-11-21 23:40:23 +00004140 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004141
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004142 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4143 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004144 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004145 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004146
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004147 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004148 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004149
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004150 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004151 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004152 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004153 }
4154
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004155 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004156 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004157 if (!CPU.empty()) {
4158 CmdArgs.push_back("-target-cpu");
4159 CmdArgs.push_back(Args.MakeArgString(CPU));
4160 }
4161
Rafael Espindolaeb265472013-08-21 21:59:03 +00004162 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4163 CmdArgs.push_back("-mfpmath");
4164 CmdArgs.push_back(A->getValue());
4165 }
4166
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004167 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004168 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004169
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004170 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004171 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004172 default:
4173 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004174
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004175 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004176 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004177 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004178 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004179 // Use the effective triple, which takes into account the deployment target.
4180 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004181 break;
4182
Tim Northover573cbee2014-05-24 12:52:07 +00004183 case llvm::Triple::aarch64:
4184 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004185 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004186 break;
4187
Eric Christopher0b26a612010-03-02 02:41:08 +00004188 case llvm::Triple::mips:
4189 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004190 case llvm::Triple::mips64:
4191 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004192 AddMIPSTargetArgs(Args, CmdArgs);
4193 break;
4194
Ulrich Weigand8afad612014-07-28 13:17:52 +00004195 case llvm::Triple::ppc:
4196 case llvm::Triple::ppc64:
4197 case llvm::Triple::ppc64le:
4198 AddPPCTargetArgs(Args, CmdArgs);
4199 break;
4200
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004201 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004202 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004203 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004204 AddSparcTargetArgs(Args, CmdArgs);
4205 break;
4206
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004207 case llvm::Triple::x86:
4208 case llvm::Triple::x86_64:
4209 AddX86TargetArgs(Args, CmdArgs);
4210 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004211
Jacques Pienaard964cc22016-03-28 21:02:54 +00004212 case llvm::Triple::lanai:
4213 AddLanaiTargetArgs(Args, CmdArgs);
4214 break;
4215
Tony Linthicum76329bf2011-12-12 21:14:55 +00004216 case llvm::Triple::hexagon:
4217 AddHexagonTargetArgs(Args, CmdArgs);
4218 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004219
4220 case llvm::Triple::wasm32:
4221 case llvm::Triple::wasm64:
4222 AddWebAssemblyTargetArgs(Args, CmdArgs);
4223 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004224 }
4225
Douglas Katzman3459ce22015-10-08 04:24:12 +00004226 // The 'g' groups options involve a somewhat intricate sequence of decisions
4227 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004228 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004229 // * what level of debug info to generate
4230 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004231 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004232 // This avoids having to monkey around further in cc1 other than to disable
4233 // codeview if not running in a Windows environment. Perhaps even that
4234 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004235 unsigned DwarfVersion = 0;
4236 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4237 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004238 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004239 bool EmitCodeView = false;
4240
Hans Wennborg75958c42013-08-08 00:17:41 +00004241 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004242 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004243 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004244 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004245
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004246 // Pass the linker version in use.
4247 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4248 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004249 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004250 }
4251
Eric Christopherb7d97e92013-04-03 01:58:53 +00004252 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004253 CmdArgs.push_back("-momit-leaf-frame-pointer");
4254
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004255 // Explicitly error on some things we know we don't support and can't just
4256 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004257 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4258 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004259 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004260 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004261 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4262 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004263 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004264 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004265 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004266 }
4267
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004268 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004269 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004270 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004271 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004272 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4273 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004274 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004275 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004276 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004277
Chad Rosierbe10f982011-08-02 17:58:04 +00004278 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004279 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004280 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4281 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004282 }
4283
Rafael Espindola08a692a2010-03-07 04:46:18 +00004284 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004285 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004286 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004287 // If the last option explicitly specified a debug-info level, use it.
4288 if (A->getOption().matches(options::OPT_gN_Group)) {
4289 DebugInfoKind = DebugLevelToInfoKind(*A);
4290 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4291 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4292 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004293 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004294 A->getIndex() > SplitDwarfArg->getIndex())
4295 SplitDwarfArg = nullptr;
4296 } else
4297 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004298 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004299 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004300
Paul Robinson0334a042015-12-19 19:41:48 +00004301 // If a debugger tuning argument appeared, remember it.
4302 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4303 options::OPT_ggdbN_Group)) {
4304 if (A->getOption().matches(options::OPT_glldb))
4305 DebuggerTuning = llvm::DebuggerKind::LLDB;
4306 else if (A->getOption().matches(options::OPT_gsce))
4307 DebuggerTuning = llvm::DebuggerKind::SCE;
4308 else
4309 DebuggerTuning = llvm::DebuggerKind::GDB;
4310 }
4311
4312 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004313 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004314 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004315 DwarfVersion = DwarfVersionNum(A->getSpelling());
4316
Reid Kleckner124955a2015-08-05 18:51:13 +00004317 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004318 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4319 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4320 // DwarfVersion remains at 0 if no explicit choice was made.
4321 CmdArgs.push_back("-gcodeview");
4322 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004323 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004324 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4325 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004326
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004327 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4328 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004329
4330 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004331 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004332 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004333 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004334
Eric Christopher138c32b2013-09-13 22:37:55 +00004335 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004336 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004337 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004338 CmdArgs.push_back("-dwarf-ext-refs");
4339 CmdArgs.push_back("-fmodule-format=obj");
4340 }
4341
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004342 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4343 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004344 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004345 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004346 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004347 CmdArgs.push_back("-backend-option");
4348 CmdArgs.push_back("-split-dwarf=Enable");
4349 }
4350
Douglas Katzman3459ce22015-10-08 04:24:12 +00004351 // After we've dealt with all combinations of things that could
4352 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4353 // figure out if we need to "upgrade" it to standalone debug info.
4354 // We parse these two '-f' options whether or not they will be used,
4355 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4356 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4357 options::OPT_fno_standalone_debug,
4358 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004359 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4360 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004361 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4362 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004363
Eric Christopher138c32b2013-09-13 22:37:55 +00004364 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4365 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4366 CmdArgs.push_back("-backend-option");
4367 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4368 }
Eric Christophereec89c22013-06-18 00:03:50 +00004369
Eric Christopher0d403d22014-02-14 01:27:03 +00004370 // -gdwarf-aranges turns on the emission of the aranges section in the
4371 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004372 // Always enabled on the PS4.
4373 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004374 CmdArgs.push_back("-backend-option");
4375 CmdArgs.push_back("-generate-arange-section");
4376 }
4377
David Blaikief36d9ba2014-01-27 18:52:43 +00004378 if (Args.hasFlag(options::OPT_fdebug_types_section,
4379 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004380 CmdArgs.push_back("-backend-option");
4381 CmdArgs.push_back("-generate-type-units");
4382 }
Eric Christophereec89c22013-06-18 00:03:50 +00004383
Dan Gohmana5b804b2016-01-07 00:50:27 +00004384 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4385 // default.
4386 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4387 Triple.getArch() == llvm::Triple::wasm32 ||
4388 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004389
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004390 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004391 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004392 CmdArgs.push_back("-ffunction-sections");
4393 }
4394
Peter Collingbourneceef1452016-02-24 22:03:06 +00004395 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4396 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004397 if (!D.isUsingLTO())
4398 D.Diag(diag::err_drv_argument_only_allowed_with)
4399 << "-fwhole-program-vtables"
4400 << "-flto";
4401 CmdArgs.push_back("-fwhole-program-vtables");
4402
4403 clang::SmallString<64> Path(D.ResourceDir);
4404 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4405 if (llvm::sys::fs::exists(Path)) {
4406 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4407 BlacklistOpt += Path.str();
4408 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4409 }
4410
4411 for (const Arg *A :
4412 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4413 A->claim();
4414 if (!llvm::sys::fs::exists(A->getValue()))
4415 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4416 }
4417
4418 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4419 }
4420
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004421 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4422 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004423 CmdArgs.push_back("-fdata-sections");
4424 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004425
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004426 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004427 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004428 CmdArgs.push_back("-fno-unique-section-names");
4429
Chris Lattner3c77a352010-06-22 00:03:40 +00004430 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4431
Diego Novilloa0545962015-07-10 18:00:07 +00004432 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004433
Paul Robinsond083b9a2015-12-16 17:25:27 +00004434 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4435 if (getToolChain().getTriple().isPS4CPU())
4436 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4437
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004438 // Pass options for controlling the default header search paths.
4439 if (Args.hasArg(options::OPT_nostdinc)) {
4440 CmdArgs.push_back("-nostdsysteminc");
4441 CmdArgs.push_back("-nobuiltininc");
4442 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004443 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004444 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004445 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4446 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4447 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004448
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004449 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004450 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004451 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004452
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004453 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4454
Ted Kremenekf7639e12012-03-06 20:06:33 +00004455 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004456 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004457 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004458 options::OPT_ccc_arcmt_modify,
4459 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004460 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004461 switch (A->getOption().getID()) {
4462 default:
4463 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004464 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004465 CmdArgs.push_back("-arcmt-check");
4466 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004467 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004468 CmdArgs.push_back("-arcmt-modify");
4469 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004470 case options::OPT_ccc_arcmt_migrate:
4471 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004472 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004473 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004474
4475 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4476 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004477 break;
John McCalld70fb982011-06-15 23:25:17 +00004478 }
4479 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004480 } else {
4481 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4482 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4483 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004484 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004485
Ted Kremenekf7639e12012-03-06 20:06:33 +00004486 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4487 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004488 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4489 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004490 }
4491 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004492 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004493
4494 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004495 options::OPT_objcmt_migrate_subscripting,
4496 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004497 // None specified, means enable them all.
4498 CmdArgs.push_back("-objcmt-migrate-literals");
4499 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004500 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004501 } else {
4502 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4503 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004504 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004505 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004506 } else {
4507 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4508 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4509 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4510 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4511 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4512 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004513 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004514 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4515 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4516 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4517 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4518 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4519 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4520 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004521 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004522 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004523 }
4524
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004525 // Add preprocessing options like -I, -D, etc. if we are using the
4526 // preprocessor.
4527 //
4528 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004529 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004530 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4531 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004532
Rafael Espindolaa7431922011-07-21 23:40:37 +00004533 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4534 // that "The compiler can only warn and ignore the option if not recognized".
4535 // When building with ccache, it will pass -D options to clang even on
4536 // preprocessed inputs and configure concludes that -fPIC is not supported.
4537 Args.ClaimAllArgs(options::OPT_D);
4538
Alp Toker7874bdc2013-11-15 20:40:58 +00004539 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004540 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4541 if (A->getOption().matches(options::OPT_O4)) {
4542 CmdArgs.push_back("-O3");
4543 D.Diag(diag::warn_O4_is_O3);
4544 } else {
4545 A->render(Args, CmdArgs);
4546 }
4547 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004548
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004549 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004550 for (const Arg *A :
4551 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4552 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004553 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004554 }
4555
Rafael Espindola577637a2015-01-03 00:06:04 +00004556 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004557
Richard Smith3be1cb22014-08-07 00:24:21 +00004558 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004559 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004560 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4561 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004562 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004563 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004564
4565 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004566 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004567 //
4568 // If a std is supplied, only add -trigraphs if it follows the
4569 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004570 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004571 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4572 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004573 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004574 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004575 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004576 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004577 else
4578 Std->render(Args, CmdArgs);
4579
Nico Weber00721502014-12-23 22:32:37 +00004580 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004581 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004582 options::OPT_ftrigraphs,
4583 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004584 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004585 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004586 } else {
4587 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004588 //
4589 // FIXME: Clang doesn't correctly handle -std= when the input language
4590 // doesn't match. For the time being just ignore this for C++ inputs;
4591 // eventually we want to do all the standard defaulting here instead of
4592 // splitting it between the driver and clang -cc1.
4593 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004594 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4595 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004596 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004597 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004598
Nico Weber00721502014-12-23 22:32:37 +00004599 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4600 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004601 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004602
Richard Smith282b4492013-09-04 22:50:31 +00004603 // GCC's behavior for -Wwrite-strings is a bit strange:
4604 // * In C, this "warning flag" changes the types of string literals from
4605 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4606 // for the discarded qualifier.
4607 // * In C++, this is just a normal warning flag.
4608 //
4609 // Implementing this warning correctly in C is hard, so we follow GCC's
4610 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4611 // a non-const char* in C, rather than using this crude hack.
4612 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004613 // FIXME: This should behave just like a warning flag, and thus should also
4614 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4615 Arg *WriteStrings =
4616 Args.getLastArg(options::OPT_Wwrite_strings,
4617 options::OPT_Wno_write_strings, options::OPT_w);
4618 if (WriteStrings &&
4619 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004620 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004621 }
4622
Chandler Carruth61fbf622011-04-23 09:27:53 +00004623 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004624 // during C++ compilation, which it is by default. GCC keeps this define even
4625 // in the presence of '-w', match this behavior bug-for-bug.
4626 if (types::isCXX(InputType) &&
4627 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4628 true)) {
4629 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004630 }
4631
Chandler Carruthe0391482010-05-22 02:21:53 +00004632 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4633 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4634 if (Asm->getOption().matches(options::OPT_fasm))
4635 CmdArgs.push_back("-fgnu-keywords");
4636 else
4637 CmdArgs.push_back("-fno-gnu-keywords");
4638 }
4639
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004640 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4641 CmdArgs.push_back("-fno-dwarf-directory-asm");
4642
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004643 if (ShouldDisableAutolink(Args, getToolChain()))
4644 CmdArgs.push_back("-fno-autolink");
4645
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004646 // Add in -fdebug-compilation-dir if necessary.
4647 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004648
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004649 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4650 StringRef Map = A->getValue();
4651 if (Map.find('=') == StringRef::npos)
4652 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4653 else
4654 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4655 A->claim();
4656 }
4657
Richard Smith9a568822011-11-21 19:36:32 +00004658 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4659 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004660 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004661 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004662 }
4663
Richard Smith79c927b2013-11-06 19:31:51 +00004664 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4665 CmdArgs.push_back("-foperator-arrow-depth");
4666 CmdArgs.push_back(A->getValue());
4667 }
4668
Richard Smith9a568822011-11-21 19:36:32 +00004669 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4670 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004671 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004672 }
4673
Richard Smitha3d3bd22013-05-08 02:12:03 +00004674 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4675 CmdArgs.push_back("-fconstexpr-steps");
4676 CmdArgs.push_back(A->getValue());
4677 }
4678
Richard Smithb3a14522013-02-22 01:59:51 +00004679 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4680 CmdArgs.push_back("-fbracket-depth");
4681 CmdArgs.push_back(A->getValue());
4682 }
4683
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004684 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4685 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004686 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004687 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004688 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4689 } else
4690 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004691 }
4692
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004693 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004694 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004695
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004696 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4697 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004698 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004699 }
David Chisnall5778fce2009-08-31 16:41:57 +00004700
Chris Lattnere23003d2010-01-09 21:54:33 +00004701 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4702 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004703 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004704 }
4705
Chris Lattnerb35583d2010-04-07 20:49:23 +00004706 CmdArgs.push_back("-ferror-limit");
4707 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004708 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004709 else
4710 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004711
Chandler Carrutha77a7272010-05-06 04:55:18 +00004712 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4713 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004714 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004715 }
4716
4717 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4718 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004719 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004720 }
4721
Richard Smithf6f003a2011-12-16 19:06:07 +00004722 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4723 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004724 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004725 }
4726
Nick Lewycky24653262014-12-16 21:39:02 +00004727 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4728 CmdArgs.push_back("-fspell-checking-limit");
4729 CmdArgs.push_back(A->getValue());
4730 }
4731
Daniel Dunbar2c978472009-11-04 06:24:47 +00004732 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004733 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004734 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004735 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004736 } else {
4737 // If -fmessage-length=N was not specified, determine whether this is a
4738 // terminal and, if so, implicitly define -fmessage-length appropriately.
4739 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004740 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004741 }
4742
John McCallb4a99d32013-02-19 01:57:35 +00004743 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4744 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4745 options::OPT_fvisibility_ms_compat)) {
4746 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4747 CmdArgs.push_back("-fvisibility");
4748 CmdArgs.push_back(A->getValue());
4749 } else {
4750 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4751 CmdArgs.push_back("-fvisibility");
4752 CmdArgs.push_back("hidden");
4753 CmdArgs.push_back("-ftype-visibility");
4754 CmdArgs.push_back("default");
4755 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004756 }
4757
Douglas Gregor08329632010-06-15 17:05:35 +00004758 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004759
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004760 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4761
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004762 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004763 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4764 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004765 CmdArgs.push_back("-ffreestanding");
4766
Daniel Dunbare357d562009-12-03 18:42:11 +00004767 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004768 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004769 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004770 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004771 // Emulated TLS is enabled by default on Android, and can be enabled manually
4772 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004773 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004774 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4775 EmulatedTLSDefault))
4776 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004777 // AltiVec-like language extensions aren't relevant for assembling.
4778 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004779 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004780 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4781 }
Richard Trieu91844232012-06-26 18:18:47 +00004782 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4783 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004784
Alexey Bataevdb390212015-05-20 04:24:19 +00004785 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004786 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4787 options::OPT_fno_openmp, false))
4788 switch (getOpenMPRuntime(getToolChain(), Args)) {
4789 case OMPRT_OMP:
4790 case OMPRT_IOMP5:
4791 // Clang can generate useful OpenMP code for these two runtime libraries.
4792 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004793
4794 // If no option regarding the use of TLS in OpenMP codegeneration is
4795 // given, decide a default based on the target. Otherwise rely on the
4796 // options and pass the right information to the frontend.
4797 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004798 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004799 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004800 break;
4801 default:
4802 // By default, if Clang doesn't know how to generate useful OpenMP code
4803 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4804 // down to the actual compilation.
4805 // FIXME: It would be better to have a mode which *only* omits IR
4806 // generation based on the OpenMP support so that we get consistent
4807 // semantic analysis, etc.
4808 break;
4809 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004810
Peter Collingbourne32701642013-11-01 18:16:25 +00004811 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004812 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004813
Eric Christopher459d2712013-02-19 06:16:53 +00004814 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004815 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4816 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4817 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4818 Arch == llvm::Triple::ppc64le))
4819 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4820 << "ppc/ppc64/ppc64le";
4821 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004822
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004823 // -fzvector is incompatible with -faltivec.
4824 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4825 if (Args.hasArg(options::OPT_faltivec))
4826 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4827 << "-faltivec";
4828
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004829 if (getToolChain().SupportsProfiling())
4830 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004831
4832 // -flax-vector-conversions is default.
4833 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4834 options::OPT_fno_lax_vector_conversions))
4835 CmdArgs.push_back("-fno-lax-vector-conversions");
4836
John Brawna7b4ec02015-08-10 11:11:28 +00004837 if (Args.getLastArg(options::OPT_fapple_kext) ||
4838 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004839 CmdArgs.push_back("-fapple-kext");
4840
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004841 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004842 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004843 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004844 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4845 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004846
4847 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4848 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004849 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004850 }
4851
Bob Wilson14adb362012-02-03 06:27:22 +00004852 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004853
Chandler Carruth6e501032011-03-27 00:04:55 +00004854 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4855 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004856 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004857 if (A->getOption().matches(options::OPT_fwrapv))
4858 CmdArgs.push_back("-fwrapv");
4859 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4860 options::OPT_fno_strict_overflow)) {
4861 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4862 CmdArgs.push_back("-fwrapv");
4863 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004864
4865 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4866 options::OPT_fno_reroll_loops))
4867 if (A->getOption().matches(options::OPT_freroll_loops))
4868 CmdArgs.push_back("-freroll-loops");
4869
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004870 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004871 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4872 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004873
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004874 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4875
Daniel Dunbar4930e332009-11-17 08:07:36 +00004876 // -stack-protector=0 is default.
4877 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004878 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4879 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4880 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4881 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4882 Args.ClaimAllArgs(options::OPT_fstack_protector);
4883 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 options::OPT_fstack_protector_all,
4885 options::OPT_fstack_protector_strong,
4886 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004887 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004888 StackProtectorLevel = std::max<unsigned>(
4889 LangOptions::SSPOn,
4890 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004891 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004892 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004893 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004894 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004895 } else {
4896 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004897 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004898 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004899 if (StackProtectorLevel) {
4900 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004901 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004902 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004903
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004904 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004905 for (const Arg *A : Args.filtered(options::OPT__param)) {
4906 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004907 if (Str.startswith("ssp-buffer-size=")) {
4908 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004909 CmdArgs.push_back("-stack-protector-buffer-size");
4910 // FIXME: Verify the argument is a valid integer.
4911 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004912 }
Sean Silva14facf32015-06-09 01:57:17 +00004913 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004914 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004915 }
4916
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004917 // Translate -mstackrealign
4918 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004919 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004920 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004921
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004922 if (Args.hasArg(options::OPT_mstack_alignment)) {
4923 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4924 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004925 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004926
Hans Wennborg77dc2362015-01-20 19:45:50 +00004927 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4928 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4929
4930 if (!Size.empty())
4931 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4932 else
4933 CmdArgs.push_back("-mstack-probe-size=0");
4934 }
4935
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004936 switch (getToolChain().getArch()) {
4937 case llvm::Triple::aarch64:
4938 case llvm::Triple::aarch64_be:
4939 case llvm::Triple::arm:
4940 case llvm::Triple::armeb:
4941 case llvm::Triple::thumb:
4942 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004943 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004944 break;
4945
4946 default:
4947 break;
4948 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004949
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004950 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4951 options::OPT_mno_restrict_it)) {
4952 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4953 CmdArgs.push_back("-backend-option");
4954 CmdArgs.push_back("-arm-restrict-it");
4955 } else {
4956 CmdArgs.push_back("-backend-option");
4957 CmdArgs.push_back("-arm-no-restrict-it");
4958 }
James Y Knight2db38f32015-08-15 03:45:25 +00004959 } else if (Triple.isOSWindows() &&
4960 (Triple.getArch() == llvm::Triple::arm ||
4961 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004962 // Windows on ARM expects restricted IT blocks
4963 CmdArgs.push_back("-backend-option");
4964 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004965 }
4966
Daniel Dunbard18049a2009-04-07 21:16:11 +00004967 // Forward -f options with positive and negative forms; we translate
4968 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004969 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4970 StringRef fname = A->getValue();
4971 if (!llvm::sys::fs::exists(fname))
4972 D.Diag(diag::err_drv_no_such_file) << fname;
4973 else
4974 A->render(Args, CmdArgs);
4975 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004976
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004977 // -fbuiltin is default unless -mkernel is used.
4978 bool UseBuiltins =
4979 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4980 !Args.hasArg(options::OPT_mkernel));
4981 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004982 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004983
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004984 // -ffreestanding implies -fno-builtin.
4985 if (Args.hasArg(options::OPT_ffreestanding))
4986 UseBuiltins = false;
4987
4988 // Process the -fno-builtin-* options.
4989 for (const auto &Arg : Args) {
4990 const Option &O = Arg->getOption();
4991 if (!O.matches(options::OPT_fno_builtin_))
4992 continue;
4993
4994 Arg->claim();
4995 // If -fno-builtin is specified, then there's no need to pass the option to
4996 // the frontend.
4997 if (!UseBuiltins)
4998 continue;
4999
5000 StringRef FuncName = Arg->getValue();
5001 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5002 }
5003
Nuno Lopes13c88c72009-12-16 16:59:22 +00005004 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5005 options::OPT_fno_assume_sane_operator_new))
5006 CmdArgs.push_back("-fno-assume-sane-operator-new");
5007
Daniel Dunbar4930e332009-11-17 08:07:36 +00005008 // -fblocks=0 is default.
5009 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005010 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005011 (Args.hasArg(options::OPT_fgnu_runtime) &&
5012 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5013 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005014 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005015
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005016 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005017 !getToolChain().hasBlocksRuntime())
5018 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005019 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005020
Richard Smith47972af2015-06-16 00:08:24 +00005021 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005022 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005023 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005024 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005025 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005026 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5027 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005028 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005029 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005030 HaveModules = true;
5031 }
5032 }
5033
Richard Smith47972af2015-06-16 00:08:24 +00005034 // -fmodule-maps enables implicit reading of module map files. By default,
5035 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005036 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5037 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005038 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005039 }
5040
Daniel Jasperac42b752013-10-21 06:34:34 +00005041 // -fmodules-decluse checks that modules used are declared so (off by
5042 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005043 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005044 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005045 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005046 }
5047
Daniel Jasper962b38e2014-04-11 11:47:45 +00005048 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5049 // all #included headers are part of modules.
5050 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005051 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005052 CmdArgs.push_back("-fmodules-strict-decluse");
5053 }
5054
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005055 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5056 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5057 options::OPT_fno_implicit_modules)) {
5058 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005059 } else if (HaveModules) {
5060 // -fmodule-cache-path specifies where our implicitly-built module files
5061 // should be written.
5062 SmallString<128> Path;
5063 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5064 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005065 if (C.isForDiagnostics()) {
5066 // When generating crash reports, we want to emit the modules along with
5067 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005068 Path = Output.getFilename();
5069 llvm::sys::path::replace_extension(Path, ".cache");
5070 llvm::sys::path::append(Path, "modules");
5071 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005072 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005073 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005074 llvm::sys::path::append(Path, "org.llvm.clang.");
5075 appendUserToPath(Path);
5076 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005077 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005078 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005079 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5080 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005081 }
5082
Richard Smith8d83d6d2016-03-21 19:06:06 +00005083 // -fmodule-name specifies the module that is currently being built (or
5084 // used for header checking by -fmodule-maps).
5085 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5086
5087 // -fmodule-map-file can be used to specify files containing module
5088 // definitions.
5089 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5090
5091 // -fmodule-file can be used to specify files containing precompiled modules.
5092 if (HaveModules)
5093 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5094 else
5095 Args.ClaimAllArgs(options::OPT_fmodule_file);
5096
Justin Bognera88f0122014-06-20 22:59:50 +00005097 // When building modules and generating crashdumps, we need to dump a module
5098 // dependency VFS alongside the output.
5099 if (HaveModules && C.isForDiagnostics()) {
5100 SmallString<128> VFSDir(Output.getFilename());
5101 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005102 // Add the cache directory as a temp so the crash diagnostics pick it up.
5103 C.addTempFile(Args.MakeArgString(VFSDir));
5104
Justin Bognera88f0122014-06-20 22:59:50 +00005105 llvm::sys::path::append(VFSDir, "vfs");
5106 CmdArgs.push_back("-module-dependency-dir");
5107 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005108 }
5109
Richard Smith9887d792014-10-17 01:42:53 +00005110 if (HaveModules)
5111 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005112
Douglas Gregor35b04d62013-02-07 19:01:24 +00005113 // Pass through all -fmodules-ignore-macro arguments.
5114 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005115 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5116 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005117
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005118 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5119
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005120 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5121 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5122 D.Diag(diag::err_drv_argument_not_allowed_with)
5123 << A->getAsString(Args) << "-fbuild-session-timestamp";
5124
5125 llvm::sys::fs::file_status Status;
5126 if (llvm::sys::fs::status(A->getValue(), Status))
5127 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005128 CmdArgs.push_back(Args.MakeArgString(
5129 "-fbuild-session-timestamp=" +
5130 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005131 }
5132
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005133 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005134 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5135 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005136 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5137
5138 Args.AddLastArg(CmdArgs,
5139 options::OPT_fmodules_validate_once_per_build_session);
5140 }
5141
Ben Langmuirdcf73862014-03-12 00:06:17 +00005142 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5143
John McCalldfea9982010-04-09 19:12:06 +00005144 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005145 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005146 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005147 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005148
Anders Carlssond470fef2010-11-21 00:09:52 +00005149 // -felide-constructors is the default.
5150 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005151 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005152 CmdArgs.push_back("-fno-elide-constructors");
5153
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005154 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005155
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005156 if (KernelOrKext || (types::isCXX(InputType) &&
5157 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5158 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005159 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005160
Tony Linthicum76329bf2011-12-12 21:14:55 +00005161 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005162 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5163 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005164 CmdArgs.push_back("-fshort-enums");
5165
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005166 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005167 if (Arg *A = Args.getLastArg(
5168 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5169 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5170 if (A->getOption().matches(options::OPT_funsigned_char) ||
5171 A->getOption().matches(options::OPT_fno_signed_char)) {
5172 CmdArgs.push_back("-fno-signed-char");
5173 }
5174 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005175 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005176 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005177
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005178 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005179 if (!Args.hasFlag(
5180 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5181 !IsWindowsCygnus && !IsWindowsGNU &&
5182 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5183 getToolChain().getArch() != llvm::Triple::hexagon &&
5184 getToolChain().getArch() != llvm::Triple::xcore &&
5185 ((getToolChain().getTriple().getVendor() !=
5186 llvm::Triple::MipsTechnologies) ||
5187 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005188 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005189 CmdArgs.push_back("-fno-use-cxa-atexit");
5190
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005191 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005192 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005193 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005194 CmdArgs.push_back("-fms-extensions");
5195
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005196 // -fno-use-line-directives is default.
5197 if (Args.hasFlag(options::OPT_fuse_line_directives,
5198 options::OPT_fno_use_line_directives, false))
5199 CmdArgs.push_back("-fuse-line-directives");
5200
Francois Pichet1b4f1632011-09-17 04:32:15 +00005201 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005202 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005203 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005204 (IsWindowsMSVC &&
5205 Args.hasFlag(options::OPT_fms_extensions,
5206 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005207 CmdArgs.push_back("-fms-compatibility");
5208
David Majnemerc371ff02015-03-22 08:39:22 +00005209 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005210 VersionTuple MSVT = visualstudio::getMSVCVersion(
5211 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5212 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005213 CmdArgs.push_back(
5214 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005215
David Majnemer8db91762015-05-18 04:49:30 +00005216 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5217 if (ImplyVCPPCXXVer) {
5218 if (IsMSVC2015Compatible)
5219 CmdArgs.push_back("-std=c++14");
5220 else
5221 CmdArgs.push_back("-std=c++11");
5222 }
5223
Eric Christopher5ecce122013-02-18 00:38:31 +00005224 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005225 if (Args.hasFlag(options::OPT_fborland_extensions,
5226 options::OPT_fno_borland_extensions, false))
5227 CmdArgs.push_back("-fborland-extensions");
5228
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005229 // -fno-declspec is default, except for PS4.
5230 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5231 getToolChain().getTriple().isPS4()))
5232 CmdArgs.push_back("-fdeclspec");
5233 else if (Args.hasArg(options::OPT_fno_declspec))
5234 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5235
David Majnemerc371ff02015-03-22 08:39:22 +00005236 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5237 // than 19.
5238 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5239 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005240 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005241 CmdArgs.push_back("-fno-threadsafe-statics");
5242
Francois Pichet02744872011-09-01 16:38:08 +00005243 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5244 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005245 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005246 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005247 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005248
Chandler Carruthe03aa552010-04-17 20:17:31 +00005249 // -fgnu-keywords default varies depending on language; only pass if
5250 // specified.
5251 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005252 options::OPT_fno_gnu_keywords))
5253 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005254
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005255 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005256 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005257 CmdArgs.push_back("-fgnu89-inline");
5258
Chad Rosier9c76d242012-03-15 22:31:42 +00005259 if (Args.hasArg(options::OPT_fno_inline))
5260 CmdArgs.push_back("-fno-inline");
5261
Chad Rosier64d6be92012-03-06 21:17:19 +00005262 if (Args.hasArg(options::OPT_fno_inline_functions))
5263 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005264
John McCall5fb5df92012-06-20 06:18:46 +00005265 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005266
John McCall5fb5df92012-06-20 06:18:46 +00005267 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005268 // legacy is the default. Except for deployment taget of 10.5,
5269 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5270 // gets ignored silently.
5271 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005272 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5273 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005274 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005275 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005276 if (getToolChain().UseObjCMixedDispatch())
5277 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5278 else
5279 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5280 }
5281 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005282
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005283 // When ObjectiveC legacy runtime is in effect on MacOSX,
5284 // turn on the option to do Array/Dictionary subscripting
5285 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005286 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005287 getToolChain().getTriple().isMacOSX() &&
5288 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5289 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005290 objcRuntime.isNeXTFamily())
5291 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005292
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005293 // -fencode-extended-block-signature=1 is default.
5294 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5295 CmdArgs.push_back("-fencode-extended-block-signature");
5296 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297
John McCall24fc0de2011-07-06 00:26:06 +00005298 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5299 // NOTE: This logic is duplicated in ToolChains.cpp.
5300 bool ARC = isObjCAutoRefCount(Args);
5301 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005302 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005303
John McCall24fc0de2011-07-06 00:26:06 +00005304 CmdArgs.push_back("-fobjc-arc");
5305
Chandler Carruth491db322011-11-04 07:34:47 +00005306 // FIXME: It seems like this entire block, and several around it should be
5307 // wrapped in isObjC, but for now we just use it here as this is where it
5308 // was being used previously.
5309 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5310 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5311 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5312 else
5313 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5314 }
5315
John McCall24fc0de2011-07-06 00:26:06 +00005316 // Allow the user to enable full exceptions code emission.
5317 // We define off for Objective-CC, on for Objective-C++.
5318 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5319 options::OPT_fno_objc_arc_exceptions,
5320 /*default*/ types::isCXX(InputType)))
5321 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005322
John McCall24fc0de2011-07-06 00:26:06 +00005323 }
5324
5325 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5326 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005327 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005328 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005329
John McCall24fc0de2011-07-06 00:26:06 +00005330 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5331 // takes precedence.
5332 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5333 if (!GCArg)
5334 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5335 if (GCArg) {
5336 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005337 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005338 } else if (getToolChain().SupportsObjCGC()) {
5339 GCArg->render(Args, CmdArgs);
5340 } else {
5341 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005342 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005343 }
5344 }
5345
John McCallfbe5ed72015-11-05 19:19:56 +00005346 // Pass down -fobjc-weak or -fno-objc-weak if present.
5347 if (types::isObjC(InputType)) {
5348 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5349 options::OPT_fno_objc_weak);
5350 if (!WeakArg) {
5351 // nothing to do
5352 } else if (GCArg) {
5353 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5354 D.Diag(diag::err_objc_weak_with_gc);
5355 } else if (!objcRuntime.allowsWeak()) {
5356 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5357 D.Diag(diag::err_objc_weak_unsupported);
5358 } else {
5359 WeakArg->render(Args, CmdArgs);
5360 }
5361 }
5362
Bob Wilsonb111ec92015-03-02 19:01:14 +00005363 if (Args.hasFlag(options::OPT_fapplication_extension,
5364 options::OPT_fno_application_extension, false))
5365 CmdArgs.push_back("-fapplication-extension");
5366
Reid Klecknerc542d372014-06-27 17:02:02 +00005367 // Handle GCC-style exception args.
5368 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005369 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5370 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005371
Tim Northovere931f9f2015-10-30 16:30:41 +00005372 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005373 CmdArgs.push_back("-fsjlj-exceptions");
5374
5375 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005376 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5377 options::OPT_fno_assume_sane_operator_new))
5378 CmdArgs.push_back("-fno-assume-sane-operator-new");
5379
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005380 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5381 // most platforms.
5382 if (Args.hasFlag(options::OPT_fsized_deallocation,
5383 options::OPT_fno_sized_deallocation, false))
5384 CmdArgs.push_back("-fsized-deallocation");
5385
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005386 // -fconstant-cfstrings is default, and may be subject to argument translation
5387 // on Darwin.
5388 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5389 options::OPT_fno_constant_cfstrings) ||
5390 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5391 options::OPT_mno_constant_cfstrings))
5392 CmdArgs.push_back("-fno-constant-cfstrings");
5393
John Thompsoned4e2952009-11-05 20:14:16 +00005394 // -fshort-wchar default varies depending on platform; only
5395 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005396 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5397 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005398 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005399
Hans Wennborg28c96312013-07-31 23:39:13 +00005400 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005401 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005402 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005403 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005404
Daniel Dunbar096ed292011-10-05 21:04:55 +00005405 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5406 // -fno-pack-struct doesn't apply to -fpack-struct=.
5407 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005408 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005409 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005410 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005411 } else if (Args.hasFlag(options::OPT_fpack_struct,
5412 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005413 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005414 }
5415
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005416 // Handle -fmax-type-align=N and -fno-type-align
5417 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5418 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5419 if (!SkipMaxTypeAlign) {
5420 std::string MaxTypeAlignStr = "-fmax-type-align=";
5421 MaxTypeAlignStr += A->getValue();
5422 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5423 }
5424 } else if (getToolChain().getTriple().isOSDarwin()) {
5425 if (!SkipMaxTypeAlign) {
5426 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5427 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5428 }
5429 }
5430
John Brawna7b4ec02015-08-10 11:11:28 +00005431 // -fcommon is the default unless compiling kernel code or the target says so
5432 bool NoCommonDefault =
5433 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5434 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5435 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005436 CmdArgs.push_back("-fno-common");
5437
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005438 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005439 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005440 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005441 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005442 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005443 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005444
Daniel Dunbar6358d682010-10-15 22:30:42 +00005445 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005446 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005447 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005448 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005449
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005450 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005451 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5452 StringRef value = inputCharset->getValue();
5453 if (value != "UTF-8")
5454 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5455 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005456 }
5457
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005458 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005459 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5460 StringRef value = execCharset->getValue();
5461 if (value != "UTF-8")
5462 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5463 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005464 }
5465
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005466 // -fcaret-diagnostics is default.
5467 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5468 options::OPT_fno_caret_diagnostics, true))
5469 CmdArgs.push_back("-fno-caret-diagnostics");
5470
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005471 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005472 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005473 options::OPT_fno_diagnostics_fixit_info))
5474 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005475
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005476 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005477 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005478 options::OPT_fno_diagnostics_show_option))
5479 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005480
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005481 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005482 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005483 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005484 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005485 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005486
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005487 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005488 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005489 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005490 }
5491
Chandler Carruthb6766f02011-03-27 01:50:55 +00005492 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005493 options::OPT_fdiagnostics_show_note_include_stack,
5494 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005495 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005496 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005497 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5498 else
5499 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5500 }
5501
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005502 // Color diagnostics are the default, unless the terminal doesn't support
5503 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005504 // Support both clang's -f[no-]color-diagnostics and gcc's
5505 // -f[no-]diagnostics-colors[=never|always|auto].
5506 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005507 for (const auto &Arg : Args) {
5508 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005509 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5510 !O.matches(options::OPT_fdiagnostics_color) &&
5511 !O.matches(options::OPT_fno_color_diagnostics) &&
5512 !O.matches(options::OPT_fno_diagnostics_color) &&
5513 !O.matches(options::OPT_fdiagnostics_color_EQ))
5514 continue;
5515
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005516 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005517 if (O.matches(options::OPT_fcolor_diagnostics) ||
5518 O.matches(options::OPT_fdiagnostics_color)) {
5519 ShowColors = Colors_On;
5520 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5521 O.matches(options::OPT_fno_diagnostics_color)) {
5522 ShowColors = Colors_Off;
5523 } else {
5524 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005525 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005526 if (value == "always")
5527 ShowColors = Colors_On;
5528 else if (value == "never")
5529 ShowColors = Colors_Off;
5530 else if (value == "auto")
5531 ShowColors = Colors_Auto;
5532 else
5533 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005534 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005535 }
5536 }
5537 if (ShowColors == Colors_On ||
5538 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005539 CmdArgs.push_back("-fcolor-diagnostics");
5540
Nico Rieck7857d462013-09-11 00:38:02 +00005541 if (Args.hasArg(options::OPT_fansi_escape_codes))
5542 CmdArgs.push_back("-fansi-escape-codes");
5543
Daniel Dunbardb097022009-06-08 21:13:54 +00005544 if (!Args.hasFlag(options::OPT_fshow_source_location,
5545 options::OPT_fno_show_source_location))
5546 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005548 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005549 true))
5550 CmdArgs.push_back("-fno-show-column");
5551
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005552 if (!Args.hasFlag(options::OPT_fspell_checking,
5553 options::OPT_fno_spell_checking))
5554 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005555
Chad Rosierc8e56e82012-12-05 21:08:21 +00005556 // -fno-asm-blocks is default.
5557 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5558 false))
5559 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005560
Steven Wucb0d13f2015-01-16 23:05:28 +00005561 // -fgnu-inline-asm is default.
5562 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5563 options::OPT_fno_gnu_inline_asm, true))
5564 CmdArgs.push_back("-fno-gnu-inline-asm");
5565
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005566 // Enable vectorization per default according to the optimization level
5567 // selected. For optimization levels that want vectorization we use the alias
5568 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005569 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005570 OptSpecifier VectorizeAliasOption =
5571 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005572 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005573 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005574 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005575
Chad Rosier136d67d2014-04-28 19:30:57 +00005576 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005577 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005578 OptSpecifier SLPVectAliasOption =
5579 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005580 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005581 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005582 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005583
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005584 // -fno-slp-vectorize-aggressive is default.
5585 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005586 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005587 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005588
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005589 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5590 A->render(Args, CmdArgs);
5591
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005592 // -fdollars-in-identifiers default varies depending on platform and
5593 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005594 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005595 options::OPT_fno_dollars_in_identifiers)) {
5596 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005597 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005598 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005599 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005600 }
5601
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005602 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5603 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005604 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005605 options::OPT_fno_unit_at_a_time)) {
5606 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005607 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005608 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005609
Eli Friedman055c9702011-11-02 01:53:16 +00005610 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5611 options::OPT_fno_apple_pragma_pack, false))
5612 CmdArgs.push_back("-fapple-pragma-pack");
5613
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005614 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005615 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5616 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005617 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005618 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005619 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005620
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005621// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5622//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005623// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005624#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005625 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005626 (getToolChain().getArch() == llvm::Triple::arm ||
5627 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005628 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5629 CmdArgs.push_back("-fno-builtin-strcat");
5630 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5631 CmdArgs.push_back("-fno-builtin-strcpy");
5632 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005633#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005634
Justin Bognera88f0122014-06-20 22:59:50 +00005635 // Enable rewrite includes if the user's asked for it or if we're generating
5636 // diagnostics.
5637 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5638 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005639 if (Args.hasFlag(options::OPT_frewrite_includes,
5640 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005641 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005642 CmdArgs.push_back("-frewrite-includes");
5643
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005644 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005645 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005646 options::OPT_traditional_cpp)) {
5647 if (isa<PreprocessJobAction>(JA))
5648 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005649 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005650 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005651 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005652
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005653 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005654 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005655
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005656 // Handle serialized diagnostics.
5657 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5658 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005659 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005660 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005661
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005662 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5663 CmdArgs.push_back("-fretain-comments-from-system-headers");
5664
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005665 // Forward -fcomment-block-commands to -cc1.
5666 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005667 // Forward -fparse-all-comments to -cc1.
5668 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005669
John Brawnad31ace2015-09-23 13:55:40 +00005670 // Turn -fplugin=name.so into -load name.so
5671 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5672 CmdArgs.push_back("-load");
5673 CmdArgs.push_back(A->getValue());
5674 A->claim();
5675 }
5676
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005677 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5678 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005679 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005680 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5681 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005682
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005683 // We translate this by hand to the -cc1 argument, since nightly test uses
5684 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005685 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005686 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005687 } else
Sean Silva14facf32015-06-09 01:57:17 +00005688 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005689 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005690
Bob Wilson23a55f12014-12-21 07:00:00 +00005691 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005692 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5693 // by the frontend.
5694 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5695 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005696
Daniel Dunbard67a3222009-03-30 06:36:42 +00005697 if (Output.getType() == types::TY_Dependencies) {
5698 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005699 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005700 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005701 CmdArgs.push_back(Output.getFilename());
5702 } else {
5703 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005704 }
5705
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005706 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005707
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005708 if (Input.isFilename())
5709 CmdArgs.push_back(Input.getFilename());
5710 else
5711 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005712
Chris Lattnere9d7d782009-11-03 19:50:27 +00005713 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5714
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005715 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005716
5717 // Optionally embed the -cc1 level arguments into the debug info, for build
5718 // analysis.
5719 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005720 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005721 for (const auto &Arg : Args)
5722 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005723
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005724 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005725 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005726 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005727 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005728 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005729 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005730 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005731 }
5732 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005733 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005734 }
5735
Eric Christopherd3804002013-02-22 20:12:52 +00005736 // Add the split debug info name to the command lines here so we
5737 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005738 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005739 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5740 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005741 const char *SplitDwarfOut;
5742 if (SplitDwarf) {
5743 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005744 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005745 CmdArgs.push_back(SplitDwarfOut);
5746 }
5747
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005748 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5749 // Include them with -fcuda-include-gpubinary.
5750 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005751 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005752 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005753 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005754 }
5755
Eric Christopherd3804002013-02-22 20:12:52 +00005756 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005757 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005758 Output.getType() == types::TY_Object &&
5759 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005760 auto CLCommand =
5761 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005762 C.addCommand(llvm::make_unique<FallbackCommand>(
5763 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005764 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5765 isa<PrecompileJobAction>(JA)) {
5766 // In /fallback builds, run the main compilation even if the pch generation
5767 // fails, so that the main compilation's fallback to cl.exe runs.
5768 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5769 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005770 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005771 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005772 }
5773
Eric Christopherf1545832013-02-22 23:50:16 +00005774 // Handle the debug info splitting at object creation time if we're
5775 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005776 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005777 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005778 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005779
Roman Divacky178e01602011-02-10 16:52:03 +00005780 if (Arg *A = Args.getLastArg(options::OPT_pg))
5781 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005782 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5783 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005784
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005785 // Claim some arguments which clang supports automatically.
5786
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005787 // -fpch-preprocess is used with gcc to add a special marker in the output to
5788 // include the PCH file. Clang's PTH solution is completely transparent, so we
5789 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005790 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005791
Daniel Dunbar17731772009-03-23 19:03:36 +00005792 // Claim some arguments which clang doesn't support, but we don't
5793 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005794 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5795 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005796
Rafael Espindolab0092d72013-09-04 19:37:35 +00005797 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005798 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005799}
5800
John McCall5fb5df92012-06-20 06:18:46 +00005801/// Add options related to the Objective-C runtime/ABI.
5802///
5803/// Returns true if the runtime is non-fragile.
5804ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5805 ArgStringList &cmdArgs,
5806 RewriteKind rewriteKind) const {
5807 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005808 Arg *runtimeArg =
5809 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5810 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005811
5812 // Just forward -fobjc-runtime= to the frontend. This supercedes
5813 // options about fragility.
5814 if (runtimeArg &&
5815 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5816 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005817 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005818 if (runtime.tryParse(value)) {
5819 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005820 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005821 }
5822
5823 runtimeArg->render(args, cmdArgs);
5824 return runtime;
5825 }
5826
5827 // Otherwise, we'll need the ABI "version". Version numbers are
5828 // slightly confusing for historical reasons:
5829 // 1 - Traditional "fragile" ABI
5830 // 2 - Non-fragile ABI, version 1
5831 // 3 - Non-fragile ABI, version 2
5832 unsigned objcABIVersion = 1;
5833 // If -fobjc-abi-version= is present, use that to set the version.
5834 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005835 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005836 if (value == "1")
5837 objcABIVersion = 1;
5838 else if (value == "2")
5839 objcABIVersion = 2;
5840 else if (value == "3")
5841 objcABIVersion = 3;
5842 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005844 } else {
5845 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005846 bool nonFragileABIIsDefault =
5847 (rewriteKind == RK_NonFragile ||
5848 (rewriteKind == RK_None &&
5849 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005850 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5851 options::OPT_fno_objc_nonfragile_abi,
5852 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005853// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005854#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5855 unsigned nonFragileABIVersion = 1;
5856#else
5857 unsigned nonFragileABIVersion = 2;
5858#endif
5859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005860 if (Arg *abiArg =
5861 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005862 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005863 if (value == "1")
5864 nonFragileABIVersion = 1;
5865 else if (value == "2")
5866 nonFragileABIVersion = 2;
5867 else
5868 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005869 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005870 }
5871
5872 objcABIVersion = 1 + nonFragileABIVersion;
5873 } else {
5874 objcABIVersion = 1;
5875 }
5876 }
5877
5878 // We don't actually care about the ABI version other than whether
5879 // it's non-fragile.
5880 bool isNonFragile = objcABIVersion != 1;
5881
5882 // If we have no runtime argument, ask the toolchain for its default runtime.
5883 // However, the rewriter only really supports the Mac runtime, so assume that.
5884 ObjCRuntime runtime;
5885 if (!runtimeArg) {
5886 switch (rewriteKind) {
5887 case RK_None:
5888 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5889 break;
5890 case RK_Fragile:
5891 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5892 break;
5893 case RK_NonFragile:
5894 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5895 break;
5896 }
5897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005898 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005899 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5900 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005901 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005902 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5903
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005904 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005905 } else {
5906 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5907 }
5908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005909 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005910 } else {
5911 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005912 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005913 // non-fragile mode or the GCC runtime in fragile mode.
5914 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005915 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005916 else
5917 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005918 }
5919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005920 cmdArgs.push_back(
5921 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005922 return runtime;
5923}
5924
Reid Klecknerc542d372014-06-27 17:02:02 +00005925static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5926 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5927 I += HaveDash;
5928 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005929}
Reid Klecknerc542d372014-06-27 17:02:02 +00005930
Benjamin Kramere003ca22015-10-28 13:54:16 +00005931namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005932struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005933 bool Synch = false;
5934 bool Asynch = false;
5935 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005936};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005937} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005938
5939/// /EH controls whether to run destructor cleanups when exceptions are
5940/// thrown. There are three modifiers:
5941/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5942/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5943/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005944/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005945/// The default is /EHs-c-, meaning cleanups are disabled.
5946static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5947 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005948
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005949 std::vector<std::string> EHArgs =
5950 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005951 for (auto EHVal : EHArgs) {
5952 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5953 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005954 case 'a':
5955 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005956 if (EH.Asynch)
5957 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005958 continue;
5959 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005960 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 continue;
5962 case 's':
5963 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005964 if (EH.Synch)
5965 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005966 continue;
5967 default:
5968 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005969 }
5970 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5971 break;
5972 }
5973 }
David Majnemerb8809092016-02-20 09:23:44 +00005974 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005975 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005976 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005977 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5978 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005979 EH.Synch = true;
5980 EH.NoUnwindC = true;
5981 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005982
Reid Klecknerc542d372014-06-27 17:02:02 +00005983 return EH;
5984}
5985
David Majnemercd5855e2016-02-29 01:40:36 +00005986void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5987 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005988 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005989 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005990 unsigned RTOptionID = options::OPT__SLASH_MT;
5991
Hans Wennborgf1a74252013-09-10 20:18:04 +00005992 if (Args.hasArg(options::OPT__SLASH_LDd))
5993 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5994 // but defining _DEBUG is sticky.
5995 RTOptionID = options::OPT__SLASH_MTd;
5996
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005997 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005998 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005999
David Majnemere2afb472015-07-24 06:49:13 +00006000 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006001 switch (RTOptionID) {
6002 case options::OPT__SLASH_MD:
6003 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006004 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006005 CmdArgs.push_back("-D_MT");
6006 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006007 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006008 break;
6009 case options::OPT__SLASH_MDd:
6010 CmdArgs.push_back("-D_DEBUG");
6011 CmdArgs.push_back("-D_MT");
6012 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006013 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006014 break;
6015 case options::OPT__SLASH_MT:
6016 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006017 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006018 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006019 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006020 break;
6021 case options::OPT__SLASH_MTd:
6022 CmdArgs.push_back("-D_DEBUG");
6023 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006024 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006025 break;
6026 default:
6027 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006028 }
6029
David Majnemere2afb472015-07-24 06:49:13 +00006030 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6031 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6032 } else {
6033 CmdArgs.push_back(FlagForCRT.data());
6034
6035 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6036 // users want. The /Za flag to cl.exe turns this off, but it's not
6037 // implemented in clang.
6038 CmdArgs.push_back("--dependent-lib=oldnames");
6039 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006040
Hans Wennborg8858a032014-07-21 23:42:07 +00006041 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6042 // would produce interleaved output, so ignore /showIncludes in such cases.
6043 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6044 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6045 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006046
David Majnemerf6072342014-07-01 22:24:56 +00006047 // This controls whether or not we emit RTTI data for polymorphic types.
6048 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6049 /*default=*/false))
6050 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006051
Reid Kleckner124955a2015-08-05 18:51:13 +00006052 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006053 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006054 if (*EmitCodeView)
6055 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006056 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006057 CmdArgs.push_back("-gcodeview");
6058
Reid Klecknerc542d372014-06-27 17:02:02 +00006059 const Driver &D = getToolChain().getDriver();
6060 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006061 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006062 if (types::isCXX(InputType))
6063 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006064 CmdArgs.push_back("-fexceptions");
6065 }
David Majnemercd5855e2016-02-29 01:40:36 +00006066 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6067 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006068
Hans Wennborge50cec32014-06-13 20:59:54 +00006069 // /EP should expand to -E -P.
6070 if (Args.hasArg(options::OPT__SLASH_EP)) {
6071 CmdArgs.push_back("-E");
6072 CmdArgs.push_back("-P");
6073 }
6074
David Majnemera5b195a2015-02-14 01:35:12 +00006075 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006076 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6077 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006078 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6079 else
6080 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6081
6082 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6083 VolatileOptionID = A->getOption().getID();
6084
6085 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6086 CmdArgs.push_back("-fms-volatile");
6087
David Majnemer86c318f2014-02-11 21:05:00 +00006088 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6089 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6090 if (MostGeneralArg && BestCaseArg)
6091 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6092 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6093
6094 if (MostGeneralArg) {
6095 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6096 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6097 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6098
6099 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6100 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6101 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6102 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6103 << FirstConflict->getAsString(Args)
6104 << SecondConflict->getAsString(Args);
6105
6106 if (SingleArg)
6107 CmdArgs.push_back("-fms-memptr-rep=single");
6108 else if (MultipleArg)
6109 CmdArgs.push_back("-fms-memptr-rep=multiple");
6110 else
6111 CmdArgs.push_back("-fms-memptr-rep=virtual");
6112 }
6113
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006114 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6115 A->render(Args, CmdArgs);
6116
Hans Wennborg81f74482013-09-10 01:07:07 +00006117 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6118 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006119 if (Args.hasArg(options::OPT__SLASH_fallback))
6120 CmdArgs.push_back("msvc-fallback");
6121 else
6122 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006123 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006124}
6125
Douglas Katzman95354292015-06-23 20:42:09 +00006126visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006127 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006128 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006129 return CLFallback.get();
6130}
6131
Daniel Sanders7f933f42015-01-30 17:35:23 +00006132void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6133 ArgStringList &CmdArgs) const {
6134 StringRef CPUName;
6135 StringRef ABIName;
6136 const llvm::Triple &Triple = getToolChain().getTriple();
6137 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6138
6139 CmdArgs.push_back("-target-abi");
6140 CmdArgs.push_back(ABIName.data());
6141}
6142
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006143void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006144 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006145 const ArgList &Args,
6146 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006147 ArgStringList CmdArgs;
6148
6149 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6150 const InputInfo &Input = Inputs[0];
6151
James Y Knight2db38f32015-08-15 03:45:25 +00006152 std::string TripleStr =
6153 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6154 const llvm::Triple Triple(TripleStr);
6155
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006156 // Don't warn about "clang -w -c foo.s"
6157 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006158 // and "clang -emit-llvm -c foo.s"
6159 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006160
Rafael Espindola577637a2015-01-03 00:06:04 +00006161 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006162
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006163 // Invoke ourselves in -cc1as mode.
6164 //
6165 // FIXME: Implement custom jobs for internal actions.
6166 CmdArgs.push_back("-cc1as");
6167
6168 // Add the "effective" target triple.
6169 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006170 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6171
6172 // Set the output mode, we currently only expect to be used as a real
6173 // assembler.
6174 CmdArgs.push_back("-filetype");
6175 CmdArgs.push_back("obj");
6176
Eric Christopher45f2e712012-12-18 00:31:10 +00006177 // Set the main file name, so that debug info works even with
6178 // -save-temps or preprocessed assembly.
6179 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006180 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006181
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006182 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006183 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006184 if (!CPU.empty()) {
6185 CmdArgs.push_back("-target-cpu");
6186 CmdArgs.push_back(Args.MakeArgString(CPU));
6187 }
6188
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006189 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006190 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006191
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006192 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006193 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006194
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006195 // Pass along any -I options so we get proper .include search paths.
6196 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6197
Eric Christopherfc3ee562012-01-10 00:38:01 +00006198 // Determine the original source input.
6199 const Action *SourceAction = &JA;
6200 while (SourceAction->getKind() != Action::InputClass) {
6201 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6202 SourceAction = SourceAction->getInputs()[0];
6203 }
6204
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006205 // Forward -g and handle debug info related flags, assuming we are dealing
6206 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006207 if (SourceAction->getType() == types::TY_Asm ||
6208 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006209 bool WantDebug = false;
6210 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006211 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006212 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006213 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6214 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006215 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006216 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006217 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006218 if (DwarfVersion == 0)
6219 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006220 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006221 (WantDebug ? codegenoptions::LimitedDebugInfo
6222 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006223 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006224
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006225 // Add the -fdebug-compilation-dir flag if needed.
6226 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006227
6228 // Set the AT_producer to the clang version when using the integrated
6229 // assembler on assembly source files.
6230 CmdArgs.push_back("-dwarf-debug-producer");
6231 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
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);
6754 CmdArgs.push_back("-o");
6755 CmdArgs.push_back(Output.getFilename());
6756 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6757 CmdArgs, Inputs));
6758}
6759// AMDGPU tools end.
6760
Dan Gohman52816862015-12-16 23:30:41 +00006761wasm::Linker::Linker(const ToolChain &TC)
6762 : GnuTool("wasm::Linker", "lld", TC) {}
6763
6764bool wasm::Linker::isLinkJob() const {
6765 return true;
6766}
6767
6768bool wasm::Linker::hasIntegratedCPP() const {
6769 return false;
6770}
6771
6772void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6773 const InputInfo &Output,
6774 const InputInfoList &Inputs,
6775 const ArgList &Args,
6776 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006777
6778 const ToolChain &ToolChain = getToolChain();
6779 const Driver &D = ToolChain.getDriver();
6780 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006781 ArgStringList CmdArgs;
6782 CmdArgs.push_back("-flavor");
6783 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006784
6785 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006786 // size is of particular importance. This is significantly facilitated by
6787 // the enabling of -ffunction-sections and -fdata-sections in
6788 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006789 if (areOptimizationsEnabled(Args))
6790 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006791
Dan Gohman57b62c52016-02-22 19:26:15 +00006792 if (Args.hasArg(options::OPT_rdynamic))
6793 CmdArgs.push_back("-export-dynamic");
6794 if (Args.hasArg(options::OPT_s))
6795 CmdArgs.push_back("--strip-all");
6796 if (Args.hasArg(options::OPT_shared))
6797 CmdArgs.push_back("-shared");
6798 if (Args.hasArg(options::OPT_static))
6799 CmdArgs.push_back("-Bstatic");
6800
6801 Args.AddAllArgs(CmdArgs, options::OPT_L);
6802 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6803
6804 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6805 if (Args.hasArg(options::OPT_shared))
6806 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6807 else if (Args.hasArg(options::OPT_pie))
6808 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6809 else
6810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6811
6812 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6813 }
6814
6815 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6816
6817 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6818 if (D.CCCIsCXX())
6819 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6820
6821 if (Args.hasArg(options::OPT_pthread))
6822 CmdArgs.push_back("-lpthread");
6823
6824 CmdArgs.push_back("-lc");
6825 CmdArgs.push_back("-lcompiler_rt");
6826 }
6827
6828 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6829 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6830
Dan Gohman52816862015-12-16 23:30:41 +00006831 CmdArgs.push_back("-o");
6832 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006833
Dan Gohman52816862015-12-16 23:30:41 +00006834 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6835}
6836
Renato Golin7c542b42015-07-27 23:44:45 +00006837const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006838 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006839 if (!Arch.empty())
6840 MArch = Arch;
6841 else
Bernard Ogden31561762013-12-12 13:27:11 +00006842 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006843 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006844
6845 // Handle -march=native.
6846 if (MArch == "native") {
6847 std::string CPU = llvm::sys::getHostCPUName();
6848 if (CPU != "generic") {
6849 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006850 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006851 // If there is no valid architecture suffix for this CPU we don't know how
6852 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006853 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006854 MArch = "";
6855 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006856 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006857 }
6858 }
6859
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006860 return MArch;
6861}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006862
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006863/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006864StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006865 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006866 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6867 // here means an -march=native that we can't handle, so instead return no CPU.
6868 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006869 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006870
John Brawna95c1a82015-05-08 12:52:18 +00006871 // We need to return an empty string here on invalid MArch values as the
6872 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006873 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006874}
6875
6876/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006877std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006878 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006879 // FIXME: Warn on inconsistent use of -mcpu and -march.
6880 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006881 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006882 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006883 // Handle -mcpu=native.
6884 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006885 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006886 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006887 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006888 }
6889
Renato Goline17c5802015-07-27 23:44:42 +00006890 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006891}
6892
6893/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006894/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006895// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006896StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6897 const llvm::Triple &Triple) {
6898 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006899 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006900 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006901 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006902 if (ArchKind == llvm::ARM::AK_INVALID)
6903 // In case of generic Arch, i.e. "arm",
6904 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006905 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006906 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006907 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6908 // armv7k triple if it's actually been specified via "-arch armv7k".
6909 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006910 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006911 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006912 }
Renato Golin3c007252015-05-28 15:05:53 +00006913 if (ArchKind == llvm::ARM::AK_INVALID)
6914 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006915 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006916}
6917
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006918void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006919 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006920 if (Args.hasArg(options::OPT_r))
6921 return;
6922
John Brawn94fd9632015-05-21 12:19:49 +00006923 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6924 // to generate BE-8 executables.
6925 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6926 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006927}
6928
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006929mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006930 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6931 // was first introduced in Release 3. However, other compilers have
6932 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006933 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6934 .Case("mips1", NanLegacy)
6935 .Case("mips2", NanLegacy)
6936 .Case("mips3", NanLegacy)
6937 .Case("mips4", NanLegacy)
6938 .Case("mips5", NanLegacy)
6939 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006940 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006941 .Case("mips32r3", NanLegacy | Nan2008)
6942 .Case("mips32r5", NanLegacy | Nan2008)
6943 .Case("mips32r6", Nan2008)
6944 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006945 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006946 .Case("mips64r3", NanLegacy | Nan2008)
6947 .Case("mips64r5", NanLegacy | Nan2008)
6948 .Case("mips64r6", Nan2008)
6949 .Default(NanLegacy);
6950}
6951
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006952bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6953 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6954 return A && (A->getValue() == StringRef(Value));
6955}
6956
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006957bool mips::isUCLibc(const ArgList &Args) {
6958 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006959 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006960}
6961
Daniel Sanders2bf13662014-07-10 14:40:57 +00006962bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006963 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6964 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006965 .Case("2008", true)
6966 .Case("legacy", false)
6967 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006968
6969 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006970 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006971 .Cases("mips32r6", "mips64r6", true)
6972 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006973
6974 return false;
6975}
6976
Daniel Sanders379d44b2014-07-16 11:52:23 +00006977bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006978 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006979 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006980 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006981 return false;
6982
6983 if (ABIName != "32")
6984 return false;
6985
Toma Tabacu94ea6862015-06-16 13:54:13 +00006986 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6987 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006988 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006989 return false;
6990
Daniel Sanders379d44b2014-07-16 11:52:23 +00006991 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006992 .Cases("mips2", "mips3", "mips4", "mips5", true)
6993 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6994 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6995 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006996}
6997
Toma Tabacu94ea6862015-06-16 13:54:13 +00006998bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6999 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007000 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007001 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7002
7003 // FPXX shouldn't be used if -msingle-float is present.
7004 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7005 options::OPT_mdouble_float))
7006 if (A->getOption().matches(options::OPT_msingle_float))
7007 UseFPXX = false;
7008
7009 return UseFPXX;
7010}
7011
Tim Northover157d9112014-01-16 08:48:16 +00007012llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007013 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7014 // archs which Darwin doesn't use.
7015
7016 // The matching this routine does is fairly pointless, since it is neither the
7017 // complete architecture list, nor a reasonable subset. The problem is that
7018 // historically the driver driver accepts this and also ties its -march=
7019 // handling to the architecture name, so we need to be careful before removing
7020 // support for it.
7021
7022 // This code must be kept in sync with Clang's Darwin specific argument
7023 // translation.
7024
7025 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007026 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7027 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7028 .Case("ppc64", llvm::Triple::ppc64)
7029 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7030 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7031 llvm::Triple::x86)
7032 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7033 // This is derived from the driver driver.
7034 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7035 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7036 .Cases("armv7s", "xscale", llvm::Triple::arm)
7037 .Case("arm64", llvm::Triple::aarch64)
7038 .Case("r600", llvm::Triple::r600)
7039 .Case("amdgcn", llvm::Triple::amdgcn)
7040 .Case("nvptx", llvm::Triple::nvptx)
7041 .Case("nvptx64", llvm::Triple::nvptx64)
7042 .Case("amdil", llvm::Triple::amdil)
7043 .Case("spir", llvm::Triple::spir)
7044 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007045}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007046
Tim Northover157d9112014-01-16 08:48:16 +00007047void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007048 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007049 T.setArch(Arch);
7050
7051 if (Str == "x86_64h")
7052 T.setArchName(Str);
7053 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7054 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007055 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007056 }
7057}
7058
Bob Wilsondecc03e2012-11-23 06:14:39 +00007059const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007060 const InputInfo &Input) {
7061 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007062}
7063
Bob Wilsondecc03e2012-11-23 06:14:39 +00007064const char *Clang::getBaseInputStem(const ArgList &Args,
7065 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007066 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007067
Chris Lattner906bb902011-01-16 08:14:11 +00007068 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007069 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007070
7071 return Str;
7072}
7073
Bob Wilsondecc03e2012-11-23 06:14:39 +00007074const char *Clang::getDependencyFileName(const ArgList &Args,
7075 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007076 // FIXME: Think about this more.
7077 std::string Res;
7078
7079 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007080 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007081 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007082 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007083 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007084 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007085 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007086}
7087
Douglas Katzman95354292015-06-23 20:42:09 +00007088void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7089 const InputInfo &Output,
7090 const InputInfoList &Inputs,
7091 const ArgList &Args,
7092 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007093 const ToolChain &ToolChain = getToolChain();
7094 const Driver &D = ToolChain.getDriver();
7095 ArgStringList CmdArgs;
7096
7097 // Silence warning for "clang -g foo.o -o foo"
7098 Args.ClaimAllArgs(options::OPT_g_Group);
7099 // and "clang -emit-llvm foo.o -o foo"
7100 Args.ClaimAllArgs(options::OPT_emit_llvm);
7101 // and for "clang -w foo.o -o foo". Other warning options are already
7102 // handled somewhere else.
7103 Args.ClaimAllArgs(options::OPT_w);
7104
7105 if (!D.SysRoot.empty())
7106 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7107
7108 // CloudABI only supports static linkage.
7109 CmdArgs.push_back("-Bstatic");
7110 CmdArgs.push_back("--eh-frame-hdr");
7111 CmdArgs.push_back("--gc-sections");
7112
7113 if (Output.isFilename()) {
7114 CmdArgs.push_back("-o");
7115 CmdArgs.push_back(Output.getFilename());
7116 } else {
7117 assert(Output.isNothing() && "Invalid output.");
7118 }
7119
Douglas Katzman78b37b02015-11-17 20:28:07 +00007120 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007121 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7122 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7123 }
7124
7125 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007126 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007127 Args.AddAllArgs(CmdArgs,
7128 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7129 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007130
Teresa Johnson945bc502015-10-15 20:35:53 +00007131 if (D.isUsingLTO())
7132 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007133
7134 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7135
Douglas Katzman78b37b02015-11-17 20:28:07 +00007136 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007137 if (D.CCCIsCXX())
7138 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7139 CmdArgs.push_back("-lc");
7140 CmdArgs.push_back("-lcompiler_rt");
7141 }
7142
Douglas Katzman78b37b02015-11-17 20:28:07 +00007143 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007144 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7145
7146 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007147 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007148}
7149
Douglas Katzman95354292015-06-23 20:42:09 +00007150void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7151 const InputInfo &Output,
7152 const InputInfoList &Inputs,
7153 const ArgList &Args,
7154 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007155 ArgStringList CmdArgs;
7156
7157 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7158 const InputInfo &Input = Inputs[0];
7159
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007160 // Determine the original source input.
7161 const Action *SourceAction = &JA;
7162 while (SourceAction->getKind() != Action::InputClass) {
7163 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7164 SourceAction = SourceAction->getInputs()[0];
7165 }
7166
Eric Christopherf5a8f492015-12-08 00:10:10 +00007167 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007168 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007169 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7170 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007171 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007172 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007173 const llvm::Triple &T(getToolChain().getTriple());
7174 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007175 CmdArgs.push_back("-Q");
7176 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007177
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007178 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007179 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007180 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007181 if (Args.hasArg(options::OPT_gstabs))
7182 CmdArgs.push_back("--gstabs");
7183 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007184 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007185 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007186
Daniel Dunbarbe220842009-03-20 16:06:39 +00007187 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007188 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007189
Daniel Dunbar6d484762010-07-22 01:47:22 +00007190 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007191 if (getToolChain().getArch() == llvm::Triple::x86 ||
7192 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007193 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7194 CmdArgs.push_back("-force_cpusubtype_ALL");
7195
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007196 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007197 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007198 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007199 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007200 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007201 CmdArgs.push_back("-static");
7202
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007203 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007204
7205 assert(Output.isFilename() && "Unexpected lipo output.");
7206 CmdArgs.push_back("-o");
7207 CmdArgs.push_back(Output.getFilename());
7208
Daniel Dunbarb440f562010-08-02 02:38:21 +00007209 assert(Input.isFilename() && "Invalid input.");
7210 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007211
7212 // asm_final spec is empty.
7213
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007214 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007215 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007216}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007217
Tim Northover157d9112014-01-16 08:48:16 +00007218void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007219
Tim Northover157d9112014-01-16 08:48:16 +00007220void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7221 ArgStringList &CmdArgs) const {
7222 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007223
Daniel Dunbarc1964212009-03-26 16:23:12 +00007224 // Derived from darwin_arch spec.
7225 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007226 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007227
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007228 // FIXME: Is this needed anymore?
7229 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007230 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007231}
7232
Douglas Katzman95354292015-06-23 20:42:09 +00007233bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007234 // We only need to generate a temp path for LTO if we aren't compiling object
7235 // files. When compiling source files, we run 'dsymutil' after linking. We
7236 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007237 for (const auto &Input : Inputs)
7238 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007239 return true;
7240
7241 return false;
7242}
7243
Douglas Katzman95354292015-06-23 20:42:09 +00007244void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7245 ArgStringList &CmdArgs,
7246 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007247 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007248 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007249
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007250 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007251 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7252 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007253 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7254 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007255 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007256 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007257 }
7258
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007259 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007260 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007261 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7262 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007263
Bob Wilson3d27dad2013-08-02 22:25:34 +00007264 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7265 CmdArgs.push_back("-export_dynamic");
7266
Bob Wilsonb111ec92015-03-02 19:01:14 +00007267 // If we are using App Extension restrictions, pass a flag to the linker
7268 // telling it that the compiled code has been audited.
7269 if (Args.hasFlag(options::OPT_fapplication_extension,
7270 options::OPT_fno_application_extension, false))
7271 CmdArgs.push_back("-application_extension");
7272
Teresa Johnson945bc502015-10-15 20:35:53 +00007273 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007274 // If we are using LTO, then automatically create a temporary file path for
7275 // the linker to use, so that it's lifetime will extend past a possible
7276 // dsymutil step.
7277 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7278 const char *TmpPath = C.getArgs().MakeArgString(
7279 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7280 C.addTempFile(TmpPath);
7281 CmdArgs.push_back("-object_path_lto");
7282 CmdArgs.push_back(TmpPath);
7283 }
7284
7285 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7286 // it in clang installed libraries. If not found, the option is not used
7287 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7288 if (Version[0] >= 133) {
7289 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7290 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7291 SmallString<128> LibLTOPath(P);
7292 llvm::sys::path::append(LibLTOPath, "lib");
7293 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7294 if (llvm::sys::fs::exists(LibLTOPath)) {
7295 CmdArgs.push_back("-lto_library");
7296 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7297 } else {
7298 D.Diag(diag::warn_drv_lto_libpath);
7299 }
7300 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007301 }
7302
Daniel Dunbarc1964212009-03-26 16:23:12 +00007303 // Derived from the "link" spec.
7304 Args.AddAllArgs(CmdArgs, options::OPT_static);
7305 if (!Args.hasArg(options::OPT_static))
7306 CmdArgs.push_back("-dynamic");
7307 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7308 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7309 // here. How do we wish to handle such things?
7310 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007311
Daniel Dunbarc1964212009-03-26 16:23:12 +00007312 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007313 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007314 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007315 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007316
7317 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7318 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7319 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7320
7321 Arg *A;
7322 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7323 (A = Args.getLastArg(options::OPT_current__version)) ||
7324 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007325 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7326 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007327
7328 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7329 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7330 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7331 } else {
7332 CmdArgs.push_back("-dylib");
7333
7334 Arg *A;
7335 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7336 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7337 (A = Args.getLastArg(options::OPT_client__name)) ||
7338 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7339 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7340 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007341 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7342 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007343
Daniel Dunbarc1964212009-03-26 16:23:12 +00007344 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7345 "-dylib_compatibility_version");
7346 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7347 "-dylib_current_version");
7348
Tim Northover157d9112014-01-16 08:48:16 +00007349 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007350
7351 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7352 "-dylib_install_name");
7353 }
7354
7355 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7356 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7357 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007358 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007359 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007360 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7361 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7362 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7363 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7364 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7365 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007366 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007367 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7368 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7369 Args.AddAllArgs(CmdArgs, options::OPT_init);
7370
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007371 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007372 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007373
Daniel Dunbarc1964212009-03-26 16:23:12 +00007374 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7375 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7376 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7377 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7378 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007379
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007380 if (const Arg *A =
7381 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7382 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007383 if (A->getOption().matches(options::OPT_fpie) ||
7384 A->getOption().matches(options::OPT_fPIE))
7385 CmdArgs.push_back("-pie");
7386 else
7387 CmdArgs.push_back("-no_pie");
7388 }
Steven Wu574b0f22016-03-01 01:07:58 +00007389 // for embed-bitcode, use -bitcode_bundle in linker command
7390 if (C.getDriver().embedBitcodeEnabled() ||
7391 C.getDriver().embedBitcodeMarkerOnly()) {
7392 // Check if the toolchain supports bitcode build flow.
7393 if (MachOTC.SupportsEmbeddedBitcode())
7394 CmdArgs.push_back("-bitcode_bundle");
7395 else
7396 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7397 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007398
7399 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7400 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7401 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7402 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7403 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7404 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7405 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7406 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7407 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7408 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7409 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7410 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7411 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7412 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7413 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7414 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007415
Daniel Dunbar84384642011-05-02 21:03:47 +00007416 // Give --sysroot= preference, over the Apple specific behavior to also use
7417 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007418 StringRef sysroot = C.getSysRoot();
7419 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007420 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007421 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007422 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7423 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007424 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007425 }
7426
Daniel Dunbarc1964212009-03-26 16:23:12 +00007427 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7428 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7429 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7430 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7431 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007432 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007433 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7434 Args.AddAllArgs(CmdArgs, options::OPT_y);
7435 Args.AddLastArg(CmdArgs, options::OPT_w);
7436 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7437 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7438 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7439 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7440 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7441 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7442 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7443 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7444 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7445 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7446 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7447 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7448}
7449
Douglas Katzman95354292015-06-23 20:42:09 +00007450void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7451 const InputInfo &Output,
7452 const InputInfoList &Inputs,
7453 const ArgList &Args,
7454 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007455 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007456
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007457 // If the number of arguments surpasses the system limits, we will encode the
7458 // input files in a separate file, shortening the command line. To this end,
7459 // build a list of input file names that can be passed via a file with the
7460 // -filelist linker option.
7461 llvm::opt::ArgStringList InputFileList;
7462
Daniel Dunbarc1964212009-03-26 16:23:12 +00007463 // The logic here is derived from gcc's behavior; most of which
7464 // comes from specs (starting with link_command). Consult gcc for
7465 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007466 ArgStringList CmdArgs;
7467
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007468 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7469 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7470 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007471 for (const auto &Arg : Args)
7472 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007473 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007474 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007475 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007476 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007477 return;
7478 }
7479
Daniel Dunbarc1964212009-03-26 16:23:12 +00007480 // I'm not sure why this particular decomposition exists in gcc, but
7481 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007482 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007483
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007484 // It seems that the 'e' option is completely ignored for dynamic executables
7485 // (the default), and with static executables, the last one wins, as expected.
7486 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7487 options::OPT_Z_Flag, options::OPT_u_Group,
7488 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007489
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007490 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7491 // members of static archive libraries which implement Objective-C classes or
7492 // categories.
7493 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7494 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007495
Daniel Dunbarc1964212009-03-26 16:23:12 +00007496 CmdArgs.push_back("-o");
7497 CmdArgs.push_back(Output.getFilename());
7498
Douglas Katzman78b37b02015-11-17 20:28:07 +00007499 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007500 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007501
Peter Collingbournec4122c12015-06-15 21:08:13 +00007502 // SafeStack requires its own runtime libraries
7503 // These libraries should be linked first, to make sure the
7504 // __safestack_init constructor executes before everything else
7505 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7506 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7507 "libclang_rt.safestack_osx.a",
7508 /*AlwaysLink=*/true);
7509 }
7510
Daniel Dunbarc1964212009-03-26 16:23:12 +00007511 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007512
Douglas Gregor9295df02012-05-15 21:00:27 +00007513 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007514 // Build the input file for -filelist (list of linker input files) in case we
7515 // need it later
7516 for (const auto &II : Inputs) {
7517 if (!II.isFilename()) {
7518 // This is a linker input argument.
7519 // We cannot mix input arguments and file names in a -filelist input, thus
7520 // we prematurely stop our list (remaining files shall be passed as
7521 // arguments).
7522 if (InputFileList.size() > 0)
7523 break;
7524
7525 continue;
7526 }
7527
7528 InputFileList.push_back(II.getFilename());
7529 }
7530
Douglas Katzman78b37b02015-11-17 20:28:07 +00007531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007532 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7533
Douglas Katzman78b37b02015-11-17 20:28:07 +00007534 if (isObjCRuntimeLinked(Args) &&
7535 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007536 // We use arclite library for both ARC and subscripting support.
7537 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7538
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007539 CmdArgs.push_back("-framework");
7540 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007541 // Link libobj.
7542 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007543 }
John McCall31168b02011-06-15 23:02:42 +00007544
Daniel Dunbarc1964212009-03-26 16:23:12 +00007545 if (LinkingOutput) {
7546 CmdArgs.push_back("-arch_multiple");
7547 CmdArgs.push_back("-final_output");
7548 CmdArgs.push_back(LinkingOutput);
7549 }
7550
Daniel Dunbarc1964212009-03-26 16:23:12 +00007551 if (Args.hasArg(options::OPT_fnested_functions))
7552 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007553
Justin Bognerc7701242015-05-12 05:44:36 +00007554 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7555
Douglas Katzman78b37b02015-11-17 20:28:07 +00007556 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007557 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007558 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007559
Daniel Dunbarc1964212009-03-26 16:23:12 +00007560 // link_ssp spec is empty.
7561
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007562 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007563 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007564 }
7565
Douglas Katzman78b37b02015-11-17 20:28:07 +00007566 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007567 // endfile_spec is empty.
7568 }
7569
7570 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7571 Args.AddAllArgs(CmdArgs, options::OPT_F);
7572
Steven Wu3ffb61b2015-02-06 18:08:29 +00007573 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007574 for (const Arg *A : Args.filtered(options::OPT_iframework))
7575 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007576
Douglas Katzman78b37b02015-11-17 20:28:07 +00007577 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007578 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7579 if (A->getValue() == StringRef("Accelerate")) {
7580 CmdArgs.push_back("-framework");
7581 CmdArgs.push_back("Accelerate");
7582 }
7583 }
7584 }
7585
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007586 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007587 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007588 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007589 Cmd->setInputFileList(std::move(InputFileList));
7590 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007591}
7592
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007593void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007594 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007595 const InputInfoList &Inputs,
7596 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007597 const char *LinkingOutput) const {
7598 ArgStringList CmdArgs;
7599
7600 CmdArgs.push_back("-create");
7601 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007602
7603 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007604 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007605
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007606 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007607 assert(II.isFilename() && "Unexpected lipo input.");
7608 CmdArgs.push_back(II.getFilename());
7609 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007610
7611 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007612 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007613}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007614
Daniel Dunbar88299622010-06-04 18:28:36 +00007615void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007616 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007617 const InputInfoList &Inputs,
7618 const ArgList &Args,
7619 const char *LinkingOutput) const {
7620 ArgStringList CmdArgs;
7621
Daniel Dunbareb86b042011-05-09 17:23:16 +00007622 CmdArgs.push_back("-o");
7623 CmdArgs.push_back(Output.getFilename());
7624
Daniel Dunbar88299622010-06-04 18:28:36 +00007625 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7626 const InputInfo &Input = Inputs[0];
7627 assert(Input.isFilename() && "Unexpected dsymutil input.");
7628 CmdArgs.push_back(Input.getFilename());
7629
Daniel Dunbar88299622010-06-04 18:28:36 +00007630 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007631 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007632 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007633}
7634
Eric Christopher551ef452011-08-23 17:56:55 +00007635void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007636 const InputInfo &Output,
7637 const InputInfoList &Inputs,
7638 const ArgList &Args,
7639 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007640 ArgStringList CmdArgs;
7641 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007642 CmdArgs.push_back("--debug-info");
7643 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007644 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007645
7646 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7647 const InputInfo &Input = Inputs[0];
7648 assert(Input.isFilename() && "Unexpected verify input");
7649
7650 // Grabbing the output of the earlier dsymutil run.
7651 CmdArgs.push_back(Input.getFilename());
7652
7653 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007654 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007655 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007656}
7657
Douglas Katzman95354292015-06-23 20:42:09 +00007658void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007659 const InputInfo &Output,
7660 const InputInfoList &Inputs,
7661 const ArgList &Args,
7662 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007663 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007664 ArgStringList CmdArgs;
7665
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007666 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007667
7668 CmdArgs.push_back("-o");
7669 CmdArgs.push_back(Output.getFilename());
7670
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007671 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007672 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007673
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007674 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007675 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007676}
7677
Douglas Katzman95354292015-06-23 20:42:09 +00007678void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7679 const InputInfo &Output,
7680 const InputInfoList &Inputs,
7681 const ArgList &Args,
7682 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007683 ArgStringList CmdArgs;
7684
David Chisnall272a0712012-02-29 15:06:12 +00007685 // Demangle C++ names in errors
7686 CmdArgs.push_back("-C");
7687
Douglas Katzman78b37b02015-11-17 20:28:07 +00007688 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007689 CmdArgs.push_back("-e");
7690 CmdArgs.push_back("_start");
7691 }
7692
7693 if (Args.hasArg(options::OPT_static)) {
7694 CmdArgs.push_back("-Bstatic");
7695 CmdArgs.push_back("-dn");
7696 } else {
7697 CmdArgs.push_back("-Bdynamic");
7698 if (Args.hasArg(options::OPT_shared)) {
7699 CmdArgs.push_back("-shared");
7700 } else {
7701 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007702 CmdArgs.push_back(
7703 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007704 }
7705 }
7706
7707 if (Output.isFilename()) {
7708 CmdArgs.push_back("-o");
7709 CmdArgs.push_back(Output.getFilename());
7710 } else {
7711 assert(Output.isNothing() && "Invalid output.");
7712 }
7713
Douglas Katzman78b37b02015-11-17 20:28:07 +00007714 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007715 if (!Args.hasArg(options::OPT_shared))
7716 CmdArgs.push_back(
7717 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7718
7719 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7720 CmdArgs.push_back(
7721 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7722 CmdArgs.push_back(
7723 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007724 }
7725
Douglas Katzman6059ef92015-11-17 17:41:23 +00007726 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007727
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007728 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7729 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007730
7731 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7732
Douglas Katzman78b37b02015-11-17 20:28:07 +00007733 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007734 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007735 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007736 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007737 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007738 if (!Args.hasArg(options::OPT_shared)) {
7739 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007740 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007741 }
David Chisnallf571cde2012-02-15 13:39:01 +00007742 }
7743
Douglas Katzman78b37b02015-11-17 20:28:07 +00007744 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007745 CmdArgs.push_back(
7746 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007747 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007748 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007749
Xinliang David Li69306c02015-10-22 06:15:31 +00007750 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007752 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007753 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007754}
7755
Douglas Katzman95354292015-06-23 20:42:09 +00007756void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7757 const InputInfo &Output,
7758 const InputInfoList &Inputs,
7759 const ArgList &Args,
7760 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007761 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007762 ArgStringList CmdArgs;
7763
Rafael Espindolacc126272014-02-28 01:55:21 +00007764 switch (getToolChain().getArch()) {
7765 case llvm::Triple::x86:
7766 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7767 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007768 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007769 break;
7770
7771 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007772 CmdArgs.push_back("-mppc");
7773 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007774 break;
7775
7776 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007777 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007778 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007779 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7780 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7781 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007782 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007783 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007784
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007785 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007786 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007787 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7788 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7789 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007790 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007791 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007792
7793 case llvm::Triple::mips64:
7794 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007795 StringRef CPUName;
7796 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007797 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007798
7799 CmdArgs.push_back("-mabi");
7800 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7801
7802 if (getToolChain().getArch() == llvm::Triple::mips64)
7803 CmdArgs.push_back("-EB");
7804 else
7805 CmdArgs.push_back("-EL");
7806
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007807 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007808 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007809 }
7810
Rafael Espindolacc126272014-02-28 01:55:21 +00007811 default:
7812 break;
7813 }
7814
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007815 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007816
7817 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007818 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007820 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007821 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007822
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007823 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007824 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007825}
7826
Douglas Katzman95354292015-06-23 20:42:09 +00007827void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7828 const InputInfo &Output,
7829 const InputInfoList &Inputs,
7830 const ArgList &Args,
7831 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007832 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007833 ArgStringList CmdArgs;
7834
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007835 // Silence warning for "clang -g foo.o -o foo"
7836 Args.ClaimAllArgs(options::OPT_g_Group);
7837 // and "clang -emit-llvm foo.o -o foo"
7838 Args.ClaimAllArgs(options::OPT_emit_llvm);
7839 // and for "clang -w foo.o -o foo". Other warning options are already
7840 // handled somewhere else.
7841 Args.ClaimAllArgs(options::OPT_w);
7842
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007843 if (getToolChain().getArch() == llvm::Triple::mips64)
7844 CmdArgs.push_back("-EB");
7845 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7846 CmdArgs.push_back("-EL");
7847
Douglas Katzman78b37b02015-11-17 20:28:07 +00007848 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007849 CmdArgs.push_back("-e");
7850 CmdArgs.push_back("__start");
7851 }
7852
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007853 if (Args.hasArg(options::OPT_static)) {
7854 CmdArgs.push_back("-Bstatic");
7855 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007856 if (Args.hasArg(options::OPT_rdynamic))
7857 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007858 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007859 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007860 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007861 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007862 } else {
7863 CmdArgs.push_back("-dynamic-linker");
7864 CmdArgs.push_back("/usr/libexec/ld.so");
7865 }
7866 }
7867
Rafael Espindola044f7832013-06-05 04:28:55 +00007868 if (Args.hasArg(options::OPT_nopie))
7869 CmdArgs.push_back("-nopie");
7870
Daniel Dunbarb440f562010-08-02 02:38:21 +00007871 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007872 CmdArgs.push_back("-o");
7873 CmdArgs.push_back(Output.getFilename());
7874 } else {
7875 assert(Output.isNothing() && "Invalid output.");
7876 }
7877
Douglas Katzman78b37b02015-11-17 20:28:07 +00007878 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007879 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007880 if (Args.hasArg(options::OPT_pg))
7881 CmdArgs.push_back(
7882 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007883 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007884 CmdArgs.push_back(
7885 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7886 CmdArgs.push_back(
7887 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007888 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007889 CmdArgs.push_back(
7890 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007891 }
7892 }
7893
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007894 std::string Triple = getToolChain().getTripleString();
7895 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007896 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007897 CmdArgs.push_back(
7898 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007899
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007900 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7901 options::OPT_e, options::OPT_s, options::OPT_t,
7902 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903
Daniel Dunbar54423b22010-09-17 00:24:54 +00007904 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007905
Douglas Katzman78b37b02015-11-17 20:28:07 +00007906 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007907 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007908 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007909 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007910 CmdArgs.push_back("-lm_p");
7911 else
7912 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007913 }
7914
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007915 // FIXME: For some reason GCC passes -lgcc before adding
7916 // the default system libraries. Just mimic this for now.
7917 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007918
Eric Christopher17674ec2012-09-13 06:32:34 +00007919 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007920 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7921 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007922 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007923 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007924 }
7925
Chandler Carruth45661652011-12-17 22:32:42 +00007926 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007927 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007928 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007929 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007930 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007931 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007932
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007933 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007934 }
7935
Douglas Katzman78b37b02015-11-17 20:28:07 +00007936 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007937 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007938 CmdArgs.push_back(
7939 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007940 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007941 CmdArgs.push_back(
7942 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007943 }
7944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007945 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007946 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007947}
Ed Schoutene33194b2009-04-02 19:13:12 +00007948
Douglas Katzman95354292015-06-23 20:42:09 +00007949void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7950 const InputInfo &Output,
7951 const InputInfoList &Inputs,
7952 const ArgList &Args,
7953 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007954 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007955 ArgStringList CmdArgs;
7956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007957 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007958
7959 CmdArgs.push_back("-o");
7960 CmdArgs.push_back(Output.getFilename());
7961
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007962 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007963 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007964
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007965 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007966 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007967}
7968
Douglas Katzman95354292015-06-23 20:42:09 +00007969void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7970 const InputInfo &Output,
7971 const InputInfoList &Inputs,
7972 const ArgList &Args,
7973 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007974 const Driver &D = getToolChain().getDriver();
7975 ArgStringList CmdArgs;
7976
Douglas Katzman78b37b02015-11-17 20:28:07 +00007977 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007978 CmdArgs.push_back("-e");
7979 CmdArgs.push_back("__start");
7980 }
7981
7982 if (Args.hasArg(options::OPT_static)) {
7983 CmdArgs.push_back("-Bstatic");
7984 } else {
7985 if (Args.hasArg(options::OPT_rdynamic))
7986 CmdArgs.push_back("-export-dynamic");
7987 CmdArgs.push_back("--eh-frame-hdr");
7988 CmdArgs.push_back("-Bdynamic");
7989 if (Args.hasArg(options::OPT_shared)) {
7990 CmdArgs.push_back("-shared");
7991 } else {
7992 CmdArgs.push_back("-dynamic-linker");
7993 CmdArgs.push_back("/usr/libexec/ld.so");
7994 }
7995 }
7996
7997 if (Output.isFilename()) {
7998 CmdArgs.push_back("-o");
7999 CmdArgs.push_back(Output.getFilename());
8000 } else {
8001 assert(Output.isNothing() && "Invalid output.");
8002 }
8003
Douglas Katzman78b37b02015-11-17 20:28:07 +00008004 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008005 if (!Args.hasArg(options::OPT_shared)) {
8006 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008007 CmdArgs.push_back(
8008 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008009 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008010 CmdArgs.push_back(
8011 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8012 CmdArgs.push_back(
8013 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008014 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008015 CmdArgs.push_back(
8016 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008017 }
8018 }
8019
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008020 Args.AddAllArgs(CmdArgs,
8021 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008022
8023 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8024
Douglas Katzman78b37b02015-11-17 20:28:07 +00008025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008026 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008027 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8028 if (Args.hasArg(options::OPT_pg))
8029 CmdArgs.push_back("-lm_p");
8030 else
8031 CmdArgs.push_back("-lm");
8032 }
8033
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008034 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008035 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008036 CmdArgs.push_back("-lpthread_p");
8037 else
8038 CmdArgs.push_back("-lpthread");
8039 }
8040
Eli Friedman9fa28852012-08-08 23:57:20 +00008041 if (!Args.hasArg(options::OPT_shared)) {
8042 if (Args.hasArg(options::OPT_pg))
8043 CmdArgs.push_back("-lc_p");
8044 else
8045 CmdArgs.push_back("-lc");
8046 }
8047
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008048 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008049 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008050 case llvm::Triple::arm:
8051 MyArch = "arm";
8052 break;
8053 case llvm::Triple::x86:
8054 MyArch = "i386";
8055 break;
8056 case llvm::Triple::x86_64:
8057 MyArch = "amd64";
8058 break;
8059 default:
8060 llvm_unreachable("Unsupported architecture");
8061 }
8062 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008063 }
8064
Douglas Katzman78b37b02015-11-17 20:28:07 +00008065 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008066 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008067 CmdArgs.push_back(
8068 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008069 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008070 CmdArgs.push_back(
8071 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008072 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008074 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008075 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008076}
8077
Douglas Katzman95354292015-06-23 20:42:09 +00008078void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8079 const InputInfo &Output,
8080 const InputInfoList &Inputs,
8081 const ArgList &Args,
8082 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008083 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008084 ArgStringList CmdArgs;
8085
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008086 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8087 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008088 switch (getToolChain().getArch()) {
8089 default:
8090 break;
8091 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008092 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008093 break;
8094 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008095 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008096 break;
8097 case llvm::Triple::mips:
8098 case llvm::Triple::mipsel:
8099 case llvm::Triple::mips64:
8100 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008101 StringRef CPUName;
8102 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008103 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008104
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008105 CmdArgs.push_back("-march");
8106 CmdArgs.push_back(CPUName.data());
8107
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008108 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008109 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008110
8111 if (getToolChain().getArch() == llvm::Triple::mips ||
8112 getToolChain().getArch() == llvm::Triple::mips64)
8113 CmdArgs.push_back("-EB");
8114 else
8115 CmdArgs.push_back("-EL");
8116
Dimitry Andric46f338c2015-12-27 10:36:44 +00008117 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8118 StringRef v = A->getValue();
8119 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8120 A->claim();
8121 }
8122
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008123 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008124 break;
8125 }
8126 case llvm::Triple::arm:
8127 case llvm::Triple::armeb:
8128 case llvm::Triple::thumb:
8129 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008130 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008131
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008132 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008133 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008134 else
Renato Golinf4421f72014-02-19 10:44:07 +00008135 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008137 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008138 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008139 case llvm::Triple::GNUEABI:
8140 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008141 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008142 break;
8143
8144 default:
8145 CmdArgs.push_back("-matpcs");
8146 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008147 break;
8148 }
8149 case llvm::Triple::sparc:
8150 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008151 case llvm::Triple::sparcv9: {
8152 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8153 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008154 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008155 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008156 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008157 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008158
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008159 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008160
8161 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008162 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008163
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008164 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008165 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008166
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008167 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008168 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008169}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008170
Douglas Katzman95354292015-06-23 20:42:09 +00008171void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8172 const InputInfo &Output,
8173 const InputInfoList &Inputs,
8174 const ArgList &Args,
8175 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008176 const toolchains::FreeBSD &ToolChain =
8177 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008178 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008179 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008180 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008181 !Args.hasArg(options::OPT_shared) &&
8182 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008183 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008184
8185 // Silence warning for "clang -g foo.o -o foo"
8186 Args.ClaimAllArgs(options::OPT_g_Group);
8187 // and "clang -emit-llvm foo.o -o foo"
8188 Args.ClaimAllArgs(options::OPT_emit_llvm);
8189 // and for "clang -w foo.o -o foo". Other warning options are already
8190 // handled somewhere else.
8191 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008192
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008193 if (!D.SysRoot.empty())
8194 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8195
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008196 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008197 CmdArgs.push_back("-pie");
8198
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008199 if (Args.hasArg(options::OPT_static)) {
8200 CmdArgs.push_back("-Bstatic");
8201 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008202 if (Args.hasArg(options::OPT_rdynamic))
8203 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008204 CmdArgs.push_back("--eh-frame-hdr");
8205 if (Args.hasArg(options::OPT_shared)) {
8206 CmdArgs.push_back("-Bshareable");
8207 } else {
8208 CmdArgs.push_back("-dynamic-linker");
8209 CmdArgs.push_back("/libexec/ld-elf.so.1");
8210 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008211 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008212 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8213 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8214 CmdArgs.push_back("--hash-style=both");
8215 }
8216 }
8217 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008218 }
8219
8220 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8221 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008222 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008223 CmdArgs.push_back("-m");
8224 CmdArgs.push_back("elf_i386_fbsd");
8225 }
8226
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008227 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008228 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008229 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008230 }
8231
Dimitry Andric904895f2015-12-27 06:47:09 +00008232 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8233 if (ToolChain.getArch() == llvm::Triple::mips ||
8234 ToolChain.getArch() == llvm::Triple::mipsel ||
8235 ToolChain.getArch() == llvm::Triple::mips64 ||
8236 ToolChain.getArch() == llvm::Triple::mips64el) {
8237 StringRef v = A->getValue();
8238 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8239 A->claim();
8240 }
8241 }
8242
Daniel Dunbarb440f562010-08-02 02:38:21 +00008243 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244 CmdArgs.push_back("-o");
8245 CmdArgs.push_back(Output.getFilename());
8246 } else {
8247 assert(Output.isNothing() && "Invalid output.");
8248 }
8249
Douglas Katzman78b37b02015-11-17 20:28:07 +00008250 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008251 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008252 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008253 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008254 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008255 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008256 crt1 = "Scrt1.o";
8257 else
8258 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008259 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008260 if (crt1)
8261 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8262
8263 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8264
Craig Topper92fc2df2014-05-17 16:56:41 +00008265 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008266 if (Args.hasArg(options::OPT_static))
8267 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008268 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008269 crtbegin = "crtbeginS.o";
8270 else
8271 crtbegin = "crtbegin.o";
8272
8273 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008274 }
8275
8276 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008277 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008278 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8279 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008280 Args.AddAllArgs(CmdArgs, options::OPT_s);
8281 Args.AddAllArgs(CmdArgs, options::OPT_t);
8282 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8283 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008284
Teresa Johnson945bc502015-10-15 20:35:53 +00008285 if (D.isUsingLTO())
8286 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008287
Alexey Samsonov52550342014-09-15 19:58:40 +00008288 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008289 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008290
Douglas Katzman78b37b02015-11-17 20:28:07 +00008291 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008292 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008293 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008294 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008295 if (Args.hasArg(options::OPT_pg))
8296 CmdArgs.push_back("-lm_p");
8297 else
8298 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008299 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008300 if (NeedsSanitizerDeps)
8301 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008302 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8303 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008304 if (Args.hasArg(options::OPT_pg))
8305 CmdArgs.push_back("-lgcc_p");
8306 else
8307 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008308 if (Args.hasArg(options::OPT_static)) {
8309 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008310 } else if (Args.hasArg(options::OPT_pg)) {
8311 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008312 } else {
8313 CmdArgs.push_back("--as-needed");
8314 CmdArgs.push_back("-lgcc_s");
8315 CmdArgs.push_back("--no-as-needed");
8316 }
8317
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008318 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008319 if (Args.hasArg(options::OPT_pg))
8320 CmdArgs.push_back("-lpthread_p");
8321 else
8322 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008323 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008324
Roman Divacky66f22762011-02-10 16:59:40 +00008325 if (Args.hasArg(options::OPT_pg)) {
8326 if (Args.hasArg(options::OPT_shared))
8327 CmdArgs.push_back("-lc");
8328 else
8329 CmdArgs.push_back("-lc_p");
8330 CmdArgs.push_back("-lgcc_p");
8331 } else {
8332 CmdArgs.push_back("-lc");
8333 CmdArgs.push_back("-lgcc");
8334 }
8335
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008336 if (Args.hasArg(options::OPT_static)) {
8337 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008338 } else if (Args.hasArg(options::OPT_pg)) {
8339 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008340 } else {
8341 CmdArgs.push_back("--as-needed");
8342 CmdArgs.push_back("-lgcc_s");
8343 CmdArgs.push_back("--no-as-needed");
8344 }
8345 }
8346
Douglas Katzman78b37b02015-11-17 20:28:07 +00008347 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008348 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008349 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008350 else
8351 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008352 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008353 }
8354
Xinliang David Li69306c02015-10-22 06:15:31 +00008355 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008356
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008357 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008358 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008359}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008360
Douglas Katzman95354292015-06-23 20:42:09 +00008361void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008362 const InputInfo &Output,
8363 const InputInfoList &Inputs,
8364 const ArgList &Args,
8365 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008366 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008367 ArgStringList CmdArgs;
8368
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008369 // GNU as needs different flags for creating the correct output format
8370 // on architectures with different ABIs or optional feature sets.
8371 switch (getToolChain().getArch()) {
8372 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008373 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008374 break;
8375 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008376 case llvm::Triple::armeb:
8377 case llvm::Triple::thumb:
8378 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008379 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008380 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8381 std::string Arch =
8382 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008383 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008384 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008385 }
8386
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008387 case llvm::Triple::mips:
8388 case llvm::Triple::mipsel:
8389 case llvm::Triple::mips64:
8390 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008391 StringRef CPUName;
8392 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008393 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008394
8395 CmdArgs.push_back("-march");
8396 CmdArgs.push_back(CPUName.data());
8397
8398 CmdArgs.push_back("-mabi");
8399 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8400
8401 if (getToolChain().getArch() == llvm::Triple::mips ||
8402 getToolChain().getArch() == llvm::Triple::mips64)
8403 CmdArgs.push_back("-EB");
8404 else
8405 CmdArgs.push_back("-EL");
8406
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008407 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008408 break;
8409 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008410
8411 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008412 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008413 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008414 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8415 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008416 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008417 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008418 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008419
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008420 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008421 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008422 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8423 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008424 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008425 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008426 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008427
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008428 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008429 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008430 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008431
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008432 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008433
8434 CmdArgs.push_back("-o");
8435 CmdArgs.push_back(Output.getFilename());
8436
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008437 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008438 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008439
David Chisnallddbd68f2011-09-27 22:03:18 +00008440 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008441 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008442}
8443
Douglas Katzman95354292015-06-23 20:42:09 +00008444void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8445 const InputInfo &Output,
8446 const InputInfoList &Inputs,
8447 const ArgList &Args,
8448 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008449 const Driver &D = getToolChain().getDriver();
8450 ArgStringList CmdArgs;
8451
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008452 if (!D.SysRoot.empty())
8453 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8454
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008455 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008456 if (Args.hasArg(options::OPT_static)) {
8457 CmdArgs.push_back("-Bstatic");
8458 } else {
8459 if (Args.hasArg(options::OPT_rdynamic))
8460 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008461 if (Args.hasArg(options::OPT_shared)) {
8462 CmdArgs.push_back("-Bshareable");
8463 } else {
8464 CmdArgs.push_back("-dynamic-linker");
8465 CmdArgs.push_back("/libexec/ld.elf_so");
8466 }
8467 }
8468
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008469 // Many NetBSD architectures support more than one ABI.
8470 // Determine the correct emulation for ld.
8471 switch (getToolChain().getArch()) {
8472 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008473 CmdArgs.push_back("-m");
8474 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008475 break;
8476 case llvm::Triple::arm:
8477 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008478 CmdArgs.push_back("-m");
8479 switch (getToolChain().getTriple().getEnvironment()) {
8480 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008481 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008482 CmdArgs.push_back("armelf_nbsd_eabi");
8483 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008484 case llvm::Triple::EABIHF:
8485 case llvm::Triple::GNUEABIHF:
8486 CmdArgs.push_back("armelf_nbsd_eabihf");
8487 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008488 default:
8489 CmdArgs.push_back("armelf_nbsd");
8490 break;
8491 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008492 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008493 case llvm::Triple::armeb:
8494 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008495 arm::appendEBLinkFlags(
8496 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008497 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008498 CmdArgs.push_back("-m");
8499 switch (getToolChain().getTriple().getEnvironment()) {
8500 case llvm::Triple::EABI:
8501 case llvm::Triple::GNUEABI:
8502 CmdArgs.push_back("armelfb_nbsd_eabi");
8503 break;
8504 case llvm::Triple::EABIHF:
8505 case llvm::Triple::GNUEABIHF:
8506 CmdArgs.push_back("armelfb_nbsd_eabihf");
8507 break;
8508 default:
8509 CmdArgs.push_back("armelfb_nbsd");
8510 break;
8511 }
8512 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008513 case llvm::Triple::mips64:
8514 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008515 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008516 CmdArgs.push_back("-m");
8517 if (getToolChain().getArch() == llvm::Triple::mips64)
8518 CmdArgs.push_back("elf32btsmip");
8519 else
8520 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008521 } else if (mips::hasMipsAbiArg(Args, "64")) {
8522 CmdArgs.push_back("-m");
8523 if (getToolChain().getArch() == llvm::Triple::mips64)
8524 CmdArgs.push_back("elf64btsmip");
8525 else
8526 CmdArgs.push_back("elf64ltsmip");
8527 }
8528 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008529 case llvm::Triple::ppc:
8530 CmdArgs.push_back("-m");
8531 CmdArgs.push_back("elf32ppc_nbsd");
8532 break;
8533
8534 case llvm::Triple::ppc64:
8535 case llvm::Triple::ppc64le:
8536 CmdArgs.push_back("-m");
8537 CmdArgs.push_back("elf64ppc");
8538 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008539
8540 case llvm::Triple::sparc:
8541 CmdArgs.push_back("-m");
8542 CmdArgs.push_back("elf32_sparc");
8543 break;
8544
8545 case llvm::Triple::sparcv9:
8546 CmdArgs.push_back("-m");
8547 CmdArgs.push_back("elf64_sparc");
8548 break;
8549
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008550 default:
8551 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008552 }
8553
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008554 if (Output.isFilename()) {
8555 CmdArgs.push_back("-o");
8556 CmdArgs.push_back(Output.getFilename());
8557 } else {
8558 assert(Output.isNothing() && "Invalid output.");
8559 }
8560
Douglas Katzman78b37b02015-11-17 20:28:07 +00008561 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008562 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008563 CmdArgs.push_back(
8564 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8565 CmdArgs.push_back(
8566 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8567 CmdArgs.push_back(
8568 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008569 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008570 CmdArgs.push_back(
8571 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8572 CmdArgs.push_back(
8573 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008574 }
8575 }
8576
8577 Args.AddAllArgs(CmdArgs, options::OPT_L);
8578 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8579 Args.AddAllArgs(CmdArgs, options::OPT_e);
8580 Args.AddAllArgs(CmdArgs, options::OPT_s);
8581 Args.AddAllArgs(CmdArgs, options::OPT_t);
8582 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8583 Args.AddAllArgs(CmdArgs, options::OPT_r);
8584
8585 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8586
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008587 unsigned Major, Minor, Micro;
8588 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8589 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008590 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008591 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008592 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008593 case llvm::Triple::arm:
8594 case llvm::Triple::armeb:
8595 case llvm::Triple::thumb:
8596 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008597 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008598 case llvm::Triple::ppc64:
8599 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008600 case llvm::Triple::sparc:
8601 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008602 case llvm::Triple::x86:
8603 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008604 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008605 break;
8606 default:
8607 break;
8608 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008609 }
8610
Douglas Katzman78b37b02015-11-17 20:28:07 +00008611 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008612 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008613 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008614 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8615 CmdArgs.push_back("-lm");
8616 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008617 if (Args.hasArg(options::OPT_pthread))
8618 CmdArgs.push_back("-lpthread");
8619 CmdArgs.push_back("-lc");
8620
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008621 if (useLibgcc) {
8622 if (Args.hasArg(options::OPT_static)) {
8623 // libgcc_eh depends on libc, so resolve as much as possible,
8624 // pull in any new requirements from libc and then get the rest
8625 // of libgcc.
8626 CmdArgs.push_back("-lgcc_eh");
8627 CmdArgs.push_back("-lc");
8628 CmdArgs.push_back("-lgcc");
8629 } else {
8630 CmdArgs.push_back("-lgcc");
8631 CmdArgs.push_back("--as-needed");
8632 CmdArgs.push_back("-lgcc_s");
8633 CmdArgs.push_back("--no-as-needed");
8634 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008635 }
8636 }
8637
Douglas Katzman78b37b02015-11-17 20:28:07 +00008638 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008639 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008640 CmdArgs.push_back(
8641 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008642 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008643 CmdArgs.push_back(
8644 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8645 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008646 }
8647
Xinliang David Li69306c02015-10-22 06:15:31 +00008648 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008649
Logan Chieneb9162f2014-06-26 14:23:45 +00008650 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008652}
8653
Douglas Katzman95354292015-06-23 20:42:09 +00008654void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8655 const InputInfo &Output,
8656 const InputInfoList &Inputs,
8657 const ArgList &Args,
8658 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008659 claimNoWarnArgs(Args);
8660
James Y Knight2db38f32015-08-15 03:45:25 +00008661 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8662 llvm::Triple Triple = llvm::Triple(TripleStr);
8663
Rafael Espindola92b00932010-08-10 00:25:48 +00008664 ArgStringList CmdArgs;
8665
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008666 llvm::Reloc::Model RelocationModel;
8667 unsigned PICLevel;
8668 bool IsPIE;
8669 std::tie(RelocationModel, PICLevel, IsPIE) =
8670 ParsePICArgs(getToolChain(), Triple, Args);
8671
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008672 switch (getToolChain().getArch()) {
8673 default:
8674 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008675 // Add --32/--64 to make sure we get the format we want.
8676 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008677 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008678 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008679 break;
8680 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008681 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8682 CmdArgs.push_back("--x32");
8683 else
8684 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008685 break;
8686 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008687 CmdArgs.push_back("-a32");
8688 CmdArgs.push_back("-mppc");
8689 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008690 break;
8691 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008692 CmdArgs.push_back("-a64");
8693 CmdArgs.push_back("-mppc64");
8694 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008695 break;
8696 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008697 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008698 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008699 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008700 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008701 break;
8702 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008703 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008704 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008705 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8706 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8707 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008708 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008709 }
8710 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008711 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008712 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8713 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8714 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008715 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008716 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008717 case llvm::Triple::arm:
8718 case llvm::Triple::armeb:
8719 case llvm::Triple::thumb:
8720 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008721 const llvm::Triple &Triple2 = getToolChain().getTriple();
8722 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008723 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008724 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008725 break;
8726 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008727 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008728 break;
8729 default:
8730 break;
8731 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008732
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008733 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008734 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8735 case arm::FloatABI::Soft:
8736 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8737 break;
8738 case arm::FloatABI::SoftFP:
8739 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8740 break;
8741 case arm::FloatABI::Hard:
8742 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8743 break;
8744 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008745
8746 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008747
8748 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008749 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008750 // march from being picked in the absence of a cpu flag.
8751 Arg *A;
8752 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008753 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008754 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008755 else
8756 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008757 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008758 break;
8759 }
8760 case llvm::Triple::mips:
8761 case llvm::Triple::mipsel:
8762 case llvm::Triple::mips64:
8763 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008764 StringRef CPUName;
8765 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008766 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008767 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008768
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008769 CmdArgs.push_back("-march");
8770 CmdArgs.push_back(CPUName.data());
8771
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008772 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008773 CmdArgs.push_back(ABIName.data());
8774
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008775 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8776 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008777 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008778 CmdArgs.push_back("-mno-shared");
8779
Daniel Sanders379d44b2014-07-16 11:52:23 +00008780 // LLVM doesn't support -mplt yet and acts as if it is always given.
8781 // However, -mplt has no effect with the N64 ABI.
8782 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008783
8784 if (getToolChain().getArch() == llvm::Triple::mips ||
8785 getToolChain().getArch() == llvm::Triple::mips64)
8786 CmdArgs.push_back("-EB");
8787 else
8788 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008789
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008790 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8791 if (StringRef(A->getValue()) == "2008")
8792 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8793 }
8794
Daniel Sanders379d44b2014-07-16 11:52:23 +00008795 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8796 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8797 options::OPT_mfp64)) {
8798 A->claim();
8799 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008800 } else if (mips::shouldUseFPXX(
8801 Args, getToolChain().getTriple(), CPUName, ABIName,
8802 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008803 CmdArgs.push_back("-mfpxx");
8804
8805 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8806 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008807 if (Arg *A =
8808 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008809 if (A->getOption().matches(options::OPT_mips16)) {
8810 A->claim();
8811 A->render(Args, CmdArgs);
8812 } else {
8813 A->claim();
8814 CmdArgs.push_back("-no-mips16");
8815 }
8816 }
8817
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008818 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8819 options::OPT_mno_micromips);
8820 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8821 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8822
Simon Atanasyanbd986632013-11-26 11:58:04 +00008823 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8824 // Do not use AddLastArg because not all versions of MIPS assembler
8825 // support -mmsa / -mno-msa options.
8826 if (A->getOption().matches(options::OPT_mmsa))
8827 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8828 }
8829
Daniel Sanders379d44b2014-07-16 11:52:23 +00008830 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8831 options::OPT_msoft_float);
8832
Toma Tabacub36d6102015-06-11 12:13:18 +00008833 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8834 options::OPT_msingle_float);
8835
Daniel Sanders379d44b2014-07-16 11:52:23 +00008836 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8837 options::OPT_mno_odd_spreg);
8838
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008839 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008840 break;
8841 }
8842 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008843 // Always pass an -march option, since our default of z10 is later
8844 // than the GNU assembler's default.
8845 StringRef CPUName = getSystemZTargetCPU(Args);
8846 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008847 break;
8848 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008849 }
8850
Renato Golina74bbc72015-07-22 15:32:36 +00008851 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008852 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008853
8854 CmdArgs.push_back("-o");
8855 CmdArgs.push_back(Output.getFilename());
8856
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008857 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008858 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008859
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008860 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008861 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008862
8863 // Handle the debug info splitting at object creation time if we're
8864 // creating an object.
8865 // TODO: Currently only works on linux with newer objcopy.
8866 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008867 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008868 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008869 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008870}
8871
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008872static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008873 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008874 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008875 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008876 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8877 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008878 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008879 CmdArgs.push_back("-lgcc");
8880
Logan Chien3d3373c2012-11-19 12:04:11 +00008881 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008882 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008883 CmdArgs.push_back("-lgcc");
8884 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008885 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008886 CmdArgs.push_back("--as-needed");
8887 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008888 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008889 CmdArgs.push_back("--no-as-needed");
8890 }
8891
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008892 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008893 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008894 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008895 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008896
8897 // According to Android ABI, we have to link with libdl if we are
8898 // linking with non-static libgcc.
8899 //
8900 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8901 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8902 if (isAndroid && !StaticLibgcc)
8903 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008904}
8905
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008906static std::string getLinuxDynamicLinker(const ArgList &Args,
8907 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008908 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8909
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008910 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008911 if (ToolChain.getTriple().isArch64Bit())
8912 return "/system/bin/linker64";
8913 else
8914 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008915 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8916 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008917 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008918 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008919 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008920 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008921 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008922 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008923 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008924 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008925 return "/lib/ld-linux-armhf.so.3";
8926 else
8927 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008928 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8929 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008930 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008931 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008932 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008933 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008934 return "/lib/ld-linux.so.3";
8935 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8936 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008937 std::string LibDir =
8938 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008939 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008940 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008941 if (mips::isUCLibc(Args))
8942 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008943 else if (!ToolChain.getTriple().hasEnvironment()) {
8944 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8945 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8946 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8947 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008948 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008949
8950 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008951 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008952 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008953 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008954 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8955 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008956 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008957 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008958 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8959 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008960 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008961 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008962 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008963 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008964 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008965 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008966 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8967 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008968 else
8969 return "/lib64/ld-linux-x86-64.so.2";
8970}
8971
Renato Golinc4b49242014-02-13 10:01:16 +00008972static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008973 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008974 // Make use of compiler-rt if --rtlib option is used
8975 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8976
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008977 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008978 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008979 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008980 default:
8981 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008982 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008983 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008984 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008985 break;
8986 }
Renato Golinc4b49242014-02-13 10:01:16 +00008987 break;
8988 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008989 // Make sure libgcc is not used under MSVC environment by default
8990 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8991 // Issue error diagnostic if libgcc is explicitly specified
8992 // through command line as --rtlib option argument.
8993 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8994 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8995 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8996 }
8997 } else
8998 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008999 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009000 }
9001}
9002
Rafael Espindola1e085772014-08-15 17:14:35 +00009003static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9004 switch (T.getArch()) {
9005 case llvm::Triple::x86:
9006 return "elf_i386";
9007 case llvm::Triple::aarch64:
9008 return "aarch64linux";
9009 case llvm::Triple::aarch64_be:
9010 return "aarch64_be_linux";
9011 case llvm::Triple::arm:
9012 case llvm::Triple::thumb:
9013 return "armelf_linux_eabi";
9014 case llvm::Triple::armeb:
9015 case llvm::Triple::thumbeb:
9016 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9017 case llvm::Triple::ppc:
9018 return "elf32ppclinux";
9019 case llvm::Triple::ppc64:
9020 return "elf64ppc";
9021 case llvm::Triple::ppc64le:
9022 return "elf64lppc";
9023 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009024 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009025 return "elf32_sparc";
9026 case llvm::Triple::sparcv9:
9027 return "elf64_sparc";
9028 case llvm::Triple::mips:
9029 return "elf32btsmip";
9030 case llvm::Triple::mipsel:
9031 return "elf32ltsmip";
9032 case llvm::Triple::mips64:
9033 if (mips::hasMipsAbiArg(Args, "n32"))
9034 return "elf32btsmipn32";
9035 return "elf64btsmip";
9036 case llvm::Triple::mips64el:
9037 if (mips::hasMipsAbiArg(Args, "n32"))
9038 return "elf32ltsmipn32";
9039 return "elf64ltsmip";
9040 case llvm::Triple::systemz:
9041 return "elf64_s390";
9042 case llvm::Triple::x86_64:
9043 if (T.getEnvironment() == llvm::Triple::GNUX32)
9044 return "elf32_x86_64";
9045 return "elf_x86_64";
9046 default:
9047 llvm_unreachable("Unexpected arch");
9048 }
9049}
9050
Douglas Katzman95354292015-06-23 20:42:09 +00009051void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9052 const InputInfo &Output,
9053 const InputInfoList &Inputs,
9054 const ArgList &Args,
9055 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009056 const toolchains::Linux &ToolChain =
9057 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009058 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009059
9060 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9061 llvm::Triple Triple = llvm::Triple(TripleStr);
9062
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009063 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009064 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009065 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009066 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9067 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009068 const bool HasCRTBeginEndFiles =
9069 ToolChain.getTriple().hasEnvironment() ||
9070 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009071
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009072 ArgStringList CmdArgs;
9073
Rafael Espindolad1002f62010-11-15 18:28:16 +00009074 // Silence warning for "clang -g foo.o -o foo"
9075 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009076 // and "clang -emit-llvm foo.o -o foo"
9077 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009078 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009079 // handled somewhere else.
9080 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009081
Peter Collingbourne39719a72015-11-20 20:49:39 +00009082 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9083 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009084 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009085 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009086 CmdArgs.push_back("-target");
9087 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9088 }
9089
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009090 if (!D.SysRoot.empty())
9091 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009092
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009093 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009094 CmdArgs.push_back("-pie");
9095
Rafael Espindola1c76c592010-11-07 22:57:16 +00009096 if (Args.hasArg(options::OPT_rdynamic))
9097 CmdArgs.push_back("-export-dynamic");
9098
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009099 if (Args.hasArg(options::OPT_s))
9100 CmdArgs.push_back("-s");
9101
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009102 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009103 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009104
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009105 for (const auto &Opt : ToolChain.ExtraOpts)
9106 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009107
9108 if (!Args.hasArg(options::OPT_static)) {
9109 CmdArgs.push_back("--eh-frame-hdr");
9110 }
9111
9112 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009113 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009114
9115 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009116 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9117 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009118 CmdArgs.push_back("-Bstatic");
9119 else
9120 CmdArgs.push_back("-static");
9121 } else if (Args.hasArg(options::OPT_shared)) {
9122 CmdArgs.push_back("-shared");
9123 }
9124
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009125 if (!Args.hasArg(options::OPT_static)) {
9126 if (Args.hasArg(options::OPT_rdynamic))
9127 CmdArgs.push_back("-export-dynamic");
9128
9129 if (!Args.hasArg(options::OPT_shared)) {
9130 const std::string Loader =
9131 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9132 CmdArgs.push_back("-dynamic-linker");
9133 CmdArgs.push_back(Args.MakeArgString(Loader));
9134 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009135 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009136
9137 CmdArgs.push_back("-o");
9138 CmdArgs.push_back(Output.getFilename());
9139
Douglas Katzman78b37b02015-11-17 20:28:07 +00009140 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009141 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009142 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009143 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009144 if (Args.hasArg(options::OPT_pg))
9145 crt1 = "gcrt1.o";
9146 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009147 crt1 = "Scrt1.o";
9148 else
9149 crt1 = "crt1.o";
9150 }
9151 if (crt1)
9152 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009153
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009154 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9155 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009156
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009157 const char *crtbegin;
9158 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009159 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009160 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009161 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009162 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009163 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009164 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009165 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009166
9167 if (HasCRTBeginEndFiles)
9168 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009169
9170 // Add crtfastmath.o if available and fast math is enabled.
9171 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009172 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009173
9174 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009175 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009176
Douglas Katzman6059ef92015-11-17 17:41:23 +00009177 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009178
Teresa Johnson945bc502015-10-15 20:35:53 +00009179 if (D.isUsingLTO())
9180 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009181
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009182 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9183 CmdArgs.push_back("--no-demangle");
9184
Alexey Samsonov52550342014-09-15 19:58:40 +00009185 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009186 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009187 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009188 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009189
Douglas Katzman78b37b02015-11-17 20:28:07 +00009190 if (D.CCCIsCXX() &&
9191 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009192 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009193 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009194 if (OnlyLibstdcxxStatic)
9195 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009196 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009197 if (OnlyLibstdcxxStatic)
9198 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009199 CmdArgs.push_back("-lm");
9200 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009201 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9202 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009203
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009204 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009205 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9206 if (Args.hasArg(options::OPT_static))
9207 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009208
Alexey Samsonov52550342014-09-15 19:58:40 +00009209 if (NeedsSanitizerDeps)
9210 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9211
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009212 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9213 Args.hasArg(options::OPT_pthreads);
9214
9215 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9216 options::OPT_fno_openmp, false)) {
9217 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9218 // FIXME: Does this really make sense for all GNU toolchains?
9219 WantPthread = true;
9220
9221 // Also link the particular OpenMP runtimes.
9222 switch (getOpenMPRuntime(ToolChain, Args)) {
9223 case OMPRT_OMP:
9224 CmdArgs.push_back("-lomp");
9225 break;
9226 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009227 CmdArgs.push_back("-lgomp");
9228
9229 // FIXME: Exclude this for platforms with libgomp that don't require
9230 // librt. Most modern Linux platforms require it, but some may not.
9231 CmdArgs.push_back("-lrt");
9232 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009233 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009234 CmdArgs.push_back("-liomp5");
9235 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009236 case OMPRT_Unknown:
9237 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009238 break;
9239 }
Chandler Carruth01538002013-01-17 13:19:29 +00009240 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009241
Renato Golinc4b49242014-02-13 10:01:16 +00009242 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009243
Richard Smith31d1de22015-05-20 22:48:44 +00009244 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009245 CmdArgs.push_back("-lpthread");
9246
Rafael Espindolab17bc532016-01-25 18:29:16 +00009247 if (Args.hasArg(options::OPT_fsplit_stack))
9248 CmdArgs.push_back("--wrap=pthread_create");
9249
Chandler Carruth94a32012012-05-14 18:31:18 +00009250 CmdArgs.push_back("-lc");
9251
9252 if (Args.hasArg(options::OPT_static))
9253 CmdArgs.push_back("--end-group");
9254 else
Renato Golinc4b49242014-02-13 10:01:16 +00009255 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009256 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009257
Rafael Espindola81937ec2010-12-01 01:52:43 +00009258 if (!Args.hasArg(options::OPT_nostartfiles)) {
9259 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009260 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009261 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009262 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009263 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009264 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009265 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009266
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009267 if (HasCRTBeginEndFiles)
9268 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009269 if (!isAndroid)
9270 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009271 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009272 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009273
Peter Collingbourne39719a72015-11-20 20:49:39 +00009274 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009275}
9276
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009277// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9278// for the various SFI requirements like register masking. The assembly tool
9279// inserts the file containing the macros as an input into all the assembly
9280// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009281void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9282 const InputInfo &Output,
9283 const InputInfoList &Inputs,
9284 const ArgList &Args,
9285 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009286 const toolchains::NaClToolChain &ToolChain =
9287 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009288 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009289 "nacl-arm-macros.s");
9290 InputInfoList NewInputs;
9291 NewInputs.push_back(NaClMacros);
9292 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009293 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9294 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009295}
9296
Douglas Katzman750cfc52015-06-29 18:42:16 +00009297// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009298// we use static by default, do not yet support sanitizers or LTO, and a few
9299// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009300// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009301void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9302 const InputInfo &Output,
9303 const InputInfoList &Inputs,
9304 const ArgList &Args,
9305 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009306
Douglas Katzman54366072015-07-27 16:53:08 +00009307 const toolchains::NaClToolChain &ToolChain =
9308 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009310 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009311 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009312 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009313
9314 ArgStringList CmdArgs;
9315
9316 // Silence warning for "clang -g foo.o -o foo"
9317 Args.ClaimAllArgs(options::OPT_g_Group);
9318 // and "clang -emit-llvm foo.o -o foo"
9319 Args.ClaimAllArgs(options::OPT_emit_llvm);
9320 // and for "clang -w foo.o -o foo". Other warning options are already
9321 // handled somewhere else.
9322 Args.ClaimAllArgs(options::OPT_w);
9323
9324 if (!D.SysRoot.empty())
9325 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9326
9327 if (Args.hasArg(options::OPT_rdynamic))
9328 CmdArgs.push_back("-export-dynamic");
9329
9330 if (Args.hasArg(options::OPT_s))
9331 CmdArgs.push_back("-s");
9332
Douglas Katzman54366072015-07-27 16:53:08 +00009333 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9334 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009335 CmdArgs.push_back("--build-id");
9336
9337 if (!IsStatic)
9338 CmdArgs.push_back("--eh-frame-hdr");
9339
9340 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009341 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009342 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009343 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009344 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009345 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009346 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009347 else if (Arch == llvm::Triple::mipsel)
9348 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009349 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009350 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9351 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009352
9353 if (IsStatic)
9354 CmdArgs.push_back("-static");
9355 else if (Args.hasArg(options::OPT_shared))
9356 CmdArgs.push_back("-shared");
9357
9358 CmdArgs.push_back("-o");
9359 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009360 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009361 if (!Args.hasArg(options::OPT_shared))
9362 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9363 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9364
9365 const char *crtbegin;
9366 if (IsStatic)
9367 crtbegin = "crtbeginT.o";
9368 else if (Args.hasArg(options::OPT_shared))
9369 crtbegin = "crtbeginS.o";
9370 else
9371 crtbegin = "crtbegin.o";
9372 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9373 }
9374
9375 Args.AddAllArgs(CmdArgs, options::OPT_L);
9376 Args.AddAllArgs(CmdArgs, options::OPT_u);
9377
Douglas Katzman6059ef92015-11-17 17:41:23 +00009378 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009379
9380 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9381 CmdArgs.push_back("--no-demangle");
9382
9383 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9384
Douglas Katzman78b37b02015-11-17 20:28:07 +00009385 if (D.CCCIsCXX() &&
9386 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009387 bool OnlyLibstdcxxStatic =
9388 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009389 if (OnlyLibstdcxxStatic)
9390 CmdArgs.push_back("-Bstatic");
9391 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9392 if (OnlyLibstdcxxStatic)
9393 CmdArgs.push_back("-Bdynamic");
9394 CmdArgs.push_back("-lm");
9395 }
9396
9397 if (!Args.hasArg(options::OPT_nostdlib)) {
9398 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9399 // Always use groups, since it has no effect on dynamic libraries.
9400 CmdArgs.push_back("--start-group");
9401 CmdArgs.push_back("-lc");
9402 // NaCl's libc++ currently requires libpthread, so just always include it
9403 // in the group for C++.
9404 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009405 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009406 // Gold, used by Mips, handles nested groups differently than ld, and
9407 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9408 // which is not a desired behaviour here.
9409 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9410 if (getToolChain().getArch() == llvm::Triple::mipsel)
9411 CmdArgs.push_back("-lnacl");
9412
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009413 CmdArgs.push_back("-lpthread");
9414 }
9415
9416 CmdArgs.push_back("-lgcc");
9417 CmdArgs.push_back("--as-needed");
9418 if (IsStatic)
9419 CmdArgs.push_back("-lgcc_eh");
9420 else
9421 CmdArgs.push_back("-lgcc_s");
9422 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009423
9424 // Mips needs to create and use pnacl_legacy library that contains
9425 // definitions from bitcode/pnaclmm.c and definitions for
9426 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9427 if (getToolChain().getArch() == llvm::Triple::mipsel)
9428 CmdArgs.push_back("-lpnacl_legacy");
9429
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009430 CmdArgs.push_back("--end-group");
9431 }
9432
9433 if (!Args.hasArg(options::OPT_nostartfiles)) {
9434 const char *crtend;
9435 if (Args.hasArg(options::OPT_shared))
9436 crtend = "crtendS.o";
9437 else
9438 crtend = "crtend.o";
9439
9440 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9441 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9442 }
9443 }
9444
Peter Collingbourne39719a72015-11-20 20:49:39 +00009445 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9446 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009447}
9448
Douglas Katzman95354292015-06-23 20:42:09 +00009449void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9450 const InputInfo &Output,
9451 const InputInfoList &Inputs,
9452 const ArgList &Args,
9453 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009454 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009455 ArgStringList CmdArgs;
9456
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009457 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009458
9459 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009460 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009461
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009462 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009463 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009464
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009465 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009466 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009467}
9468
Douglas Katzman95354292015-06-23 20:42:09 +00009469void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9470 const InputInfo &Output,
9471 const InputInfoList &Inputs,
9472 const ArgList &Args,
9473 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009474 const Driver &D = getToolChain().getDriver();
9475 ArgStringList CmdArgs;
9476
Daniel Dunbarb440f562010-08-02 02:38:21 +00009477 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009478 CmdArgs.push_back("-o");
9479 CmdArgs.push_back(Output.getFilename());
9480 } else {
9481 assert(Output.isNothing() && "Invalid output.");
9482 }
9483
Douglas Katzman78b37b02015-11-17 20:28:07 +00009484 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009485 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9486 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9487 CmdArgs.push_back(
9488 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9489 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009490 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009491
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009492 Args.AddAllArgs(CmdArgs,
9493 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009494
Daniel Dunbar54423b22010-09-17 00:24:54 +00009495 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009496
Xinliang David Li69306c02015-10-22 06:15:31 +00009497 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009498
Douglas Katzman78b37b02015-11-17 20:28:07 +00009499 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009500 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009501 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009502 CmdArgs.push_back("-lm");
9503 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009504 }
9505
Douglas Katzman78b37b02015-11-17 20:28:07 +00009506 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009507 if (Args.hasArg(options::OPT_pthread))
9508 CmdArgs.push_back("-lpthread");
9509 CmdArgs.push_back("-lc");
9510 CmdArgs.push_back("-lCompilerRT-Generic");
9511 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9512 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009513 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009514 }
9515
Logan Chieneb9162f2014-06-26 14:23:45 +00009516 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009517 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009518}
9519
Daniel Dunbarcc912342009-05-02 18:28:39 +00009520/// DragonFly Tools
9521
9522// For now, DragonFly Assemble does just about the same as for
9523// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009524void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9525 const InputInfo &Output,
9526 const InputInfoList &Inputs,
9527 const ArgList &Args,
9528 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009529 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009530 ArgStringList CmdArgs;
9531
9532 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9533 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009534 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009535 CmdArgs.push_back("--32");
9536
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009537 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009538
9539 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009540 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009541
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009542 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009543 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009544
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009545 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009546 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009547}
9548
Douglas Katzman95354292015-06-23 20:42:09 +00009549void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9550 const InputInfo &Output,
9551 const InputInfoList &Inputs,
9552 const ArgList &Args,
9553 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009554 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009555 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009556
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009557 if (!D.SysRoot.empty())
9558 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9559
John McCall65b8da02013-04-11 22:55:55 +00009560 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009561 if (Args.hasArg(options::OPT_static)) {
9562 CmdArgs.push_back("-Bstatic");
9563 } else {
John McCall65b8da02013-04-11 22:55:55 +00009564 if (Args.hasArg(options::OPT_rdynamic))
9565 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009566 if (Args.hasArg(options::OPT_shared))
9567 CmdArgs.push_back("-Bshareable");
9568 else {
9569 CmdArgs.push_back("-dynamic-linker");
9570 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9571 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009572 CmdArgs.push_back("--hash-style=gnu");
9573 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009574 }
9575
9576 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9577 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009578 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009579 CmdArgs.push_back("-m");
9580 CmdArgs.push_back("elf_i386");
9581 }
9582
Daniel Dunbarb440f562010-08-02 02:38:21 +00009583 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009584 CmdArgs.push_back("-o");
9585 CmdArgs.push_back(Output.getFilename());
9586 } else {
9587 assert(Output.isNothing() && "Invalid output.");
9588 }
9589
Douglas Katzman78b37b02015-11-17 20:28:07 +00009590 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009591 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009592 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009593 CmdArgs.push_back(
9594 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009595 else {
9596 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009597 CmdArgs.push_back(
9598 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009599 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009600 CmdArgs.push_back(
9601 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009602 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009603 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009604 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009605 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009606 CmdArgs.push_back(
9607 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009608 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009609 CmdArgs.push_back(
9610 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009611 }
9612
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009613 Args.AddAllArgs(CmdArgs,
9614 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009615
Daniel Dunbar54423b22010-09-17 00:24:54 +00009616 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009617
Douglas Katzman78b37b02015-11-17 20:28:07 +00009618 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009619 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009620
9621 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009622 CmdArgs.push_back("-rpath");
9623 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009624 }
9625
Hans Wennborg70850d82013-07-18 20:29:38 +00009626 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009627 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009628 CmdArgs.push_back("-lm");
9629 }
9630
Daniel Dunbarcc912342009-05-02 18:28:39 +00009631 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009632 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009633
9634 if (!Args.hasArg(options::OPT_nolibc)) {
9635 CmdArgs.push_back("-lc");
9636 }
9637
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009638 if (Args.hasArg(options::OPT_static) ||
9639 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009640 CmdArgs.push_back("-lgcc");
9641 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009642 } else {
9643 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009644 CmdArgs.push_back("-lgcc_pic");
9645 if (!Args.hasArg(options::OPT_shared))
9646 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009647 } else {
John McCall65b8da02013-04-11 22:55:55 +00009648 CmdArgs.push_back("-lgcc");
9649 CmdArgs.push_back("--as-needed");
9650 CmdArgs.push_back("-lgcc_pic");
9651 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009652 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009653 }
9654 }
9655
Douglas Katzman78b37b02015-11-17 20:28:07 +00009656 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009657 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009658 CmdArgs.push_back(
9659 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009660 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009661 CmdArgs.push_back(
9662 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9663 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009664 }
9665
Xinliang David Li69306c02015-10-22 06:15:31 +00009666 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009667
Logan Chieneb9162f2014-06-26 14:23:45 +00009668 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009669 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009670}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009671
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009672// Try to find Exe from a Visual Studio distribution. This first tries to find
9673// an installed copy of Visual Studio and, failing that, looks in the PATH,
9674// making sure that whatever executable that's found is not a same-named exe
9675// from clang itself to prevent clang from falling back to itself.
9676static std::string FindVisualStudioExecutable(const ToolChain &TC,
9677 const char *Exe,
9678 const char *ClangProgramPath) {
9679 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9680 std::string visualStudioBinDir;
9681 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9682 visualStudioBinDir)) {
9683 SmallString<128> FilePath(visualStudioBinDir);
9684 llvm::sys::path::append(FilePath, Exe);
9685 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9686 return FilePath.str();
9687 }
9688
9689 return Exe;
9690}
9691
Douglas Katzman95354292015-06-23 20:42:09 +00009692void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9693 const InputInfo &Output,
9694 const InputInfoList &Inputs,
9695 const ArgList &Args,
9696 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009697 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009698 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009699
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009700 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9701 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009702 CmdArgs.push_back(
9703 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009704
Douglas Katzman78b37b02015-11-17 20:28:07 +00009705 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9706 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009707 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009708
Zachary Turner10d75b22014-10-22 20:40:43 +00009709 if (!llvm::sys::Process::GetEnv("LIB")) {
9710 // If the VC environment hasn't been configured (perhaps because the user
9711 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009712 // the environment variable is set however, assume the user knows what
9713 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009714 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009715 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009716 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9717 SmallString<128> LibDir(VisualStudioDir);
9718 llvm::sys::path::append(LibDir, "VC", "lib");
9719 switch (MSVC.getArch()) {
9720 case llvm::Triple::x86:
9721 // x86 just puts the libraries directly in lib
9722 break;
9723 case llvm::Triple::x86_64:
9724 llvm::sys::path::append(LibDir, "amd64");
9725 break;
9726 case llvm::Triple::arm:
9727 llvm::sys::path::append(LibDir, "arm");
9728 break;
9729 default:
9730 break;
9731 }
9732 CmdArgs.push_back(
9733 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009734
9735 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9736 std::string UniversalCRTLibPath;
9737 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9738 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9739 UniversalCRTLibPath.c_str()));
9740 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009741 }
9742
9743 std::string WindowsSdkLibPath;
9744 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9745 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9746 WindowsSdkLibPath.c_str()));
9747 }
9748
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009749 CmdArgs.push_back("-nologo");
9750
Reid Kleckner124955a2015-08-05 18:51:13 +00009751 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009752 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009753
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009754 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009755 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009756 if (DLL) {
9757 CmdArgs.push_back(Args.MakeArgString("-dll"));
9758
9759 SmallString<128> ImplibName(Output.getFilename());
9760 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009761 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009762 }
9763
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009764 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009765 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009766 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009767 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009768 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9769 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009770 // Make sure the dynamic runtime thunk is not optimized out at link time
9771 // to ensure proper SEH handling.
9772 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009773 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009774 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009775 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009776 for (const auto &Lib : {"asan", "asan_cxx"})
9777 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009778 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009779 }
9780
Hans Wennborg2e274592013-08-13 23:38:57 +00009781 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009782
Alexey Bataevc7e84352015-08-19 04:49:01 +00009783 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9784 options::OPT_fno_openmp, false)) {
9785 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9786 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9787 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9788 TC.getDriver().Dir + "/../lib"));
9789 switch (getOpenMPRuntime(getToolChain(), Args)) {
9790 case OMPRT_OMP:
9791 CmdArgs.push_back("-defaultlib:libomp.lib");
9792 break;
9793 case OMPRT_IOMP5:
9794 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9795 break;
9796 case OMPRT_GOMP:
9797 break;
9798 case OMPRT_Unknown:
9799 // Already diagnosed.
9800 break;
9801 }
9802 }
9803
Andrey Turetskiya4868572016-03-14 11:19:43 +00009804 // Add compiler-rt lib in case if it was explicitly
9805 // specified as an argument for --rtlib option.
9806 if (!Args.hasArg(options::OPT_nostdlib)) {
9807 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9808 }
9809
Reid Kleckner337188f2014-09-16 19:22:00 +00009810 // Add filenames, libraries, and other linker inputs.
9811 for (const auto &Input : Inputs) {
9812 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009813 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009814 continue;
9815 }
9816
9817 const Arg &A = Input.getInputArg();
9818
9819 // Render -l options differently for the MSVC linker.
9820 if (A.getOption().matches(options::OPT_l)) {
9821 StringRef Lib = A.getValue();
9822 const char *LinkLibArg;
9823 if (Lib.endswith(".lib"))
9824 LinkLibArg = Args.MakeArgString(Lib);
9825 else
9826 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9827 CmdArgs.push_back(LinkLibArg);
9828 continue;
9829 }
9830
9831 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9832 // or -L. Render it, even if MSVC doesn't understand it.
9833 A.renderAsInput(Args, CmdArgs);
9834 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009835
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009836 TC.addProfileRTLibs(Args, CmdArgs);
9837
Zachary Turner719f58c2014-12-01 23:06:47 +00009838 // We need to special case some linker paths. In the case of lld, we need to
9839 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9840 // linker, we need to use a special search algorithm.
9841 llvm::SmallString<128> linkPath;
9842 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9843 if (Linker.equals_lower("lld"))
9844 Linker = "lld-link";
9845
9846 if (Linker.equals_lower("link")) {
9847 // If we're using the MSVC linker, it's not sufficient to just use link
9848 // from the program PATH, because other environments like GnuWin32 install
9849 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009850 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009851 C.getDriver().getClangProgramPath());
9852 } else {
9853 linkPath = Linker;
9854 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009855 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009856 }
9857
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009858 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009859 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009860}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009861
Douglas Katzman95354292015-06-23 20:42:09 +00009862void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9863 const InputInfo &Output,
9864 const InputInfoList &Inputs,
9865 const ArgList &Args,
9866 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009867 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9868}
9869
Douglas Katzman95354292015-06-23 20:42:09 +00009870std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009871 Compilation &C, const JobAction &JA, const InputInfo &Output,
9872 const InputInfoList &Inputs, const ArgList &Args,
9873 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009874 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009875 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009876 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009877 CmdArgs.push_back("/W0"); // No warnings.
9878
9879 // The goal is to be able to invoke this tool correctly based on
9880 // any flag accepted by clang-cl.
9881
9882 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009883 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009884
9885 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009886 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9887 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9888 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009889 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9890 if (A->getOption().getID() == options::OPT_O0) {
9891 CmdArgs.push_back("/Od");
9892 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009893 CmdArgs.push_back("/Og");
9894
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009895 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009896 if (OptLevel == "s" || OptLevel == "z")
9897 CmdArgs.push_back("/Os");
9898 else
9899 CmdArgs.push_back("/Ot");
9900
9901 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009902 }
9903 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009904 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9905 options::OPT_fno_omit_frame_pointer))
9906 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9907 ? "/Oy"
9908 : "/Oy-");
9909 if (!Args.hasArg(options::OPT_fwritable_strings))
9910 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009911
Nico Weber3f8dafb2015-03-12 19:37:10 +00009912 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009913 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9914
David Majnemerf6072342014-07-01 22:24:56 +00009915 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9916 /*default=*/false))
9917 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009918 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9919 options::OPT_fno_function_sections))
9920 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9921 ? "/Gy"
9922 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009923 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9924 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009925 CmdArgs.push_back(
9926 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009927 if (Args.hasArg(options::OPT_fsyntax_only))
9928 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009929 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9930 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009931 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009932
Nico Weber3f8dafb2015-03-12 19:37:10 +00009933 std::vector<std::string> Includes =
9934 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009935 for (const auto &Include : Includes)
9936 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009937
Hans Wennborg87cfa712013-09-19 20:32:16 +00009938 // Flags that can simply be passed through.
9939 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9940 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009941 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9942 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009943 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009944 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009945
9946 // The order of these flags is relevant, so pick the last one.
9947 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9948 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9949 A->render(Args, CmdArgs);
9950
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009951 // Pass through all unknown arguments so that the fallback command can see
9952 // them too.
9953 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9954
Hans Wennborg87cfa712013-09-19 20:32:16 +00009955 // Input filename.
9956 assert(Inputs.size() == 1);
9957 const InputInfo &II = Inputs[0];
9958 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9959 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9960 if (II.isFilename())
9961 CmdArgs.push_back(II.getFilename());
9962 else
9963 II.getInputArg().renderAsInput(Args, CmdArgs);
9964
9965 // Output filename.
9966 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009967 const char *Fo =
9968 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009969 CmdArgs.push_back(Fo);
9970
Hans Wennborg188382e2013-09-20 18:16:35 +00009971 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009972 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9973 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009974 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009975 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009976}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009977
Yaron Keren1c0070c2015-07-02 04:45:27 +00009978/// MinGW Tools
9979void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9980 const InputInfo &Output,
9981 const InputInfoList &Inputs,
9982 const ArgList &Args,
9983 const char *LinkingOutput) const {
9984 claimNoWarnArgs(Args);
9985 ArgStringList CmdArgs;
9986
9987 if (getToolChain().getArch() == llvm::Triple::x86) {
9988 CmdArgs.push_back("--32");
9989 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9990 CmdArgs.push_back("--64");
9991 }
9992
9993 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9994
9995 CmdArgs.push_back("-o");
9996 CmdArgs.push_back(Output.getFilename());
9997
9998 for (const auto &II : Inputs)
9999 CmdArgs.push_back(II.getFilename());
10000
10001 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010002 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010003
10004 if (Args.hasArg(options::OPT_gsplit_dwarf))
10005 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10006 SplitDebugName(Args, Inputs[0]));
10007}
10008
10009void MinGW::Linker::AddLibGCC(const ArgList &Args,
10010 ArgStringList &CmdArgs) const {
10011 if (Args.hasArg(options::OPT_mthreads))
10012 CmdArgs.push_back("-lmingwthrd");
10013 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010014
Yaron Kerenaa281332015-08-09 00:24:07 +000010015 // Make use of compiler-rt if --rtlib option is used
10016 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10017 if (RLT == ToolChain::RLT_Libgcc) {
10018 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10019 Args.hasArg(options::OPT_static);
10020 bool Shared = Args.hasArg(options::OPT_shared);
10021 bool CXX = getToolChain().getDriver().CCCIsCXX();
10022
10023 if (Static || (!CXX && !Shared)) {
10024 CmdArgs.push_back("-lgcc");
10025 CmdArgs.push_back("-lgcc_eh");
10026 } else {
10027 CmdArgs.push_back("-lgcc_s");
10028 CmdArgs.push_back("-lgcc");
10029 }
10030 } else {
10031 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10032 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010033
Yaron Keren1c0070c2015-07-02 04:45:27 +000010034 CmdArgs.push_back("-lmoldname");
10035 CmdArgs.push_back("-lmingwex");
10036 CmdArgs.push_back("-lmsvcrt");
10037}
10038
10039void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10040 const InputInfo &Output,
10041 const InputInfoList &Inputs,
10042 const ArgList &Args,
10043 const char *LinkingOutput) const {
10044 const ToolChain &TC = getToolChain();
10045 const Driver &D = TC.getDriver();
10046 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10047
10048 ArgStringList CmdArgs;
10049
10050 // Silence warning for "clang -g foo.o -o foo"
10051 Args.ClaimAllArgs(options::OPT_g_Group);
10052 // and "clang -emit-llvm foo.o -o foo"
10053 Args.ClaimAllArgs(options::OPT_emit_llvm);
10054 // and for "clang -w foo.o -o foo". Other warning options are already
10055 // handled somewhere else.
10056 Args.ClaimAllArgs(options::OPT_w);
10057
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010058 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10059 if (LinkerName.equals_lower("lld")) {
10060 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010061 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010062 } else if (!LinkerName.equals_lower("ld")) {
10063 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010064 }
10065
Yaron Keren1c0070c2015-07-02 04:45:27 +000010066 if (!D.SysRoot.empty())
10067 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10068
10069 if (Args.hasArg(options::OPT_s))
10070 CmdArgs.push_back("-s");
10071
10072 CmdArgs.push_back("-m");
10073 if (TC.getArch() == llvm::Triple::x86)
10074 CmdArgs.push_back("i386pe");
10075 if (TC.getArch() == llvm::Triple::x86_64)
10076 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010077 if (TC.getArch() == llvm::Triple::arm)
10078 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010079
10080 if (Args.hasArg(options::OPT_mwindows)) {
10081 CmdArgs.push_back("--subsystem");
10082 CmdArgs.push_back("windows");
10083 } else if (Args.hasArg(options::OPT_mconsole)) {
10084 CmdArgs.push_back("--subsystem");
10085 CmdArgs.push_back("console");
10086 }
10087
10088 if (Args.hasArg(options::OPT_static))
10089 CmdArgs.push_back("-Bstatic");
10090 else {
10091 if (Args.hasArg(options::OPT_mdll))
10092 CmdArgs.push_back("--dll");
10093 else if (Args.hasArg(options::OPT_shared))
10094 CmdArgs.push_back("--shared");
10095 CmdArgs.push_back("-Bdynamic");
10096 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10097 CmdArgs.push_back("-e");
10098 if (TC.getArch() == llvm::Triple::x86)
10099 CmdArgs.push_back("_DllMainCRTStartup@12");
10100 else
10101 CmdArgs.push_back("DllMainCRTStartup");
10102 CmdArgs.push_back("--enable-auto-image-base");
10103 }
10104 }
10105
10106 CmdArgs.push_back("-o");
10107 CmdArgs.push_back(Output.getFilename());
10108
10109 Args.AddAllArgs(CmdArgs, options::OPT_e);
10110 // FIXME: add -N, -n flags
10111 Args.AddLastArg(CmdArgs, options::OPT_r);
10112 Args.AddLastArg(CmdArgs, options::OPT_s);
10113 Args.AddLastArg(CmdArgs, options::OPT_t);
10114 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10115 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10116
Douglas Katzman78b37b02015-11-17 20:28:07 +000010117 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010118 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10119 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10120 } else {
10121 if (Args.hasArg(options::OPT_municode))
10122 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10123 else
10124 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10125 }
10126 if (Args.hasArg(options::OPT_pg))
10127 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10128 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10129 }
10130
10131 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010132 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010133 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10134
10135 // TODO: Add ASan stuff here
10136
10137 // TODO: Add profile stuff here
10138
Douglas Katzman78b37b02015-11-17 20:28:07 +000010139 if (D.CCCIsCXX() &&
10140 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010141 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10142 !Args.hasArg(options::OPT_static);
10143 if (OnlyLibstdcxxStatic)
10144 CmdArgs.push_back("-Bstatic");
10145 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10146 if (OnlyLibstdcxxStatic)
10147 CmdArgs.push_back("-Bdynamic");
10148 }
10149
10150 if (!Args.hasArg(options::OPT_nostdlib)) {
10151 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10152 if (Args.hasArg(options::OPT_static))
10153 CmdArgs.push_back("--start-group");
10154
10155 if (Args.hasArg(options::OPT_fstack_protector) ||
10156 Args.hasArg(options::OPT_fstack_protector_strong) ||
10157 Args.hasArg(options::OPT_fstack_protector_all)) {
10158 CmdArgs.push_back("-lssp_nonshared");
10159 CmdArgs.push_back("-lssp");
10160 }
10161 if (Args.hasArg(options::OPT_fopenmp))
10162 CmdArgs.push_back("-lgomp");
10163
10164 AddLibGCC(Args, CmdArgs);
10165
10166 if (Args.hasArg(options::OPT_pg))
10167 CmdArgs.push_back("-lgmon");
10168
Yaron Kerenadce68e2015-07-06 18:52:19 +000010169 if (Args.hasArg(options::OPT_pthread))
10170 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010171
10172 // add system libraries
10173 if (Args.hasArg(options::OPT_mwindows)) {
10174 CmdArgs.push_back("-lgdi32");
10175 CmdArgs.push_back("-lcomdlg32");
10176 }
10177 CmdArgs.push_back("-ladvapi32");
10178 CmdArgs.push_back("-lshell32");
10179 CmdArgs.push_back("-luser32");
10180 CmdArgs.push_back("-lkernel32");
10181
10182 if (Args.hasArg(options::OPT_static))
10183 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010184 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010185 AddLibGCC(Args, CmdArgs);
10186 }
10187
10188 if (!Args.hasArg(options::OPT_nostartfiles)) {
10189 // Add crtfastmath.o if available and fast math is enabled.
10190 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10191
10192 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10193 }
10194 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010195 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010196 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010197}
10198
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010199/// XCore Tools
10200// We pass assemble and link construction to the xcc tool.
10201
Douglas Katzman95354292015-06-23 20:42:09 +000010202void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10203 const InputInfo &Output,
10204 const InputInfoList &Inputs,
10205 const ArgList &Args,
10206 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010207 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010208 ArgStringList CmdArgs;
10209
10210 CmdArgs.push_back("-o");
10211 CmdArgs.push_back(Output.getFilename());
10212
10213 CmdArgs.push_back("-c");
10214
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010215 if (Args.hasArg(options::OPT_v))
10216 CmdArgs.push_back("-v");
10217
Robert Lytton894d25c2014-05-02 09:33:25 +000010218 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10219 if (!A->getOption().matches(options::OPT_g0))
10220 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010221
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010222 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10223 false))
10224 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010225
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010226 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010227
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010228 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010229 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010230
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010231 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010232 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010233}
10234
Douglas Katzman95354292015-06-23 20:42:09 +000010235void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10236 const InputInfo &Output,
10237 const InputInfoList &Inputs,
10238 const ArgList &Args,
10239 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010240 ArgStringList CmdArgs;
10241
10242 if (Output.isFilename()) {
10243 CmdArgs.push_back("-o");
10244 CmdArgs.push_back(Output.getFilename());
10245 } else {
10246 assert(Output.isNothing() && "Invalid output.");
10247 }
10248
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010249 if (Args.hasArg(options::OPT_v))
10250 CmdArgs.push_back("-v");
10251
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010252 // Pass -fexceptions through to the linker if it was present.
10253 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10254 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010255 CmdArgs.push_back("-fexceptions");
10256
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010257 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10258
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010259 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010260 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010261}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010262
Douglas Katzman95354292015-06-23 20:42:09 +000010263void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10264 const InputInfo &Output,
10265 const InputInfoList &Inputs,
10266 const ArgList &Args,
10267 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010268 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010269 const auto &TC =
10270 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10271 ArgStringList CmdArgs;
10272 const char *Exec;
10273
10274 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010275 default:
10276 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010277 case llvm::Triple::arm:
10278 case llvm::Triple::thumb:
10279 break;
10280 case llvm::Triple::x86:
10281 CmdArgs.push_back("--32");
10282 break;
10283 case llvm::Triple::x86_64:
10284 CmdArgs.push_back("--64");
10285 break;
10286 }
10287
10288 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10289
10290 CmdArgs.push_back("-o");
10291 CmdArgs.push_back(Output.getFilename());
10292
10293 for (const auto &Input : Inputs)
10294 CmdArgs.push_back(Input.getFilename());
10295
10296 const std::string Assembler = TC.GetProgramPath("as");
10297 Exec = Args.MakeArgString(Assembler);
10298
Justin Bognerd3371d82015-07-17 03:35:54 +000010299 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010300}
10301
Douglas Katzman95354292015-06-23 20:42:09 +000010302void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10303 const InputInfo &Output,
10304 const InputInfoList &Inputs,
10305 const ArgList &Args,
10306 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010307 const auto &TC =
10308 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10309 const llvm::Triple &T = TC.getTriple();
10310 const Driver &D = TC.getDriver();
10311 SmallString<128> EntryPoint;
10312 ArgStringList CmdArgs;
10313 const char *Exec;
10314
10315 // Silence warning for "clang -g foo.o -o foo"
10316 Args.ClaimAllArgs(options::OPT_g_Group);
10317 // and "clang -emit-llvm foo.o -o foo"
10318 Args.ClaimAllArgs(options::OPT_emit_llvm);
10319 // and for "clang -w foo.o -o foo"
10320 Args.ClaimAllArgs(options::OPT_w);
10321 // Other warning options are already handled somewhere else.
10322
10323 if (!D.SysRoot.empty())
10324 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10325
10326 if (Args.hasArg(options::OPT_pie))
10327 CmdArgs.push_back("-pie");
10328 if (Args.hasArg(options::OPT_rdynamic))
10329 CmdArgs.push_back("-export-dynamic");
10330 if (Args.hasArg(options::OPT_s))
10331 CmdArgs.push_back("--strip-all");
10332
10333 CmdArgs.push_back("-m");
10334 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010335 default:
10336 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010337 case llvm::Triple::arm:
10338 case llvm::Triple::thumb:
10339 // FIXME: this is incorrect for WinCE
10340 CmdArgs.push_back("thumb2pe");
10341 break;
10342 case llvm::Triple::x86:
10343 CmdArgs.push_back("i386pe");
10344 EntryPoint.append("_");
10345 break;
10346 case llvm::Triple::x86_64:
10347 CmdArgs.push_back("i386pep");
10348 break;
10349 }
10350
10351 if (Args.hasArg(options::OPT_shared)) {
10352 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010353 default:
10354 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010355 case llvm::Triple::arm:
10356 case llvm::Triple::thumb:
10357 case llvm::Triple::x86_64:
10358 EntryPoint.append("_DllMainCRTStartup");
10359 break;
10360 case llvm::Triple::x86:
10361 EntryPoint.append("_DllMainCRTStartup@12");
10362 break;
10363 }
10364
10365 CmdArgs.push_back("-shared");
10366 CmdArgs.push_back("-Bdynamic");
10367
10368 CmdArgs.push_back("--enable-auto-image-base");
10369
10370 CmdArgs.push_back("--entry");
10371 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10372 } else {
10373 EntryPoint.append("mainCRTStartup");
10374
10375 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10376 : "-Bdynamic");
10377
Douglas Katzman78b37b02015-11-17 20:28:07 +000010378 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010379 CmdArgs.push_back("--entry");
10380 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10381 }
10382
10383 // FIXME: handle subsystem
10384 }
10385
10386 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010387 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010388
10389 CmdArgs.push_back("-o");
10390 CmdArgs.push_back(Output.getFilename());
10391
10392 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10393 SmallString<261> ImpLib(Output.getFilename());
10394 llvm::sys::path::replace_extension(ImpLib, ".lib");
10395
10396 CmdArgs.push_back("--out-implib");
10397 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10398 }
10399
Douglas Katzman78b37b02015-11-17 20:28:07 +000010400 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010401 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10402 const char *CRTBegin;
10403
10404 CRTBegin =
10405 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10406 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10407 }
10408
10409 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010410 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010411 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10412
10413 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10414 !Args.hasArg(options::OPT_nodefaultlibs)) {
10415 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10416 !Args.hasArg(options::OPT_static);
10417 if (StaticCXX)
10418 CmdArgs.push_back("-Bstatic");
10419 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10420 if (StaticCXX)
10421 CmdArgs.push_back("-Bdynamic");
10422 }
10423
10424 if (!Args.hasArg(options::OPT_nostdlib)) {
10425 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10426 // TODO handle /MT[d] /MD[d]
10427 CmdArgs.push_back("-lmsvcrt");
10428 AddRunTimeLibs(TC, D, CmdArgs, Args);
10429 }
10430 }
10431
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010432 if (TC.getSanitizerArgs().needsAsanRt()) {
10433 // TODO handle /MT[d] /MD[d]
10434 if (Args.hasArg(options::OPT_shared)) {
10435 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10436 } else {
10437 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10438 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10439 // Make sure the dynamic runtime thunk is not optimized out at link time
10440 // to ensure proper SEH handling.
10441 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10442 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10443 ? "___asan_seh_interceptor"
10444 : "__asan_seh_interceptor"));
10445 }
10446 }
10447
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010448 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010449
Justin Bognerd3371d82015-07-17 03:35:54 +000010450 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010451}
Douglas Katzman84a75642015-06-19 14:55:19 +000010452
Douglas Katzman95354292015-06-23 20:42:09 +000010453void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10454 const InputInfo &Output,
10455 const InputInfoList &Inputs,
10456 const ArgList &Args,
10457 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010458 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010459 assert(Inputs.size() == 1);
10460 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010461 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10462 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010463
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010464 if (JA.getKind() == Action::PreprocessJobClass) {
10465 Args.ClaimAllArgs();
10466 CmdArgs.push_back("-E");
10467 } else {
10468 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10469 CmdArgs.push_back("-S");
10470 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10471 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010472 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010473
Douglas Katzmanf6071112015-08-03 14:34:22 +000010474 // Append all -I, -iquote, -isystem paths, defines/undefines,
10475 // 'f' flags, optimize flags, and warning options.
10476 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010477 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010478 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010479 options::OPT_f_Group, options::OPT_f_clang_Group,
10480 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010481 options::OPT_O_Group, options::OPT_W_Group,
10482 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010483
10484 // If we're producing a dependency file, and assembly is the final action,
10485 // then the name of the target in the dependency file should be the '.o'
10486 // file, not the '.s' file produced by this step. For example, instead of
10487 // /tmp/mumble.s: mumble.c .../someheader.h
10488 // the filename on the lefthand side should be "mumble.o"
10489 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10490 C.getActions().size() == 1 &&
10491 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10492 Arg *A = Args.getLastArg(options::OPT_o);
10493 if (A) {
10494 CmdArgs.push_back("-MT");
10495 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10496 }
10497 }
10498
Douglas Katzman84a75642015-06-19 14:55:19 +000010499 CmdArgs.push_back(II.getFilename());
10500 CmdArgs.push_back("-o");
10501 CmdArgs.push_back(Output.getFilename());
10502
10503 std::string Exec =
10504 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010505 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10506 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010507}
10508
Douglas Katzman95354292015-06-23 20:42:09 +000010509void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10510 const InputInfo &Output,
10511 const InputInfoList &Inputs,
10512 const ArgList &Args,
10513 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010514 ArgStringList CmdArgs;
10515
10516 assert(Inputs.size() == 1);
10517 const InputInfo &II = Inputs[0];
10518 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10519 assert(Output.getType() == types::TY_Object);
10520
10521 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010522 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10523 if (CPUArg)
10524 CmdArgs.push_back(
10525 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010526 CmdArgs.push_back("-noSPrefixing");
10527 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010528 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10529 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10530 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010531 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010532 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010533 }
10534 CmdArgs.push_back("-elf"); // Output format.
10535 CmdArgs.push_back(II.getFilename());
10536 CmdArgs.push_back(
10537 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10538
10539 std::string Exec =
10540 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010541 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10542 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010543}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010544
10545void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10546 const InputInfo &Output,
10547 const InputInfoList &Inputs,
10548 const ArgList &Args,
10549 const char *LinkingOutput) const {
10550 const auto &TC =
10551 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10552 const llvm::Triple &T = TC.getTriple();
10553 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010554 bool UseStartfiles =
10555 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010556 bool UseDefaultLibs =
10557 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010558
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010559 if (T.getArch() == llvm::Triple::sparc)
10560 CmdArgs.push_back("-EB");
10561 else // SHAVE assumes little-endian, and sparcel is expressly so.
10562 CmdArgs.push_back("-EL");
10563
10564 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10565 // but we never pass through a --sysroot option and various other bits.
10566 // For example, there are no sanitizers (yet) nor gold linker.
10567
10568 // Eat some arguments that may be present but have no effect.
10569 Args.ClaimAllArgs(options::OPT_g_Group);
10570 Args.ClaimAllArgs(options::OPT_w);
10571 Args.ClaimAllArgs(options::OPT_static_libgcc);
10572
10573 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10574 CmdArgs.push_back("-s");
10575
10576 CmdArgs.push_back("-o");
10577 CmdArgs.push_back(Output.getFilename());
10578
10579 if (UseStartfiles) {
10580 // If you want startfiles, it means you want the builtin crti and crtbegin,
10581 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010582 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10583 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010584 }
10585
10586 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10587 options::OPT_e, options::OPT_s, options::OPT_t,
10588 options::OPT_Z_Flag, options::OPT_r});
10589
Douglas Katzman674a3122015-11-18 16:24:46 +000010590 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010591
10592 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10593
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010594 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010595 if (C.getDriver().CCCIsCXX())
10596 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010597 if (T.getOS() == llvm::Triple::RTEMS) {
10598 CmdArgs.push_back("--start-group");
10599 CmdArgs.push_back("-lc");
10600 // You must provide your own "-L" option to enable finding these.
10601 CmdArgs.push_back("-lrtemscpu");
10602 CmdArgs.push_back("-lrtemsbsp");
10603 CmdArgs.push_back("--end-group");
10604 } else {
10605 CmdArgs.push_back("-lc");
10606 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010607 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010608 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010609 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010610 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10611 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010612 }
10613
10614 std::string Exec =
10615 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10616 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10617 CmdArgs, Inputs));
10618}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010619
10620void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10621 const InputInfo &Output,
10622 const InputInfoList &Inputs,
10623 const ArgList &Args,
10624 const char *LinkingOutput) const {
10625 claimNoWarnArgs(Args);
10626 ArgStringList CmdArgs;
10627
10628 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10629
10630 CmdArgs.push_back("-o");
10631 CmdArgs.push_back(Output.getFilename());
10632
10633 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10634 const InputInfo &Input = Inputs[0];
10635 assert(Input.isFilename() && "Invalid input.");
10636 CmdArgs.push_back(Input.getFilename());
10637
10638 const char *Exec =
10639 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10640 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10641}
10642
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010643static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10644 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10645 if (SanArgs.needsUbsanRt()) {
10646 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10647 }
10648 if (SanArgs.needsAsanRt()) {
10649 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10650 }
10651}
10652
10653static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10654 const JobAction &JA, const InputInfo &Output,
10655 const InputInfoList &Inputs,
10656 const ArgList &Args,
10657 const char *LinkingOutput) {
10658 const toolchains::FreeBSD &ToolChain =
10659 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10660 const Driver &D = ToolChain.getDriver();
10661 ArgStringList CmdArgs;
10662
10663 // Silence warning for "clang -g foo.o -o foo"
10664 Args.ClaimAllArgs(options::OPT_g_Group);
10665 // and "clang -emit-llvm foo.o -o foo"
10666 Args.ClaimAllArgs(options::OPT_emit_llvm);
10667 // and for "clang -w foo.o -o foo". Other warning options are already
10668 // handled somewhere else.
10669 Args.ClaimAllArgs(options::OPT_w);
10670
10671 if (!D.SysRoot.empty())
10672 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10673
10674 if (Args.hasArg(options::OPT_pie))
10675 CmdArgs.push_back("-pie");
10676
10677 if (Args.hasArg(options::OPT_rdynamic))
10678 CmdArgs.push_back("-export-dynamic");
10679 if (Args.hasArg(options::OPT_shared))
10680 CmdArgs.push_back("--oformat=so");
10681
10682 if (Output.isFilename()) {
10683 CmdArgs.push_back("-o");
10684 CmdArgs.push_back(Output.getFilename());
10685 } else {
10686 assert(Output.isNothing() && "Invalid output.");
10687 }
10688
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010689 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10690
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010691 Args.AddAllArgs(CmdArgs, options::OPT_L);
10692 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10693 Args.AddAllArgs(CmdArgs, options::OPT_e);
10694 Args.AddAllArgs(CmdArgs, options::OPT_s);
10695 Args.AddAllArgs(CmdArgs, options::OPT_t);
10696 Args.AddAllArgs(CmdArgs, options::OPT_r);
10697
10698 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10699 CmdArgs.push_back("--no-demangle");
10700
10701 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10702
10703 if (Args.hasArg(options::OPT_pthread)) {
10704 CmdArgs.push_back("-lpthread");
10705 }
10706
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010707 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10708
10709 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10710}
10711
10712static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10713 const JobAction &JA, const InputInfo &Output,
10714 const InputInfoList &Inputs,
10715 const ArgList &Args,
10716 const char *LinkingOutput) {
10717 const toolchains::FreeBSD &ToolChain =
10718 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10719 const Driver &D = ToolChain.getDriver();
10720 ArgStringList CmdArgs;
10721
10722 // Silence warning for "clang -g foo.o -o foo"
10723 Args.ClaimAllArgs(options::OPT_g_Group);
10724 // and "clang -emit-llvm foo.o -o foo"
10725 Args.ClaimAllArgs(options::OPT_emit_llvm);
10726 // and for "clang -w foo.o -o foo". Other warning options are already
10727 // handled somewhere else.
10728 Args.ClaimAllArgs(options::OPT_w);
10729
10730 if (!D.SysRoot.empty())
10731 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10732
10733 if (Args.hasArg(options::OPT_pie))
10734 CmdArgs.push_back("-pie");
10735
10736 if (Args.hasArg(options::OPT_static)) {
10737 CmdArgs.push_back("-Bstatic");
10738 } else {
10739 if (Args.hasArg(options::OPT_rdynamic))
10740 CmdArgs.push_back("-export-dynamic");
10741 CmdArgs.push_back("--eh-frame-hdr");
10742 if (Args.hasArg(options::OPT_shared)) {
10743 CmdArgs.push_back("-Bshareable");
10744 } else {
10745 CmdArgs.push_back("-dynamic-linker");
10746 CmdArgs.push_back("/libexec/ld-elf.so.1");
10747 }
10748 CmdArgs.push_back("--enable-new-dtags");
10749 }
10750
10751 if (Output.isFilename()) {
10752 CmdArgs.push_back("-o");
10753 CmdArgs.push_back(Output.getFilename());
10754 } else {
10755 assert(Output.isNothing() && "Invalid output.");
10756 }
10757
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010758 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10759
Douglas Katzman78b37b02015-11-17 20:28:07 +000010760 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010761 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010762 if (!Args.hasArg(options::OPT_shared)) {
10763 if (Args.hasArg(options::OPT_pg))
10764 crt1 = "gcrt1.o";
10765 else if (Args.hasArg(options::OPT_pie))
10766 crt1 = "Scrt1.o";
10767 else
10768 crt1 = "crt1.o";
10769 }
10770 if (crt1)
10771 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10772
10773 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10774
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010775 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010776 if (Args.hasArg(options::OPT_static))
10777 crtbegin = "crtbeginT.o";
10778 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10779 crtbegin = "crtbeginS.o";
10780 else
10781 crtbegin = "crtbegin.o";
10782
10783 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10784 }
10785
10786 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010787 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010788 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10789 Args.AddAllArgs(CmdArgs, options::OPT_e);
10790 Args.AddAllArgs(CmdArgs, options::OPT_s);
10791 Args.AddAllArgs(CmdArgs, options::OPT_t);
10792 Args.AddAllArgs(CmdArgs, options::OPT_r);
10793
10794 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10795 CmdArgs.push_back("--no-demangle");
10796
10797 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10798
Douglas Katzman78b37b02015-11-17 20:28:07 +000010799 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010800 // For PS4, we always want to pass libm, libstdc++ and libkernel
10801 // libraries for both C and C++ compilations.
10802 CmdArgs.push_back("-lkernel");
10803 if (D.CCCIsCXX()) {
10804 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10805 if (Args.hasArg(options::OPT_pg))
10806 CmdArgs.push_back("-lm_p");
10807 else
10808 CmdArgs.push_back("-lm");
10809 }
10810 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10811 // the default system libraries. Just mimic this for now.
10812 if (Args.hasArg(options::OPT_pg))
10813 CmdArgs.push_back("-lgcc_p");
10814 else
10815 CmdArgs.push_back("-lcompiler_rt");
10816 if (Args.hasArg(options::OPT_static)) {
10817 CmdArgs.push_back("-lstdc++");
10818 } else if (Args.hasArg(options::OPT_pg)) {
10819 CmdArgs.push_back("-lgcc_eh_p");
10820 } else {
10821 CmdArgs.push_back("--as-needed");
10822 CmdArgs.push_back("-lstdc++");
10823 CmdArgs.push_back("--no-as-needed");
10824 }
10825
10826 if (Args.hasArg(options::OPT_pthread)) {
10827 if (Args.hasArg(options::OPT_pg))
10828 CmdArgs.push_back("-lpthread_p");
10829 else
10830 CmdArgs.push_back("-lpthread");
10831 }
10832
10833 if (Args.hasArg(options::OPT_pg)) {
10834 if (Args.hasArg(options::OPT_shared))
10835 CmdArgs.push_back("-lc");
10836 else {
10837 if (Args.hasArg(options::OPT_static)) {
10838 CmdArgs.push_back("--start-group");
10839 CmdArgs.push_back("-lc_p");
10840 CmdArgs.push_back("-lpthread_p");
10841 CmdArgs.push_back("--end-group");
10842 } else {
10843 CmdArgs.push_back("-lc_p");
10844 }
10845 }
10846 CmdArgs.push_back("-lgcc_p");
10847 } else {
10848 if (Args.hasArg(options::OPT_static)) {
10849 CmdArgs.push_back("--start-group");
10850 CmdArgs.push_back("-lc");
10851 CmdArgs.push_back("-lpthread");
10852 CmdArgs.push_back("--end-group");
10853 } else {
10854 CmdArgs.push_back("-lc");
10855 }
10856 CmdArgs.push_back("-lcompiler_rt");
10857 }
10858
10859 if (Args.hasArg(options::OPT_static)) {
10860 CmdArgs.push_back("-lstdc++");
10861 } else if (Args.hasArg(options::OPT_pg)) {
10862 CmdArgs.push_back("-lgcc_eh_p");
10863 } else {
10864 CmdArgs.push_back("--as-needed");
10865 CmdArgs.push_back("-lstdc++");
10866 CmdArgs.push_back("--no-as-needed");
10867 }
10868 }
10869
Douglas Katzman78b37b02015-11-17 20:28:07 +000010870 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010871 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10872 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10873 else
10874 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10875 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10876 }
10877
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010878 const char *Exec =
10879#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010880 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010881#else
10882 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10883#endif
10884
10885 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10886}
10887
10888void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10889 const InputInfo &Output,
10890 const InputInfoList &Inputs,
10891 const ArgList &Args,
10892 const char *LinkingOutput) const {
10893 const toolchains::FreeBSD &ToolChain =
10894 static_cast<const toolchains::FreeBSD &>(getToolChain());
10895 const Driver &D = ToolChain.getDriver();
10896 bool PS4Linker;
10897 StringRef LinkerOptName;
10898 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10899 LinkerOptName = A->getValue();
10900 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10901 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10902 }
10903
10904 if (LinkerOptName == "gold")
10905 PS4Linker = false;
10906 else if (LinkerOptName == "ps4")
10907 PS4Linker = true;
10908 else
10909 PS4Linker = !Args.hasArg(options::OPT_shared);
10910
10911 if (PS4Linker)
10912 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10913 else
10914 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10915}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010916
10917void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10918 const InputInfo &Output,
10919 const InputInfoList &Inputs,
10920 const ArgList &Args,
10921 const char *LinkingOutput) const {
10922 const auto &TC =
10923 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010924 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010925
10926 std::vector<std::string> gpu_archs =
10927 Args.getAllArgValues(options::OPT_march_EQ);
10928 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10929 const std::string& gpu_arch = gpu_archs[0];
10930
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010931 ArgStringList CmdArgs;
10932 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010933 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10934 // ptxas does not accept -g option if optimization is enabled, so
10935 // we ignore the compiler's -O* options if we want debug info.
10936 CmdArgs.push_back("-g");
10937 CmdArgs.push_back("--dont-merge-basicblocks");
10938 CmdArgs.push_back("--return-at-end");
10939 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10940 // Map the -O we received to -O{0,1,2,3}.
10941 //
10942 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10943 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010944
Justin Lebar2836dcd2016-01-19 19:52:21 +000010945 // -O3 seems like the least-bad option when -Osomething is specified to
10946 // clang but it isn't handled below.
10947 StringRef OOpt = "3";
10948 if (A->getOption().matches(options::OPT_O4) ||
10949 A->getOption().matches(options::OPT_Ofast))
10950 OOpt = "3";
10951 else if (A->getOption().matches(options::OPT_O0))
10952 OOpt = "0";
10953 else if (A->getOption().matches(options::OPT_O)) {
10954 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10955 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10956 .Case("1", "1")
10957 .Case("2", "2")
10958 .Case("3", "3")
10959 .Case("s", "2")
10960 .Case("z", "2")
10961 .Default("2");
10962 }
10963 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10964 } else {
10965 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10966 // to no optimizations, but ptxas's default is -O3.
10967 CmdArgs.push_back("-O0");
10968 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010969
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010970 CmdArgs.push_back("--gpu-name");
10971 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10972 CmdArgs.push_back("--output-file");
10973 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10974 for (const auto& II : Inputs)
10975 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10976
10977 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10978 CmdArgs.push_back(Args.MakeArgString(A));
10979
10980 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10981 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10982}
10983
10984// All inputs to this linker must be from CudaDeviceActions, as we need to look
10985// at the Inputs' Actions in order to figure out which GPU architecture they
10986// correspond to.
10987void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10988 const InputInfo &Output,
10989 const InputInfoList &Inputs,
10990 const ArgList &Args,
10991 const char *LinkingOutput) const {
10992 const auto &TC =
10993 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010994 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010995
10996 ArgStringList CmdArgs;
10997 CmdArgs.push_back("--cuda");
10998 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10999 CmdArgs.push_back(Args.MakeArgString("--create"));
11000 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11001
11002 for (const auto& II : Inputs) {
11003 auto* A = cast<const CudaDeviceAction>(II.getAction());
11004 // We need to pass an Arch of the form "sm_XX" for cubin files and
11005 // "compute_XX" for ptx.
11006 const char *Arch = (II.getType() == types::TY_PP_Asm)
11007 ? A->getComputeArchName()
11008 : A->getGpuArchName();
11009 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11010 Arch + ",file=" + II.getFilename()));
11011 }
11012
11013 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11014 CmdArgs.push_back(Args.MakeArgString(A));
11015
11016 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11017 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11018}