blob: 75424e870066722d29a053709269fd6c5936b8a4 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001186 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001187 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001188
Brad Smithba26f582015-01-06 02:53:17 +00001189 // MIPS3 is the default for mips64*-unknown-openbsd.
1190 if (Triple.getOS() == llvm::Triple::OpenBSD)
1191 DefMips64CPU = "mips3";
1192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001194 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001195
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001197 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 // Convert a GNU style Mips ABI name to the name
1199 // accepted by LLVM Mips backend.
1200 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001201 .Case("32", "o32")
1202 .Case("64", "n64")
1203 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001204 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001205
1206 // Setup default CPU and ABI names.
1207 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001208 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001209 default:
1210 llvm_unreachable("Unexpected triple arch name");
1211 case llvm::Triple::mips:
1212 case llvm::Triple::mipsel:
1213 CPUName = DefMips32CPU;
1214 break;
1215 case llvm::Triple::mips64:
1216 case llvm::Triple::mips64el:
1217 CPUName = DefMips64CPU;
1218 break;
1219 }
1220 }
1221
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001222 if (ABIName.empty()) {
1223 // Deduce ABI name from the target triple.
1224 if (Triple.getArch() == llvm::Triple::mips ||
1225 Triple.getArch() == llvm::Triple::mipsel)
1226 ABIName = "o32";
1227 else
1228 ABIName = "n64";
1229 }
1230
1231 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 // Deduce CPU name from ABI name.
1233 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001234 .Cases("o32", "eabi", DefMips32CPU)
1235 .Cases("n32", "n64", DefMips64CPU)
1236 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001237 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001238
1239 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001240}
1241
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001242std::string mips::getMipsABILibSuffix(const ArgList &Args,
1243 const llvm::Triple &Triple) {
1244 StringRef CPUName, ABIName;
1245 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1246 return llvm::StringSwitch<std::string>(ABIName)
1247 .Case("o32", "")
1248 .Case("n32", "32")
1249 .Case("n64", "64");
1250}
1251
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252// Convert ABI name to the GNU tools acceptable variant.
1253static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1254 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001255 .Case("o32", "32")
1256 .Case("n64", "64")
1257 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001258}
1259
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001260// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1261// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1263 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001264 if (Arg *A =
1265 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1266 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001267 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001268 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1273 .Case("soft", mips::FloatABI::Soft)
1274 .Case("hard", mips::FloatABI::Hard)
1275 .Default(mips::FloatABI::Invalid);
1276 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001277 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 }
1280 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
1283 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001284 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001285 // Assume "hard", because it's a default value used by gcc.
1286 // When we start to recognize specific target MIPS processors,
1287 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001288 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001289 }
1290
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001291 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1292 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293}
1294
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 std::vector<const char *> &Features,
1297 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 StringRef FeatureName) {
1299 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001300 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001302 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001304 }
1305}
1306
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1308 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001309 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001310 StringRef CPUName;
1311 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001313 ABIName = getGnuCompatibleMipsABIName(ABIName);
1314
Daniel Sandersfeb61302014-08-08 15:47:17 +00001315 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1316 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001317
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001318 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1319 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001320 // FIXME: Note, this is a hack. We need to pass the selected float
1321 // mode to the MipsTargetInfoBase to define appropriate macros there.
1322 // Now it is the only method.
1323 Features.push_back("+soft-float");
1324 }
1325
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001327 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001328 if (Val == "2008") {
1329 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1330 Features.push_back("+nan2008");
1331 else {
1332 Features.push_back("-nan2008");
1333 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1334 }
1335 } else if (Val == "legacy") {
1336 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1337 Features.push_back("-nan2008");
1338 else {
1339 Features.push_back("+nan2008");
1340 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1341 }
1342 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001343 D.Diag(diag::err_drv_unsupported_option_argument)
1344 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001345 }
1346
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001347 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1348 options::OPT_mdouble_float, "single-float");
1349 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1350 "mips16");
1351 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1352 options::OPT_mno_micromips, "micromips");
1353 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1354 "dsp");
1355 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1356 "dspr2");
1357 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1358 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001359
1360 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1361 // pass -mfpxx
1362 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1363 options::OPT_mfp64)) {
1364 if (A->getOption().matches(options::OPT_mfp32))
1365 Features.push_back(Args.MakeArgString("-fp64"));
1366 else if (A->getOption().matches(options::OPT_mfpxx)) {
1367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 } else
1370 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001371 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001372 Features.push_back(Args.MakeArgString("+fpxx"));
1373 Features.push_back(Args.MakeArgString("+nooddspreg"));
1374 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001375
Daniel Sanders28e5d392014-07-10 10:39:51 +00001376 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1377 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001378}
1379
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001380void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001381 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382 const Driver &D = getToolChain().getDriver();
1383 StringRef CPUName;
1384 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001385 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001386 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001387
1388 CmdArgs.push_back("-target-abi");
1389 CmdArgs.push_back(ABIName.data());
1390
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1392 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001393 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001397 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001398 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001399 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001400 CmdArgs.push_back("-mfloat-abi");
1401 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001402 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001403
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001404 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1405 if (A->getOption().matches(options::OPT_mxgot)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mxgot");
1408 }
1409 }
1410
Simon Atanasyanc580b322013-05-11 06:33:44 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1412 options::OPT_mno_ldc1_sdc1)) {
1413 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-ldc1-sdc1");
1416 }
1417 }
1418
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001419 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1420 options::OPT_mno_check_zero_division)) {
1421 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1422 CmdArgs.push_back("-mllvm");
1423 CmdArgs.push_back("-mno-check-zero-division");
1424 }
1425 }
1426
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001427 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001428 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001429 CmdArgs.push_back("-mllvm");
1430 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1431 A->claim();
1432 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001433}
1434
Hal Finkel8eb59282012-06-11 22:35:19 +00001435/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1436static std::string getPPCTargetCPU(const ArgList &Args) {
1437 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001438 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001439
1440 if (CPUName == "native") {
1441 std::string CPU = llvm::sys::getHostCPUName();
1442 if (!CPU.empty() && CPU != "generic")
1443 return CPU;
1444 else
1445 return "";
1446 }
1447
1448 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001449 .Case("common", "generic")
1450 .Case("440", "440")
1451 .Case("440fp", "440")
1452 .Case("450", "450")
1453 .Case("601", "601")
1454 .Case("602", "602")
1455 .Case("603", "603")
1456 .Case("603e", "603e")
1457 .Case("603ev", "603ev")
1458 .Case("604", "604")
1459 .Case("604e", "604e")
1460 .Case("620", "620")
1461 .Case("630", "pwr3")
1462 .Case("G3", "g3")
1463 .Case("7400", "7400")
1464 .Case("G4", "g4")
1465 .Case("7450", "7450")
1466 .Case("G4+", "g4+")
1467 .Case("750", "750")
1468 .Case("970", "970")
1469 .Case("G5", "g5")
1470 .Case("a2", "a2")
1471 .Case("a2q", "a2q")
1472 .Case("e500mc", "e500mc")
1473 .Case("e5500", "e5500")
1474 .Case("power3", "pwr3")
1475 .Case("power4", "pwr4")
1476 .Case("power5", "pwr5")
1477 .Case("power5x", "pwr5x")
1478 .Case("power6", "pwr6")
1479 .Case("power6x", "pwr6x")
1480 .Case("power7", "pwr7")
1481 .Case("power8", "pwr8")
1482 .Case("pwr3", "pwr3")
1483 .Case("pwr4", "pwr4")
1484 .Case("pwr5", "pwr5")
1485 .Case("pwr5x", "pwr5x")
1486 .Case("pwr6", "pwr6")
1487 .Case("pwr6x", "pwr6x")
1488 .Case("pwr7", "pwr7")
1489 .Case("pwr8", "pwr8")
1490 .Case("powerpc", "ppc")
1491 .Case("powerpc64", "ppc64")
1492 .Case("powerpc64le", "ppc64le")
1493 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001494 }
1495
1496 return "";
1497}
1498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1500 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001501 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001502 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001503
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001504 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1505 if (FloatABI == ppc::FloatABI::Soft &&
1506 !(Triple.getArch() == llvm::Triple::ppc64 ||
1507 Triple.getArch() == llvm::Triple::ppc64le))
1508 Features.push_back("+soft-float");
1509 else if (FloatABI == ppc::FloatABI::Soft &&
1510 (Triple.getArch() == llvm::Triple::ppc64 ||
1511 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001512 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001513 << "soft float is not supported for ppc64";
1514
Eric Christopher643bb6a2013-10-16 20:40:08 +00001515 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001516 AddTargetFeature(Args, Features, options::OPT_faltivec,
1517 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001518}
1519
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001520ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1521 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1522 if (Arg *A =
1523 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1524 options::OPT_mfloat_abi_EQ)) {
1525 if (A->getOption().matches(options::OPT_msoft_float))
1526 ABI = ppc::FloatABI::Soft;
1527 else if (A->getOption().matches(options::OPT_mhard_float))
1528 ABI = ppc::FloatABI::Hard;
1529 else {
1530 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1531 .Case("soft", ppc::FloatABI::Soft)
1532 .Case("hard", ppc::FloatABI::Hard)
1533 .Default(ppc::FloatABI::Invalid);
1534 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1535 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1536 ABI = ppc::FloatABI::Hard;
1537 }
1538 }
1539 }
1540
1541 // If unspecified, choose the default based on the platform.
1542 if (ABI == ppc::FloatABI::Invalid) {
1543 ABI = ppc::FloatABI::Hard;
1544 }
1545
1546 return ABI;
1547}
1548
Ulrich Weigand8afad612014-07-28 13:17:52 +00001549void Clang::AddPPCTargetArgs(const ArgList &Args,
1550 ArgStringList &CmdArgs) const {
1551 // Select the ABI to use.
1552 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001553 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001554 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001555 case llvm::Triple::ppc64: {
1556 // When targeting a processor that supports QPX, or if QPX is
1557 // specifically enabled, default to using the ABI that supports QPX (so
1558 // long as it is not specifically disabled).
1559 bool HasQPX = false;
1560 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1561 HasQPX = A->getValue() == StringRef("a2q");
1562 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1563 if (HasQPX) {
1564 ABIName = "elfv1-qpx";
1565 break;
1566 }
1567
Ulrich Weigand8afad612014-07-28 13:17:52 +00001568 ABIName = "elfv1";
1569 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001570 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571 case llvm::Triple::ppc64le:
1572 ABIName = "elfv2";
1573 break;
1574 default:
1575 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001576 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001577
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001578 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1579 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1580 // the option if given as we don't have backend support for any targets
1581 // that don't use the altivec abi.
1582 if (StringRef(A->getValue()) != "altivec")
1583 ABIName = A->getValue();
1584
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001585 ppc::FloatABI FloatABI =
1586 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1587
1588 if (FloatABI == ppc::FloatABI::Soft) {
1589 // Floating point operations and argument passing are soft.
1590 CmdArgs.push_back("-msoft-float");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("soft");
1593 } else {
1594 // Floating point operations and argument passing are hard.
1595 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1596 CmdArgs.push_back("-mfloat-abi");
1597 CmdArgs.push_back("hard");
1598 }
1599
Ulrich Weigand8afad612014-07-28 13:17:52 +00001600 if (ABIName) {
1601 CmdArgs.push_back("-target-abi");
1602 CmdArgs.push_back(ABIName);
1603 }
1604}
1605
1606bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1607 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1608 return A && (A->getValue() == StringRef(Value));
1609}
1610
Tom Stellard6674c702013-04-01 20:56:53 +00001611/// Get the (LLVM) name of the R600 gpu we are targeting.
1612static std::string getR600TargetGPU(const ArgList &Args) {
1613 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001614 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001615 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001616 .Cases("rv630", "rv635", "r600")
1617 .Cases("rv610", "rv620", "rs780", "rs880")
1618 .Case("rv740", "rv770")
1619 .Case("palm", "cedar")
1620 .Cases("sumo", "sumo2", "sumo")
1621 .Case("hemlock", "cypress")
1622 .Case("aruba", "cayman")
1623 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001624 }
1625 return "";
1626}
1627
Jacques Pienaard964cc22016-03-28 21:02:54 +00001628static std::string getLanaiTargetCPU(const ArgList &Args) {
1629 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1630 return A->getValue();
1631 }
1632 return "";
1633}
1634
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001635void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001636 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001637 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001638 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001639
James Y Knightb2406522015-06-15 20:51:24 +00001640 bool SoftFloatABI = false;
1641 if (Arg *A =
1642 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001643 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001644 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001645 }
1646
James Y Knightb2406522015-06-15 20:51:24 +00001647 // Only the hard-float ABI on Sparc is standardized, and it is the
1648 // default. GCC also supports a nonstandard soft-float ABI mode, and
1649 // perhaps LLVM should implement that, too. However, since llvm
1650 // currently does not support Sparc soft-float, at all, display an
1651 // error if it's requested.
1652 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1654 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001655 }
1656}
1657
Richard Sandiford4652d892013-07-19 16:51:51 +00001658static const char *getSystemZTargetCPU(const ArgList &Args) {
1659 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1660 return A->getValue();
1661 return "z10";
1662}
1663
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001664static void getSystemZTargetFeatures(const ArgList &Args,
1665 std::vector<const char *> &Features) {
1666 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001667 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001668 if (A->getOption().matches(options::OPT_mhtm))
1669 Features.push_back("+transactional-execution");
1670 else
1671 Features.push_back("-transactional-execution");
1672 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001673 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001674 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001675 if (A->getOption().matches(options::OPT_mvx))
1676 Features.push_back("+vector");
1677 else
1678 Features.push_back("-vector");
1679 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001680}
1681
Chandler Carruth953fb082013-01-13 11:46:33 +00001682static const char *getX86TargetCPU(const ArgList &Args,
1683 const llvm::Triple &Triple) {
1684 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001686 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001687 return "core-avx2";
1688
Chandler Carruth953fb082013-01-13 11:46:33 +00001689 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001690 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001691
1692 // FIXME: Reject attempts to use -march=native unless the target matches
1693 // the host.
1694 //
1695 // FIXME: We should also incorporate the detected target features for use
1696 // with -native.
1697 std::string CPU = llvm::sys::getHostCPUName();
1698 if (!CPU.empty() && CPU != "generic")
1699 return Args.MakeArgString(CPU);
1700 }
1701
Reid Kleckner3123eff2015-06-30 16:32:04 +00001702 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1703 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1704 StringRef Arch = A->getValue();
1705 const char *CPU;
1706 if (Triple.getArch() == llvm::Triple::x86) {
1707 CPU = llvm::StringSwitch<const char *>(Arch)
1708 .Case("IA32", "i386")
1709 .Case("SSE", "pentium3")
1710 .Case("SSE2", "pentium4")
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 } else {
1715 CPU = llvm::StringSwitch<const char *>(Arch)
1716 .Case("AVX", "sandybridge")
1717 .Case("AVX2", "haswell")
1718 .Default(nullptr);
1719 }
1720 if (CPU)
1721 return CPU;
1722 }
1723
Chandler Carruth953fb082013-01-13 11:46:33 +00001724 // Select the default CPU if none was given (or detection failed).
1725
1726 if (Triple.getArch() != llvm::Triple::x86_64 &&
1727 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001728 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001729
1730 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1731
1732 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001733 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001734 if (Triple.getArchName() == "x86_64h")
1735 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001736 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001737 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001738
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001739 // Set up default CPU name for PS4 compilers.
1740 if (Triple.isPS4CPU())
1741 return "btver2";
1742
Alexey Bataev286d1b92014-01-31 04:07:13 +00001743 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001744 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001745 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001746
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001747 // Everything else goes to x86-64 in 64-bit mode.
1748 if (Is64Bit)
1749 return "x86-64";
1750
1751 switch (Triple.getOS()) {
1752 case llvm::Triple::FreeBSD:
1753 case llvm::Triple::NetBSD:
1754 case llvm::Triple::OpenBSD:
1755 return "i486";
1756 case llvm::Triple::Haiku:
1757 return "i586";
1758 case llvm::Triple::Bitrig:
1759 return "i686";
1760 default:
1761 // Fallback to p4.
1762 return "pentium4";
1763 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001764}
1765
Dan Gohmanc2853072015-09-03 22:51:53 +00001766/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1767static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1768 // If we have -mcpu=, use that.
1769 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1770 StringRef CPU = A->getValue();
1771
1772#ifdef __wasm__
1773 // Handle "native" by examining the host. "native" isn't meaningful when
1774 // cross compiling, so only support this when the host is also WebAssembly.
1775 if (CPU == "native")
1776 return llvm::sys::getHostCPUName();
1777#endif
1778
1779 return CPU;
1780 }
1781
1782 return "generic";
1783}
1784
Renato Golin7c542b42015-07-27 23:44:45 +00001785static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1786 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 default:
1789 return "";
1790
Amara Emerson703da2e2013-10-31 09:32:33 +00001791 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001792 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001793 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001794
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001796 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001797 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001798 case llvm::Triple::thumbeb: {
1799 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001800 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001801 return arm::getARMTargetCPU(MCPU, MArch, T);
1802 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001803 case llvm::Triple::mips:
1804 case llvm::Triple::mipsel:
1805 case llvm::Triple::mips64:
1806 case llvm::Triple::mips64el: {
1807 StringRef CPUName;
1808 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001809 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001810 return CPUName;
1811 }
1812
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001813 case llvm::Triple::nvptx:
1814 case llvm::Triple::nvptx64:
1815 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1816 return A->getValue();
1817 return "";
1818
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001819 case llvm::Triple::ppc:
1820 case llvm::Triple::ppc64:
1821 case llvm::Triple::ppc64le: {
1822 std::string TargetCPUName = getPPCTargetCPU(Args);
1823 // LLVM may default to generating code for the native CPU,
1824 // but, like gcc, we default to a more generic option for
1825 // each architecture. (except on Darwin)
1826 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1827 if (T.getArch() == llvm::Triple::ppc64)
1828 TargetCPUName = "ppc64";
1829 else if (T.getArch() == llvm::Triple::ppc64le)
1830 TargetCPUName = "ppc64le";
1831 else
1832 TargetCPUName = "ppc";
1833 }
1834 return TargetCPUName;
1835 }
1836
1837 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001838 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001839 case llvm::Triple::sparcv9:
1840 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001841 return A->getValue();
1842 return "";
1843
1844 case llvm::Triple::x86:
1845 case llvm::Triple::x86_64:
1846 return getX86TargetCPU(Args, T);
1847
1848 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001849 return "hexagon" +
1850 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001851
Jacques Pienaard964cc22016-03-28 21:02:54 +00001852 case llvm::Triple::lanai:
1853 return getLanaiTargetCPU(Args);
1854
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 case llvm::Triple::systemz:
1856 return getSystemZTargetCPU(Args);
1857
1858 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001859 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001861
1862 case llvm::Triple::wasm32:
1863 case llvm::Triple::wasm64:
1864 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001865 }
1866}
1867
Alp Tokerce365ca2013-12-02 12:43:03 +00001868static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001869 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001870 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1871 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1872 // forward.
1873 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 std::string Plugin =
1875 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001876 CmdArgs.push_back(Args.MakeArgString(Plugin));
1877
1878 // Try to pass driver level flags relevant to LTO code generation down to
1879 // the plugin.
1880
1881 // Handle flags for selecting CPU variants.
1882 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1883 if (!CPU.empty())
1884 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001885
James Molloyf97fdae2015-12-21 10:44:36 +00001886 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1887 StringRef OOpt;
1888 if (A->getOption().matches(options::OPT_O4) ||
1889 A->getOption().matches(options::OPT_Ofast))
1890 OOpt = "3";
1891 else if (A->getOption().matches(options::OPT_O))
1892 OOpt = A->getValue();
1893 else if (A->getOption().matches(options::OPT_O0))
1894 OOpt = "0";
1895 if (!OOpt.empty())
1896 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1897 }
1898
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001899 if (IsThinLTO)
1900 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001901
1902 // If an explicit debugger tuning argument appeared, pass it along.
1903 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1904 options::OPT_ggdbN_Group)) {
1905 if (A->getOption().matches(options::OPT_glldb))
1906 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1907 else if (A->getOption().matches(options::OPT_gsce))
1908 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1909 else
1910 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1911 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001912}
1913
Sanjay Patel2987c292015-06-11 14:53:41 +00001914/// This is a helper function for validating the optional refinement step
1915/// parameter in reciprocal argument strings. Return false if there is an error
1916/// parsing the refinement step. Otherwise, return true and set the Position
1917/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001918static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001920 const char RefinementStepToken = ':';
1921 Position = In.find(RefinementStepToken);
1922 if (Position != StringRef::npos) {
1923 StringRef Option = A.getOption().getName();
1924 StringRef RefStep = In.substr(Position + 1);
1925 // Allow exactly one numeric character for the additional refinement
1926 // step parameter. This is reasonable for all currently-supported
1927 // operations and architectures because we would expect that a larger value
1928 // of refinement steps would cause the estimate "optimization" to
1929 // under-perform the native operation. Also, if the estimate does not
1930 // converge quickly, it probably will not ever converge, so further
1931 // refinement steps will not produce a better answer.
1932 if (RefStep.size() != 1) {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 char RefStepChar = RefStep[0];
1937 if (RefStepChar < '0' || RefStepChar > '9') {
1938 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1939 return false;
1940 }
1941 }
1942 return true;
1943}
1944
1945/// The -mrecip flag requires processing of many optional parameters.
1946static void ParseMRecip(const Driver &D, const ArgList &Args,
1947 ArgStringList &OutStrings) {
1948 StringRef DisabledPrefixIn = "!";
1949 StringRef DisabledPrefixOut = "!";
1950 StringRef EnabledPrefixOut = "";
1951 StringRef Out = "-mrecip=";
1952
1953 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1954 if (!A)
1955 return;
1956
1957 unsigned NumOptions = A->getNumValues();
1958 if (NumOptions == 0) {
1959 // No option is the same as "all".
1960 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1961 return;
1962 }
1963
1964 // Pass through "all", "none", or "default" with an optional refinement step.
1965 if (NumOptions == 1) {
1966 StringRef Val = A->getValue(0);
1967 size_t RefStepLoc;
1968 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1969 return;
1970 StringRef ValBase = Val.slice(0, RefStepLoc);
1971 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1972 OutStrings.push_back(Args.MakeArgString(Out + Val));
1973 return;
1974 }
1975 }
1976
1977 // Each reciprocal type may be enabled or disabled individually.
1978 // Check each input value for validity, concatenate them all back together,
1979 // and pass through.
1980
1981 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001982 OptionStrings.insert(std::make_pair("divd", false));
1983 OptionStrings.insert(std::make_pair("divf", false));
1984 OptionStrings.insert(std::make_pair("vec-divd", false));
1985 OptionStrings.insert(std::make_pair("vec-divf", false));
1986 OptionStrings.insert(std::make_pair("sqrtd", false));
1987 OptionStrings.insert(std::make_pair("sqrtf", false));
1988 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1989 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001990
1991 for (unsigned i = 0; i != NumOptions; ++i) {
1992 StringRef Val = A->getValue(i);
1993
1994 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1995 // Ignore the disablement token for string matching.
1996 if (IsDisabled)
1997 Val = Val.substr(1);
1998
1999 size_t RefStep;
2000 if (!getRefinementStep(Val, D, *A, RefStep))
2001 return;
2002
2003 StringRef ValBase = Val.slice(0, RefStep);
2004 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2005 if (OptionIter == OptionStrings.end()) {
2006 // Try again specifying float suffix.
2007 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2008 if (OptionIter == OptionStrings.end()) {
2009 // The input name did not match any known option string.
2010 D.Diag(diag::err_drv_unknown_argument) << Val;
2011 return;
2012 }
2013 // The option was specified without a float or double suffix.
2014 // Make sure that the double entry was not already specified.
2015 // The float entry will be checked below.
2016 if (OptionStrings[ValBase.str() + 'd']) {
2017 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2018 return;
2019 }
2020 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002021
Sanjay Patel2987c292015-06-11 14:53:41 +00002022 if (OptionIter->second == true) {
2023 // Duplicate option specified.
2024 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2025 return;
2026 }
2027
2028 // Mark the matched option as found. Do not allow duplicate specifiers.
2029 OptionIter->second = true;
2030
2031 // If the precision was not specified, also mark the double entry as found.
2032 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2033 OptionStrings[ValBase.str() + 'd'] = true;
2034
2035 // Build the output string.
2036 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2037 Out = Args.MakeArgString(Out + Prefix + Val);
2038 if (i != NumOptions - 1)
2039 Out = Args.MakeArgString(Out + ",");
2040 }
2041
2042 OutStrings.push_back(Args.MakeArgString(Out));
2043}
2044
Eric Christopherc54920a2015-03-23 19:26:05 +00002045static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002046 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002047 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002048 // If -march=native, autodetect the feature list.
2049 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2050 if (StringRef(A->getValue()) == "native") {
2051 llvm::StringMap<bool> HostFeatures;
2052 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2053 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054 Features.push_back(
2055 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002056 }
2057 }
2058
Jim Grosbach82eee262013-11-16 00:53:35 +00002059 if (Triple.getArchName() == "x86_64h") {
2060 // x86_64h implies quite a few of the more modern subtarget features
2061 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2062 Features.push_back("-rdrnd");
2063 Features.push_back("-aes");
2064 Features.push_back("-pclmul");
2065 Features.push_back("-rtm");
2066 Features.push_back("-hle");
2067 Features.push_back("-fsgsbase");
2068 }
2069
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002070 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002071 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002072 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002073 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002074 Features.push_back("+sse4.2");
2075 Features.push_back("+popcnt");
2076 } else
2077 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002078 }
2079
Eric Christopherc54920a2015-03-23 19:26:05 +00002080 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2082 StringRef Arch = A->getValue();
2083 bool ArchUsed = false;
2084 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002085 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002086 if (Arch == "AVX" || Arch == "AVX2") {
2087 ArchUsed = true;
2088 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2089 }
2090 }
2091 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002092 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002093 if (Arch == "IA32") {
2094 ArchUsed = true;
2095 } else if (Arch == "SSE" || Arch == "SSE2") {
2096 ArchUsed = true;
2097 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2098 }
2099 }
2100 if (!ArchUsed)
2101 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2102 }
2103
Jim Grosbach82eee262013-11-16 00:53:35 +00002104 // Now add any that the user explicitly requested on the command line,
2105 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002106 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002107}
2108
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002109void Clang::AddX86TargetArgs(const ArgList &Args,
2110 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002112 Args.hasArg(options::OPT_mkernel) ||
2113 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002114 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002115
Bob Wilson2616e2e2013-02-10 16:01:41 +00002116 // Default to avoid implicit floating-point for kernel/kext code, but allow
2117 // that to be overridden with -mno-soft-float.
2118 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2119 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002120 if (Arg *A = Args.getLastArg(
2121 options::OPT_msoft_float, options::OPT_mno_soft_float,
2122 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002123 const Option &O = A->getOption();
2124 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2125 O.matches(options::OPT_msoft_float));
2126 }
2127 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002128 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002129
2130 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2131 StringRef Value = A->getValue();
2132 if (Value == "intel" || Value == "att") {
2133 CmdArgs.push_back("-mllvm");
2134 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2135 } else {
2136 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2137 << A->getOption().getName() << Value;
2138 }
2139 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002140}
2141
Tony Linthicum76329bf2011-12-12 21:14:55 +00002142void Clang::AddHexagonTargetArgs(const ArgList &Args,
2143 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002144 CmdArgs.push_back("-mqdsp6-compat");
2145 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002146
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002147 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2148 std::string N = llvm::utostr(G.getValue());
2149 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002151 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002152 }
2153
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002154 if (!Args.hasArg(options::OPT_fno_short_enums))
2155 CmdArgs.push_back("-fshort-enums");
2156 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 CmdArgs.push_back("-mllvm");
2158 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002159 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002160 CmdArgs.push_back("-mllvm");
2161 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002162}
2163
Jacques Pienaard964cc22016-03-28 21:02:54 +00002164void Clang::AddLanaiTargetArgs(const ArgList &Args,
2165 ArgStringList &CmdArgs) const {
2166 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2167 StringRef CPUName = A->getValue();
2168
2169 CmdArgs.push_back("-target-cpu");
2170 CmdArgs.push_back(Args.MakeArgString(CPUName));
2171 }
2172 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2173 StringRef Value = A->getValue();
2174 // Only support mregparm=4 to support old usage. Report error for all other
2175 // cases.
2176 int Mregparm;
2177 if (Value.getAsInteger(10, Mregparm)) {
2178 if (Mregparm != 4) {
2179 getToolChain().getDriver().Diag(
2180 diag::err_drv_unsupported_option_argument)
2181 << A->getOption().getName() << Value;
2182 }
2183 }
2184 }
2185}
2186
Dan Gohmane3d71e12016-01-07 01:00:21 +00002187void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2188 ArgStringList &CmdArgs) const {
2189 // Default to "hidden" visibility.
2190 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2191 options::OPT_fvisibility_ms_compat)) {
2192 CmdArgs.push_back("-fvisibility");
2193 CmdArgs.push_back("hidden");
2194 }
2195}
2196
Kevin Qin110db6f2014-07-18 07:03:22 +00002197// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002198static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002199 std::vector<const char *> &Features) {
2200 SmallVector<StringRef, 8> Split;
2201 text.split(Split, StringRef("+"), -1, false);
2202
Benjamin Kramer72e64312015-09-24 14:48:49 +00002203 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002204 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002205 .Case("fp", "+fp-armv8")
2206 .Case("simd", "+neon")
2207 .Case("crc", "+crc")
2208 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002209 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002210 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002211 .Case("nofp", "-fp-armv8")
2212 .Case("nosimd", "-neon")
2213 .Case("nocrc", "-crc")
2214 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002215 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002216 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002217 .Default(nullptr);
2218 if (result)
2219 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002220 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002221 D.Diag(diag::err_drv_no_neon_modifier);
2222 else
2223 return false;
2224 }
2225 return true;
2226}
2227
2228// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2229// decode CPU and feature.
2230static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2231 std::vector<const char *> &Features) {
2232 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2233 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002234 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002235 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2236 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002237 Features.push_back("+neon");
2238 Features.push_back("+crc");
2239 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002240 } else if (CPU == "cyclone") {
2241 Features.push_back("+neon");
2242 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002243 } else if (CPU == "generic") {
2244 Features.push_back("+neon");
2245 } else {
2246 return false;
2247 }
2248
2249 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2250 return false;
2251
2252 return true;
2253}
2254
2255static bool
2256getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2257 const ArgList &Args,
2258 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002259 std::string MarchLowerCase = March.lower();
2260 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002261
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002262 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002263 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002264 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002265 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002266 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2267 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002268 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002269 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002270 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002271
2272 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2273 return false;
2274
2275 return true;
2276}
2277
2278static bool
2279getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2280 const ArgList &Args,
2281 std::vector<const char *> &Features) {
2282 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002283 std::string McpuLowerCase = Mcpu.lower();
2284 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002285 return false;
2286
2287 return true;
2288}
2289
2290static bool
2291getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2292 const ArgList &Args,
2293 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002294 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002295 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002296 if (MtuneLowerCase == "native")
2297 MtuneLowerCase = llvm::sys::getHostCPUName();
2298 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002299 Features.push_back("+zcm");
2300 Features.push_back("+zcz");
2301 }
2302 return true;
2303}
2304
2305static bool
2306getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2307 const ArgList &Args,
2308 std::vector<const char *> &Features) {
2309 StringRef CPU;
2310 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002311 std::string McpuLowerCase = Mcpu.lower();
2312 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002313 return false;
2314
2315 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2316}
2317
Justin Bognerf9052562015-11-13 23:07:31 +00002318static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002319 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002320 Arg *A;
2321 bool success = true;
2322 // Enable NEON by default.
2323 Features.push_back("+neon");
2324 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2325 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2326 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2327 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002328 else if (Args.hasArg(options::OPT_arch))
2329 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2330 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002331
2332 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2333 success =
2334 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2335 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2336 success =
2337 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002338 else if (Args.hasArg(options::OPT_arch))
2339 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2340 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002341
2342 if (!success)
2343 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002344
2345 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2346 Features.push_back("-fp-armv8");
2347 Features.push_back("-crypto");
2348 Features.push_back("-neon");
2349 }
Bradley Smith418c5932014-05-02 15:17:51 +00002350
2351 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002352 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002353 if (A->getOption().matches(options::OPT_mcrc))
2354 Features.push_back("+crc");
2355 else
2356 Features.push_back("-crc");
2357 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002358
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002359 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2360 options::OPT_munaligned_access))
2361 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2362 Features.push_back("+strict-align");
2363
Justin Bognerf9052562015-11-13 23:07:31 +00002364 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002365 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002366}
2367
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002368static void getHexagonTargetFeatures(const ArgList &Args,
2369 std::vector<const char *> &Features) {
2370 bool HasHVX = false, HasHVXD = false;
2371
Eric Christopher49062a52015-12-22 03:12:34 +00002372 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2373 // doing dependent option handling here rather than in initFeatureMap or a
2374 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002375 for (auto &A : Args) {
2376 auto &Opt = A->getOption();
2377 if (Opt.matches(options::OPT_mhexagon_hvx))
2378 HasHVX = true;
2379 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2380 HasHVXD = HasHVX = false;
2381 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2382 HasHVXD = HasHVX = true;
2383 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2384 HasHVXD = false;
2385 else
2386 continue;
2387 A->claim();
2388 }
2389
2390 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2391 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2392}
2393
Dan Gohmanc2853072015-09-03 22:51:53 +00002394static void getWebAssemblyTargetFeatures(const ArgList &Args,
2395 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002396 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002397}
2398
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002399static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2400 std::vector<const char *> &Features) {
2401 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2402 StringRef value = dAbi->getValue();
2403 if (value == "1.0") {
2404 Features.push_back("+amdgpu-debugger-insert-nops");
2405 Features.push_back("+amdgpu-debugger-reserve-trap-regs");
2406 } else {
2407 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2408 }
2409 }
2410
2411 handleTargetFeaturesGroup(
2412 Args, Features, options::OPT_m_amdgpu_Features_Group);
2413}
2414
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002415static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002416 const ArgList &Args, ArgStringList &CmdArgs,
2417 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002418 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002419 std::vector<const char *> Features;
2420 switch (Triple.getArch()) {
2421 default:
2422 break;
2423 case llvm::Triple::mips:
2424 case llvm::Triple::mipsel:
2425 case llvm::Triple::mips64:
2426 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002427 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002428 break;
2429
2430 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002431 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002432 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002433 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002434 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002435 break;
2436
2437 case llvm::Triple::ppc:
2438 case llvm::Triple::ppc64:
2439 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002440 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002441 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002442 case llvm::Triple::systemz:
2443 getSystemZTargetFeatures(Args, Features);
2444 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002445 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002446 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002447 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002448 break;
2449 case llvm::Triple::x86:
2450 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002451 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002452 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002453 case llvm::Triple::hexagon:
2454 getHexagonTargetFeatures(Args, Features);
2455 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002456 case llvm::Triple::wasm32:
2457 case llvm::Triple::wasm64:
2458 getWebAssemblyTargetFeatures(Args, Features);
2459 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002460 case llvm::Triple::r600:
2461 case llvm::Triple::amdgcn:
2462 getAMDGPUTargetFeatures(D, Args, Features);
2463 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002464 }
Rafael Espindola43964802013-08-21 17:34:32 +00002465
2466 // Find the last of each feature.
2467 llvm::StringMap<unsigned> LastOpt;
2468 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2469 const char *Name = Features[I];
2470 assert(Name[0] == '-' || Name[0] == '+');
2471 LastOpt[Name + 1] = I;
2472 }
2473
2474 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2475 // If this feature was overridden, ignore it.
2476 const char *Name = Features[I];
2477 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2478 assert(LastI != LastOpt.end());
2479 unsigned Last = LastI->second;
2480 if (Last != I)
2481 continue;
2482
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002483 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002484 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002485 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002486}
2487
David Majnemerae394812014-12-09 00:12:30 +00002488static bool
2489shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2490 const llvm::Triple &Triple) {
2491 // We use the zero-cost exception tables for Objective-C if the non-fragile
2492 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2493 // later.
2494 if (runtime.isNonFragile())
2495 return true;
2496
2497 if (!Triple.isMacOSX())
2498 return false;
2499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002500 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002501 (Triple.getArch() == llvm::Triple::x86_64 ||
2502 Triple.getArch() == llvm::Triple::arm));
2503}
2504
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002505/// Adds exception related arguments to the driver command arguments. There's a
2506/// master flag, -fexceptions and also language specific flags to enable/disable
2507/// C++ and Objective-C exceptions. This makes it possible to for example
2508/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002509static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002510 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002511 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002512 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002513 const Driver &D = TC.getDriver();
2514 const llvm::Triple &Triple = TC.getTriple();
2515
Chad Rosier4fab82c2012-03-26 22:04:46 +00002516 if (KernelOrKext) {
2517 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2518 // arguments now to avoid warnings about unused arguments.
2519 Args.ClaimAllArgs(options::OPT_fexceptions);
2520 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2521 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2522 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2523 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2524 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002525 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002526 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002527
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002528 // See if the user explicitly enabled exceptions.
2529 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2530 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002531
David Majnemerae394812014-12-09 00:12:30 +00002532 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2533 // is not necessarily sensible, but follows GCC.
2534 if (types::isObjC(InputType) &&
2535 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002536 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002537 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002538
David Majnemerae394812014-12-09 00:12:30 +00002539 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002540 }
2541
2542 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002543 // Disable C++ EH by default on XCore and PS4.
2544 bool CXXExceptionsEnabled =
2545 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002546 Arg *ExceptionArg = Args.getLastArg(
2547 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2548 options::OPT_fexceptions, options::OPT_fno_exceptions);
2549 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002550 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002551 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2552 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002553
2554 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002555 if (Triple.isPS4CPU()) {
2556 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2557 assert(ExceptionArg &&
2558 "On the PS4 exceptions should only be enabled if passing "
2559 "an argument");
2560 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2561 const Arg *RTTIArg = TC.getRTTIArg();
2562 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2563 D.Diag(diag::err_drv_argument_not_allowed_with)
2564 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2565 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2566 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2567 } else
2568 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2569
Anders Carlssone96ab552011-02-28 02:27:16 +00002570 CmdArgs.push_back("-fcxx-exceptions");
2571
David Majnemer8de68642014-12-05 08:11:58 +00002572 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002573 }
2574 }
2575
David Majnemer8de68642014-12-05 08:11:58 +00002576 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002577 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002578}
2579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002581 bool Default = true;
2582 if (TC.getTriple().isOSDarwin()) {
2583 // The native darwin assembler doesn't support the linker_option directives,
2584 // so we disable them if we think the .s file will be passed to it.
2585 Default = TC.useIntegratedAs();
2586 }
2587 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2588 Default);
2589}
2590
Ted Kremenek62093662013-03-12 17:02:12 +00002591static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2592 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002593 bool UseDwarfDirectory =
2594 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2595 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002596 return !UseDwarfDirectory;
2597}
2598
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002599/// \brief Check whether the given input tree contains any compilation actions.
2600static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002601 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002602 return true;
2603
Nico Weber5a459f82016-02-23 19:30:43 +00002604 for (const auto &AI : A->inputs())
2605 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002606 return true;
2607
2608 return false;
2609}
2610
2611/// \brief Check if -relax-all should be passed to the internal assembler.
2612/// This is done by default when compiling non-assembler source with -O0.
2613static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2614 bool RelaxDefault = true;
2615
2616 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2617 RelaxDefault = A->getOption().matches(options::OPT_O0);
2618
2619 if (RelaxDefault) {
2620 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002621 for (const auto &Act : C.getActions()) {
2622 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002623 RelaxDefault = true;
2624 break;
2625 }
2626 }
2627 }
2628
2629 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002630 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002631}
2632
Paul Robinson0334a042015-12-19 19:41:48 +00002633// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2634// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002635static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002636 assert(A.getOption().matches(options::OPT_gN_Group) &&
2637 "Not a -g option that specifies a debug-info level");
2638 if (A.getOption().matches(options::OPT_g0) ||
2639 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002640 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002641 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2642 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002643 return codegenoptions::DebugLineTablesOnly;
2644 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002645}
2646
Douglas Katzman3459ce22015-10-08 04:24:12 +00002647// Extract the integer N from a string spelled "-dwarf-N", returning 0
2648// on mismatch. The StringRef input (rather than an Arg) allows
2649// for use by the "-Xassembler" option parser.
2650static unsigned DwarfVersionNum(StringRef ArgValue) {
2651 return llvm::StringSwitch<unsigned>(ArgValue)
2652 .Case("-gdwarf-2", 2)
2653 .Case("-gdwarf-3", 3)
2654 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002655 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002656 .Default(0);
2657}
2658
2659static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002660 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002661 unsigned DwarfVersion,
2662 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002663 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002664 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002665 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2666 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002667 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002668 CmdArgs.push_back("-debug-info-kind=limited");
2669 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002670 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002671 CmdArgs.push_back("-debug-info-kind=standalone");
2672 break;
2673 default:
2674 break;
2675 }
2676 if (DwarfVersion > 0)
2677 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002678 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002679 switch (DebuggerTuning) {
2680 case llvm::DebuggerKind::GDB:
2681 CmdArgs.push_back("-debugger-tuning=gdb");
2682 break;
2683 case llvm::DebuggerKind::LLDB:
2684 CmdArgs.push_back("-debugger-tuning=lldb");
2685 break;
2686 case llvm::DebuggerKind::SCE:
2687 CmdArgs.push_back("-debugger-tuning=sce");
2688 break;
2689 default:
2690 break;
2691 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002692}
2693
David Blaikie9260ed62013-07-25 21:19:01 +00002694static void CollectArgsForIntegratedAssembler(Compilation &C,
2695 const ArgList &Args,
2696 ArgStringList &CmdArgs,
2697 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002698 if (UseRelaxAll(C, Args))
2699 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002700
David Majnemer2b9349d2015-12-21 22:09:34 +00002701 // Only default to -mincremental-linker-compatible if we think we are
2702 // targeting the MSVC linker.
2703 bool DefaultIncrementalLinkerCompatible =
2704 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2705 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2706 options::OPT_mno_incremental_linker_compatible,
2707 DefaultIncrementalLinkerCompatible))
2708 CmdArgs.push_back("-mincremental-linker-compatible");
2709
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002710 // When passing -I arguments to the assembler we sometimes need to
2711 // unconditionally take the next argument. For example, when parsing
2712 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2713 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2714 // arg after parsing the '-I' arg.
2715 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717 // When using an integrated assembler, translate -Wa, and -Xassembler
2718 // options.
2719 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002720 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002721 for (const Arg *A :
2722 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2723 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002724
Benjamin Kramer72e64312015-09-24 14:48:49 +00002725 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002726 if (TakeNextArg) {
2727 CmdArgs.push_back(Value.data());
2728 TakeNextArg = false;
2729 continue;
2730 }
David Blaikie9260ed62013-07-25 21:19:01 +00002731
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002732 switch (C.getDefaultToolChain().getArch()) {
2733 default:
2734 break;
2735 case llvm::Triple::mips:
2736 case llvm::Triple::mipsel:
2737 case llvm::Triple::mips64:
2738 case llvm::Triple::mips64el:
2739 if (Value == "--trap") {
2740 CmdArgs.push_back("-target-feature");
2741 CmdArgs.push_back("+use-tcc-in-div");
2742 continue;
2743 }
2744 if (Value == "--break") {
2745 CmdArgs.push_back("-target-feature");
2746 CmdArgs.push_back("-use-tcc-in-div");
2747 continue;
2748 }
2749 if (Value.startswith("-msoft-float")) {
2750 CmdArgs.push_back("-target-feature");
2751 CmdArgs.push_back("+soft-float");
2752 continue;
2753 }
2754 if (Value.startswith("-mhard-float")) {
2755 CmdArgs.push_back("-target-feature");
2756 CmdArgs.push_back("-soft-float");
2757 continue;
2758 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002759
2760 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2761 .Case("-mips1", "+mips1")
2762 .Case("-mips2", "+mips2")
2763 .Case("-mips3", "+mips3")
2764 .Case("-mips4", "+mips4")
2765 .Case("-mips5", "+mips5")
2766 .Case("-mips32", "+mips32")
2767 .Case("-mips32r2", "+mips32r2")
2768 .Case("-mips32r3", "+mips32r3")
2769 .Case("-mips32r5", "+mips32r5")
2770 .Case("-mips32r6", "+mips32r6")
2771 .Case("-mips64", "+mips64")
2772 .Case("-mips64r2", "+mips64r2")
2773 .Case("-mips64r3", "+mips64r3")
2774 .Case("-mips64r5", "+mips64r5")
2775 .Case("-mips64r6", "+mips64r6")
2776 .Default(nullptr);
2777 if (MipsTargetFeature)
2778 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002779 }
2780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002781 if (Value == "-force_cpusubtype_ALL") {
2782 // Do nothing, this is the default and we don't support anything else.
2783 } else if (Value == "-L") {
2784 CmdArgs.push_back("-msave-temp-labels");
2785 } else if (Value == "--fatal-warnings") {
2786 CmdArgs.push_back("-massembler-fatal-warnings");
2787 } else if (Value == "--noexecstack") {
2788 CmdArgs.push_back("-mnoexecstack");
2789 } else if (Value == "-compress-debug-sections" ||
2790 Value == "--compress-debug-sections") {
2791 CompressDebugSections = true;
2792 } else if (Value == "-nocompress-debug-sections" ||
2793 Value == "--nocompress-debug-sections") {
2794 CompressDebugSections = false;
2795 } else if (Value.startswith("-I")) {
2796 CmdArgs.push_back(Value.data());
2797 // We need to consume the next argument if the current arg is a plain
2798 // -I. The next arg will be the include directory.
2799 if (Value == "-I")
2800 TakeNextArg = true;
2801 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002802 // "-gdwarf-N" options are not cc1as options.
2803 unsigned DwarfVersion = DwarfVersionNum(Value);
2804 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2805 CmdArgs.push_back(Value.data());
2806 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002807 RenderDebugEnablingArgs(Args, CmdArgs,
2808 codegenoptions::LimitedDebugInfo,
2809 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002810 }
Renato Golin7c542b42015-07-27 23:44:45 +00002811 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2812 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2813 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002814 } else {
2815 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002816 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002817 }
2818 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 }
2820 if (CompressDebugSections) {
2821 if (llvm::zlib::isAvailable())
2822 CmdArgs.push_back("-compress-debug-sections");
2823 else
2824 D.Diag(diag::warn_debug_compression_unavailable);
2825 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002826 if (MipsTargetFeature != nullptr) {
2827 CmdArgs.push_back("-target-feature");
2828 CmdArgs.push_back(MipsTargetFeature);
2829 }
David Blaikie9260ed62013-07-25 21:19:01 +00002830}
2831
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002832// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002833// FIXME: Make sure we can also emit shared objects if they're requested
2834// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002835static void addClangRT(const ToolChain &TC, const ArgList &Args,
2836 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002837 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002838}
2839
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002840namespace {
2841enum OpenMPRuntimeKind {
2842 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2843 /// without knowing what runtime to target.
2844 OMPRT_Unknown,
2845
2846 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2847 /// the default for Clang.
2848 OMPRT_OMP,
2849
2850 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2851 /// this runtime but can swallow the pragmas, and find and link against the
2852 /// runtime library itself.
2853 OMPRT_GOMP,
2854
Chandler Carruthc6625c62015-05-28 21:10:31 +00002855 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002856 /// OpenMP runtime. We support this mode for users with existing dependencies
2857 /// on this runtime library name.
2858 OMPRT_IOMP5
2859};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002860}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002861
2862/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002863static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2864 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002865 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2866
2867 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2868 if (A)
2869 RuntimeName = A->getValue();
2870
2871 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002872 .Case("libomp", OMPRT_OMP)
2873 .Case("libgomp", OMPRT_GOMP)
2874 .Case("libiomp5", OMPRT_IOMP5)
2875 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002876
2877 if (RT == OMPRT_Unknown) {
2878 if (A)
2879 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002880 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002881 else
2882 // FIXME: We could use a nicer diagnostic here.
2883 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2884 }
2885
2886 return RT;
2887}
2888
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002889static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2890 const ArgList &Args) {
2891 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2892 options::OPT_fno_openmp, false))
2893 return;
2894
2895 switch (getOpenMPRuntime(TC, Args)) {
2896 case OMPRT_OMP:
2897 CmdArgs.push_back("-lomp");
2898 break;
2899 case OMPRT_GOMP:
2900 CmdArgs.push_back("-lgomp");
2901 break;
2902 case OMPRT_IOMP5:
2903 CmdArgs.push_back("-liomp5");
2904 break;
2905 case OMPRT_Unknown:
2906 // Already diagnosed.
2907 break;
2908 }
2909}
2910
Alexey Samsonov52550342014-09-15 19:58:40 +00002911static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2912 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002913 bool IsShared, bool IsWhole) {
2914 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002915 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002916 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002917 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002918 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002919}
2920
Alexey Samsonov52550342014-09-15 19:58:40 +00002921// Tries to use a file with the list of dynamic symbols that need to be exported
2922// from the runtime library. Returns true if the file was found.
2923static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2924 ArgStringList &CmdArgs,
2925 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002926 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002927 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2928 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002929 return true;
2930 }
2931 return false;
2932}
2933
2934static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2935 ArgStringList &CmdArgs) {
2936 // Force linking against the system libraries sanitizers depends on
2937 // (see PR15823 why this is necessary).
2938 CmdArgs.push_back("--no-as-needed");
2939 CmdArgs.push_back("-lpthread");
2940 CmdArgs.push_back("-lrt");
2941 CmdArgs.push_back("-lm");
2942 // There's no libdl on FreeBSD.
2943 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2944 CmdArgs.push_back("-ldl");
2945}
2946
2947static void
2948collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2949 SmallVectorImpl<StringRef> &SharedRuntimes,
2950 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002951 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2952 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2953 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002954 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2955 // Collect shared runtimes.
2956 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2957 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002958 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002959 // The stats_client library is also statically linked into DSOs.
2960 if (SanArgs.needsStatsRt())
2961 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002962
Alexey Samsonov52550342014-09-15 19:58:40 +00002963 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002964 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002965 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002966 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002967 }
2968 if (SanArgs.needsAsanRt()) {
2969 if (SanArgs.needsSharedAsanRt()) {
2970 HelperStaticRuntimes.push_back("asan-preinit");
2971 } else {
2972 StaticRuntimes.push_back("asan");
2973 if (SanArgs.linkCXXRuntimes())
2974 StaticRuntimes.push_back("asan_cxx");
2975 }
2976 }
2977 if (SanArgs.needsDfsanRt())
2978 StaticRuntimes.push_back("dfsan");
2979 if (SanArgs.needsLsanRt())
2980 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002981 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002982 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002983 if (SanArgs.linkCXXRuntimes())
2984 StaticRuntimes.push_back("msan_cxx");
2985 }
2986 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002987 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002988 if (SanArgs.linkCXXRuntimes())
2989 StaticRuntimes.push_back("tsan_cxx");
2990 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002991 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002992 StaticRuntimes.push_back("ubsan_standalone");
2993 if (SanArgs.linkCXXRuntimes())
2994 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002995 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002996 if (SanArgs.needsSafeStackRt())
2997 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002998 if (SanArgs.needsCfiRt())
2999 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003000 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003001 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003002 if (SanArgs.linkCXXRuntimes())
3003 StaticRuntimes.push_back("ubsan_standalone_cxx");
3004 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003005 if (SanArgs.needsStatsRt()) {
3006 NonWholeStaticRuntimes.push_back("stats");
3007 RequiredSymbols.push_back("__sanitizer_stats_register");
3008 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003009}
3010
Alexey Samsonov52550342014-09-15 19:58:40 +00003011// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3012// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3013static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003014 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003015 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003016 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003017 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003018 NonWholeStaticRuntimes, HelperStaticRuntimes,
3019 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003020 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003021 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003022 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003023 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003024 bool AddExportDynamic = false;
3025 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003026 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003027 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3028 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003029 for (auto RT : NonWholeStaticRuntimes) {
3030 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3031 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3032 }
3033 for (auto S : RequiredSymbols) {
3034 CmdArgs.push_back("-u");
3035 CmdArgs.push_back(Args.MakeArgString(S));
3036 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003037 // If there is a static runtime with no dynamic list, force all the symbols
3038 // to be dynamic to be sure we export sanitizer interface functions.
3039 if (AddExportDynamic)
3040 CmdArgs.push_back("-export-dynamic");
3041 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003042}
3043
Reid Kleckner86ea7702015-02-04 23:45:07 +00003044static bool areOptimizationsEnabled(const ArgList &Args) {
3045 // Find the last -O arg and see if it is non-zero.
3046 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3047 return !A->getOption().matches(options::OPT_O0);
3048 // Defaults to -O0.
3049 return false;
3050}
3051
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003052static bool shouldUseFramePointerForTarget(const ArgList &Args,
3053 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003054 switch (Triple.getArch()) {
3055 case llvm::Triple::xcore:
3056 case llvm::Triple::wasm32:
3057 case llvm::Triple::wasm64:
3058 // XCore never wants frame pointers, regardless of OS.
3059 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003060 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003061 default:
3062 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003063 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003064
3065 if (Triple.isOSLinux()) {
3066 switch (Triple.getArch()) {
3067 // Don't use a frame pointer on linux if optimizing for certain targets.
3068 case llvm::Triple::mips64:
3069 case llvm::Triple::mips64el:
3070 case llvm::Triple::mips:
3071 case llvm::Triple::mipsel:
3072 case llvm::Triple::systemz:
3073 case llvm::Triple::x86:
3074 case llvm::Triple::x86_64:
3075 return !areOptimizationsEnabled(Args);
3076 default:
3077 return true;
3078 }
3079 }
3080
3081 if (Triple.isOSWindows()) {
3082 switch (Triple.getArch()) {
3083 case llvm::Triple::x86:
3084 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003085 case llvm::Triple::x86_64:
3086 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003087 case llvm::Triple::arm:
3088 case llvm::Triple::thumb:
3089 // Windows on ARM builds with FPO disabled to aid fast stack walking
3090 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003091 default:
3092 // All other supported Windows ISAs use xdata unwind information, so frame
3093 // pointers are not generally useful.
3094 return false;
3095 }
3096 }
3097
3098 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003099}
3100
Rafael Espindola224dd632011-12-14 21:02:23 +00003101static bool shouldUseFramePointer(const ArgList &Args,
3102 const llvm::Triple &Triple) {
3103 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3104 options::OPT_fomit_frame_pointer))
3105 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003106 if (Args.hasArg(options::OPT_pg))
3107 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003108
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003109 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003110}
3111
Eric Christopherb7d97e92013-04-03 01:58:53 +00003112static bool shouldUseLeafFramePointer(const ArgList &Args,
3113 const llvm::Triple &Triple) {
3114 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3115 options::OPT_momit_leaf_frame_pointer))
3116 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003117 if (Args.hasArg(options::OPT_pg))
3118 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003119
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003120 if (Triple.isPS4CPU())
3121 return false;
3122
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003123 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003124}
3125
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003126/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003127static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003128 SmallString<128> cwd;
3129 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003130 CmdArgs.push_back("-fdebug-compilation-dir");
3131 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003132 }
3133}
3134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003135static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003136 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3137 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3138 SmallString<128> T(FinalOutput->getValue());
3139 llvm::sys::path::replace_extension(T, "dwo");
3140 return Args.MakeArgString(T);
3141 } else {
3142 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003143 SmallString<128> T(
3144 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003145 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003146 llvm::sys::path::replace_extension(F, "dwo");
3147 T += F;
3148 return Args.MakeArgString(F);
3149 }
3150}
3151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003152static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3153 const JobAction &JA, const ArgList &Args,
3154 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003155 ArgStringList ExtractArgs;
3156 ExtractArgs.push_back("--extract-dwo");
3157
3158 ArgStringList StripArgs;
3159 StripArgs.push_back("--strip-dwo");
3160
3161 // Grabbing the output of the earlier compile step.
3162 StripArgs.push_back(Output.getFilename());
3163 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003164 ExtractArgs.push_back(OutFile);
3165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003166 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003167 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003168
3169 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003170 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003171
3172 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003173 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003174}
3175
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003176/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003177/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3178static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003179 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003180 if (A->getOption().matches(options::OPT_O4) ||
3181 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003182 return true;
3183
3184 if (A->getOption().matches(options::OPT_O0))
3185 return false;
3186
3187 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3188
Rafael Espindola91780de2013-08-26 14:05:41 +00003189 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003190 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003191 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003192 return true;
3193
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003194 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003195 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003196 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003197
3198 unsigned OptLevel = 0;
3199 if (S.getAsInteger(10, OptLevel))
3200 return false;
3201
3202 return OptLevel > 1;
3203 }
3204
3205 return false;
3206}
3207
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003208/// Add -x lang to \p CmdArgs for \p Input.
3209static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3210 ArgStringList &CmdArgs) {
3211 // When using -verify-pch, we don't want to provide the type
3212 // 'precompiled-header' if it was inferred from the file extension
3213 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3214 return;
3215
3216 CmdArgs.push_back("-x");
3217 if (Args.hasArg(options::OPT_rewrite_objc))
3218 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3219 else
3220 CmdArgs.push_back(types::getTypeName(Input.getType()));
3221}
3222
David Majnemerc371ff02015-03-22 08:39:22 +00003223static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003224 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003225 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003226
3227 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003228 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003229
3230 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003231 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003232 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003233 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003234}
3235
Rafael Espindola577637a2015-01-03 00:06:04 +00003236// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003237// options that build systems might add but are unused when assembling or only
3238// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003239static void claimNoWarnArgs(const ArgList &Args) {
3240 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003241 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003242 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003243 Args.ClaimAllArgs(options::OPT_flto);
3244 Args.ClaimAllArgs(options::OPT_fno_lto);
3245}
3246
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003247static void appendUserToPath(SmallVectorImpl<char> &Result) {
3248#ifdef LLVM_ON_UNIX
3249 const char *Username = getenv("LOGNAME");
3250#else
3251 const char *Username = getenv("USERNAME");
3252#endif
3253 if (Username) {
3254 // Validate that LoginName can be used in a path, and get its length.
3255 size_t Len = 0;
3256 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003257 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003258 Username = nullptr;
3259 break;
3260 }
3261 }
3262
3263 if (Username && Len > 0) {
3264 Result.append(Username, Username + Len);
3265 return;
3266 }
3267 }
3268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003269// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003270#ifdef LLVM_ON_UNIX
3271 std::string UID = llvm::utostr(getuid());
3272#else
3273 // FIXME: Windows seems to have an 'SID' that might work.
3274 std::string UID = "9999";
3275#endif
3276 Result.append(UID.begin(), UID.end());
3277}
3278
David Majnemere11d3732015-06-08 00:22:46 +00003279VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3280 const llvm::Triple &Triple,
3281 const llvm::opt::ArgList &Args,
3282 bool IsWindowsMSVC) {
3283 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3284 IsWindowsMSVC) ||
3285 Args.hasArg(options::OPT_fmsc_version) ||
3286 Args.hasArg(options::OPT_fms_compatibility_version)) {
3287 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3288 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003289 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003290
3291 if (MSCVersion && MSCompatibilityVersion) {
3292 if (D)
3293 D->Diag(diag::err_drv_argument_not_allowed_with)
3294 << MSCVersion->getAsString(Args)
3295 << MSCompatibilityVersion->getAsString(Args);
3296 return VersionTuple();
3297 }
3298
3299 if (MSCompatibilityVersion) {
3300 VersionTuple MSVT;
3301 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3302 D->Diag(diag::err_drv_invalid_value)
3303 << MSCompatibilityVersion->getAsString(Args)
3304 << MSCompatibilityVersion->getValue();
3305 return MSVT;
3306 }
3307
3308 if (MSCVersion) {
3309 unsigned Version = 0;
3310 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3311 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3312 << MSCVersion->getValue();
3313 return getMSCompatibilityVersion(Version);
3314 }
3315
3316 unsigned Major, Minor, Micro;
3317 Triple.getEnvironmentVersion(Major, Minor, Micro);
3318 if (Major || Minor || Micro)
3319 return VersionTuple(Major, Minor, Micro);
3320
Nico Weber9a952752016-03-23 23:26:59 +00003321 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003322 return VersionTuple(18);
3323 }
3324 return VersionTuple();
3325}
3326
Diego Novilloa0545962015-07-10 18:00:07 +00003327static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3328 const InputInfo &Output, const ArgList &Args,
3329 ArgStringList &CmdArgs) {
3330 auto *ProfileGenerateArg = Args.getLastArg(
3331 options::OPT_fprofile_instr_generate,
3332 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003333 options::OPT_fprofile_generate_EQ,
3334 options::OPT_fno_profile_instr_generate);
3335 if (ProfileGenerateArg &&
3336 ProfileGenerateArg->getOption().matches(
3337 options::OPT_fno_profile_instr_generate))
3338 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003339
3340 auto *ProfileUseArg = Args.getLastArg(
3341 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003342 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3343 options::OPT_fno_profile_instr_use);
3344 if (ProfileUseArg &&
3345 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3346 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003347
3348 if (ProfileGenerateArg && ProfileUseArg)
3349 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003350 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003351
Diego Novillo758f3f52015-08-05 21:49:51 +00003352 if (ProfileGenerateArg) {
3353 if (ProfileGenerateArg->getOption().matches(
3354 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003355 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3356 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003357 else if (ProfileGenerateArg->getOption().matches(
3358 options::OPT_fprofile_generate_EQ)) {
3359 SmallString<128> Path(ProfileGenerateArg->getValue());
3360 llvm::sys::path::append(Path, "default.profraw");
3361 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003362 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3363 }
3364 // The default is to use Clang Instrumentation.
3365 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003366 }
Diego Novilloa0545962015-07-10 18:00:07 +00003367
Diego Novillo758f3f52015-08-05 21:49:51 +00003368 if (ProfileUseArg) {
3369 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003370 CmdArgs.push_back(Args.MakeArgString(
3371 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003372 else if ((ProfileUseArg->getOption().matches(
3373 options::OPT_fprofile_use_EQ) ||
3374 ProfileUseArg->getOption().matches(
3375 options::OPT_fprofile_instr_use))) {
3376 SmallString<128> Path(
3377 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3378 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3379 llvm::sys::path::append(Path, "default.profdata");
3380 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003381 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003382 }
Diego Novilloa0545962015-07-10 18:00:07 +00003383 }
3384
3385 if (Args.hasArg(options::OPT_ftest_coverage) ||
3386 Args.hasArg(options::OPT_coverage))
3387 CmdArgs.push_back("-femit-coverage-notes");
3388 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3389 false) ||
3390 Args.hasArg(options::OPT_coverage))
3391 CmdArgs.push_back("-femit-coverage-data");
3392
Diego Novilloc4b94da2015-08-05 23:27:40 +00003393 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3394 options::OPT_fno_coverage_mapping, false) &&
3395 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003396 D.Diag(diag::err_drv_argument_only_allowed_with)
3397 << "-fcoverage-mapping"
3398 << "-fprofile-instr-generate";
3399
Diego Novilloc4b94da2015-08-05 23:27:40 +00003400 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3401 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003402 CmdArgs.push_back("-fcoverage-mapping");
3403
3404 if (C.getArgs().hasArg(options::OPT_c) ||
3405 C.getArgs().hasArg(options::OPT_S)) {
3406 if (Output.isFilename()) {
3407 CmdArgs.push_back("-coverage-file");
3408 SmallString<128> CoverageFilename;
3409 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3410 CoverageFilename = FinalOutput->getValue();
3411 } else {
3412 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3413 }
3414 if (llvm::sys::path::is_relative(CoverageFilename)) {
3415 SmallString<128> Pwd;
3416 if (!llvm::sys::fs::current_path(Pwd)) {
3417 llvm::sys::path::append(Pwd, CoverageFilename);
3418 CoverageFilename.swap(Pwd);
3419 }
3420 }
3421 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3422 }
3423 }
3424}
3425
Paul Robinsond083b9a2015-12-16 17:25:27 +00003426static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3427 ArgStringList &CmdArgs) {
3428 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3429 false) ||
3430 Args.hasFlag(options::OPT_fprofile_generate,
3431 options::OPT_fno_profile_instr_generate, false) ||
3432 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3433 options::OPT_fno_profile_instr_generate, false) ||
3434 Args.hasFlag(options::OPT_fprofile_instr_generate,
3435 options::OPT_fno_profile_instr_generate, false) ||
3436 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3437 options::OPT_fno_profile_instr_generate, false) ||
3438 Args.hasArg(options::OPT_fcreate_profile) ||
3439 Args.hasArg(options::OPT_coverage)))
3440 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3441}
3442
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003443/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3444/// smooshes them together with platform defaults, to decide whether
3445/// this compile should be using PIC mode or not. Returns a tuple of
3446/// (RelocationModel, PICLevel, IsPIE).
3447static std::tuple<llvm::Reloc::Model, unsigned, bool>
3448ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3449 const ArgList &Args) {
3450 // FIXME: why does this code...and so much everywhere else, use both
3451 // ToolChain.getTriple() and Triple?
3452 bool PIE = ToolChain.isPIEDefault();
3453 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003454 // The Darwin/MachO default to use PIC does not apply when using -static.
3455 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3456 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003457 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003458 bool IsPICLevelTwo = PIC;
3459
3460 bool KernelOrKext =
3461 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3462
3463 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003464 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003465 switch (ToolChain.getArch()) {
3466 case llvm::Triple::arm:
3467 case llvm::Triple::armeb:
3468 case llvm::Triple::thumb:
3469 case llvm::Triple::thumbeb:
3470 case llvm::Triple::aarch64:
3471 case llvm::Triple::mips:
3472 case llvm::Triple::mipsel:
3473 case llvm::Triple::mips64:
3474 case llvm::Triple::mips64el:
3475 PIC = true; // "-fpic"
3476 break;
3477
3478 case llvm::Triple::x86:
3479 case llvm::Triple::x86_64:
3480 PIC = true; // "-fPIC"
3481 IsPICLevelTwo = true;
3482 break;
3483
3484 default:
3485 break;
3486 }
3487 }
3488
3489 // OpenBSD-specific defaults for PIE
3490 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3491 switch (ToolChain.getArch()) {
3492 case llvm::Triple::mips64:
3493 case llvm::Triple::mips64el:
3494 case llvm::Triple::sparcel:
3495 case llvm::Triple::x86:
3496 case llvm::Triple::x86_64:
3497 IsPICLevelTwo = false; // "-fpie"
3498 break;
3499
3500 case llvm::Triple::ppc:
3501 case llvm::Triple::sparc:
3502 case llvm::Triple::sparcv9:
3503 IsPICLevelTwo = true; // "-fPIE"
3504 break;
3505
3506 default:
3507 break;
3508 }
3509 }
3510
3511 // The last argument relating to either PIC or PIE wins, and no
3512 // other argument is used. If the last argument is any flavor of the
3513 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3514 // option implicitly enables PIC at the same level.
3515 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3516 options::OPT_fpic, options::OPT_fno_pic,
3517 options::OPT_fPIE, options::OPT_fno_PIE,
3518 options::OPT_fpie, options::OPT_fno_pie);
3519 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3520 // is forced, then neither PIC nor PIE flags will have no effect.
3521 if (!ToolChain.isPICDefaultForced()) {
3522 if (LastPICArg) {
3523 Option O = LastPICArg->getOption();
3524 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3525 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3526 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3527 PIC =
3528 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3529 IsPICLevelTwo =
3530 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3531 } else {
3532 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003533 if (Triple.isPS4CPU()) {
3534 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3535 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3536 if (Model != "kernel") {
3537 PIC = true;
3538 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3539 << LastPICArg->getSpelling();
3540 }
3541 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003542 }
3543 }
3544 }
3545
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003546 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3547 // PIC level would've been set to level 1, force it back to level 2 PIC
3548 // instead.
3549 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003550 IsPICLevelTwo |= ToolChain.isPICDefault();
3551
James Y Knightc4015d32015-08-21 04:14:55 +00003552 // This kernel flags are a trump-card: they will disable PIC/PIE
3553 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003554 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3555 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003556 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003557
3558 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3559 // This is a very special mode. It trumps the other modes, almost no one
3560 // uses it, and it isn't even valid on any OS but Darwin.
3561 if (!ToolChain.getTriple().isOSDarwin())
3562 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3563 << A->getSpelling() << ToolChain.getTriple().str();
3564
3565 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3566
3567 // Only a forced PIC mode can cause the actual compile to have PIC defines
3568 // etc., no flags are sufficient. This behavior was selected to closely
3569 // match that of llvm-gcc and Apple GCC before that.
3570 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3571
3572 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3573 }
3574
3575 if (PIC)
3576 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3577
3578 return std::make_tuple(llvm::Reloc::Static, 0, false);
3579}
3580
3581static const char *RelocationModelName(llvm::Reloc::Model Model) {
3582 switch (Model) {
3583 case llvm::Reloc::Default:
3584 return nullptr;
3585 case llvm::Reloc::Static:
3586 return "static";
3587 case llvm::Reloc::PIC_:
3588 return "pic";
3589 case llvm::Reloc::DynamicNoPIC:
3590 return "dynamic-no-pic";
3591 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003592 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003593}
3594
3595static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3596 ArgStringList &CmdArgs) {
3597 llvm::Reloc::Model RelocationModel;
3598 unsigned PICLevel;
3599 bool IsPIE;
3600 std::tie(RelocationModel, PICLevel, IsPIE) =
3601 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3602
3603 if (RelocationModel != llvm::Reloc::Static)
3604 CmdArgs.push_back("-KPIC");
3605}
3606
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003607void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003608 const InputInfo &Output, const InputInfoList &Inputs,
3609 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003610 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3611 const llvm::Triple Triple(TripleStr);
3612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003613 bool KernelOrKext =
3614 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003615 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003616 ArgStringList CmdArgs;
3617
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003618 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003619 bool IsWindowsCygnus =
3620 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003621 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003622 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003623
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003624 // Check number of inputs for sanity. We need at least one input.
3625 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003626 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003627 // CUDA compilation may have multiple inputs (source file + results of
3628 // device-side compilations). All other jobs are expected to have exactly one
3629 // input.
3630 bool IsCuda = types::isCuda(Input.getType());
3631 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003632
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003633 // Invoke ourselves in -cc1 mode.
3634 //
3635 // FIXME: Implement custom jobs for internal actions.
3636 CmdArgs.push_back("-cc1");
3637
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003638 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003639 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003640 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003641
Artem Belevichfa11ab52015-11-17 22:28:46 +00003642 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003643 if (IsCuda) {
3644 // FIXME: We need a (better) way to pass information about
3645 // particular compilation pass we're constructing here. For now we
3646 // can check which toolchain we're using and pick the other one to
3647 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003648 if (&getToolChain() == C.getCudaDeviceToolChain())
3649 AuxToolChain = C.getCudaHostToolChain();
3650 else if (&getToolChain() == C.getCudaHostToolChain())
3651 AuxToolChain = C.getCudaDeviceToolChain();
3652 else
3653 llvm_unreachable("Can't figure out CUDA compilation mode.");
3654 assert(AuxToolChain != nullptr && "No aux toolchain.");
3655 CmdArgs.push_back("-aux-triple");
3656 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3657 }
3658
James Y Knight2db38f32015-08-15 03:45:25 +00003659 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3660 Triple.getArch() == llvm::Triple::thumb)) {
3661 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003662 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003663 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003664 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003665 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003666 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003667 }
3668
Tim Northover336f1892014-03-29 13:16:12 +00003669 // Push all default warning arguments that are specific to
3670 // the given target. These come before user provided warning options
3671 // are provided.
3672 getToolChain().addClangWarningOptions(CmdArgs);
3673
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003674 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003675 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003677 if (isa<AnalyzeJobAction>(JA)) {
3678 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3679 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003680 } else if (isa<MigrateJobAction>(JA)) {
3681 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003682 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003683 if (Output.getType() == types::TY_Dependencies)
3684 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003685 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003686 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003687 if (Args.hasArg(options::OPT_rewrite_objc) &&
3688 !Args.hasArg(options::OPT_g_Group))
3689 CmdArgs.push_back("-P");
3690 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003691 } else if (isa<AssembleJobAction>(JA)) {
3692 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003693
David Blaikie9260ed62013-07-25 21:19:01 +00003694 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003695
3696 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003697 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003698 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003699 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003700 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003701
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003702 if (JA.getType() == types::TY_Nothing)
3703 CmdArgs.push_back("-fsyntax-only");
3704 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003705 CmdArgs.push_back("-emit-pch");
3706 else
3707 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003708 } else if (isa<VerifyPCHJobAction>(JA)) {
3709 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003710 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003711 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3712 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003713 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003714 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003715 } else if (JA.getType() == types::TY_LLVM_IR ||
3716 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003717 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003718 } else if (JA.getType() == types::TY_LLVM_BC ||
3719 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003720 CmdArgs.push_back("-emit-llvm-bc");
3721 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003722 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003723 } else if (JA.getType() == types::TY_AST) {
3724 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003725 } else if (JA.getType() == types::TY_ModuleFile) {
3726 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003727 } else if (JA.getType() == types::TY_RewrittenObjC) {
3728 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003729 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003730 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3731 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003732 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003733 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003734 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003735 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003736
3737 // Preserve use-list order by default when emitting bitcode, so that
3738 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3739 // same result as running passes here. For LTO, we don't need to preserve
3740 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003741 if (JA.getType() == types::TY_LLVM_BC)
3742 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003743
3744 if (D.isUsingLTO())
3745 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003746 }
3747
Teresa Johnsonaff22322015-12-07 19:21:34 +00003748 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3749 if (!types::isLLVMIR(Input.getType()))
3750 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3751 << "-x ir";
3752 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3753 }
3754
Steven Wu574b0f22016-03-01 01:07:58 +00003755 // Embed-bitcode option.
3756 if (C.getDriver().embedBitcodeEnabled() &&
3757 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3758 // Add flags implied by -fembed-bitcode.
3759 CmdArgs.push_back("-fembed-bitcode");
3760 // Disable all llvm IR level optimizations.
3761 CmdArgs.push_back("-disable-llvm-optzns");
3762 }
3763 if (C.getDriver().embedBitcodeMarkerOnly())
3764 CmdArgs.push_back("-fembed-bitcode-marker");
3765
Justin Bognera88f0122014-06-20 22:59:50 +00003766 // We normally speed up the clang process a bit by skipping destructors at
3767 // exit, but when we're generating diagnostics we can rely on some of the
3768 // cleanup.
3769 if (!C.isForDiagnostics())
3770 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003772// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003773#ifdef NDEBUG
3774 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003775 // Discard LLVM value names in -asserts builds.
3776 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003777#endif
3778
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003779 // Set the main file name, so that debug info works even with
3780 // -save-temps.
3781 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003782 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003783
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003784 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003785 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003786 if (Args.hasArg(options::OPT_static))
3787 CmdArgs.push_back("-static-define");
3788
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003789 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003790 // Enable region store model by default.
3791 CmdArgs.push_back("-analyzer-store=region");
3792
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003793 // Treat blocks as analysis entry points.
3794 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3795
Ted Kremenek49c79792011-03-24 00:28:47 +00003796 CmdArgs.push_back("-analyzer-eagerly-assume");
3797
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003798 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003799 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003800 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003801
Devin Coughlin65c77082016-01-21 20:09:49 +00003802 if (!IsWindowsMSVC) {
3803 CmdArgs.push_back("-analyzer-checker=unix");
3804 } else {
3805 // Enable "unix" checkers that also work on Windows.
3806 CmdArgs.push_back("-analyzer-checker=unix.API");
3807 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3808 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3809 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3810 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3811 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3812 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003813
Sean Evesonb38c32b2016-01-06 10:03:58 +00003814 // Disable some unix checkers for PS4.
3815 if (IsPS4CPU) {
3816 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3817 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3818 }
3819
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003820 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003821 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003822
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003823 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003824
Artem Belevichba558952015-05-06 18:20:23 +00003825 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003826 CmdArgs.push_back("-analyzer-checker=cplusplus");
3827
Sean Evesonb38c32b2016-01-06 10:03:58 +00003828 if (!IsPS4CPU) {
3829 CmdArgs.push_back(
3830 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3831 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3832 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3833 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3834 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3835 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3836 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003837
3838 // Default nullability checks.
3839 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3840 CmdArgs.push_back(
3841 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003842 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003843
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003844 // Set the output format. The default is plist, for (lame) historical
3845 // reasons.
3846 CmdArgs.push_back("-analyzer-output");
3847 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003848 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003849 else
3850 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003851
Ted Kremenekfe449a22010-03-22 22:32:05 +00003852 // Disable the presentation of standard compiler warnings when
3853 // using --analyze. We only want to show static analyzer diagnostics
3854 // or frontend errors.
3855 CmdArgs.push_back("-w");
3856
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003857 // Add -Xanalyzer arguments when running as analyzer.
3858 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003859 }
3860
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003861 CheckCodeGenerationOptions(D, Args);
3862
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003863 llvm::Reloc::Model RelocationModel;
3864 unsigned PICLevel;
3865 bool IsPIE;
3866 std::tie(RelocationModel, PICLevel, IsPIE) =
3867 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003868
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003869 const char *RMName = RelocationModelName(RelocationModel);
3870 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003871 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003872 CmdArgs.push_back(RMName);
3873 }
3874 if (PICLevel > 0) {
3875 CmdArgs.push_back("-pic-level");
3876 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3877 if (IsPIE) {
3878 CmdArgs.push_back("-pie-level");
3879 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003880 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003881 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003882
Renato Golin4854d802015-11-09 12:40:41 +00003883 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3884 CmdArgs.push_back("-meabi");
3885 CmdArgs.push_back(A->getValue());
3886 }
3887
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003888 CmdArgs.push_back("-mthread-model");
3889 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3890 CmdArgs.push_back(A->getValue());
3891 else
3892 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3893
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003894 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3895
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003896 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3897 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003898 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003899
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003900 // LLVM Code Generator Options.
3901
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003902 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3903 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003904 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3905 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003906 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003907 CmdArgs.push_back(A->getValue());
3908 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003909 }
3910 }
3911
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003912 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3913 StringRef v = A->getValue();
3914 CmdArgs.push_back("-mllvm");
3915 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3916 A->claim();
3917 }
3918
Nirav Daved2f44d82016-04-05 17:50:43 +00003919 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3920 true))
3921 CmdArgs.push_back("-fno-jump-tables");
3922
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003923 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3924 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003925 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003926 }
3927
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003928 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3929 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003930 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003931 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003933 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3934 CmdArgs.push_back("-fpcc-struct-return");
3935 } else {
3936 assert(A->getOption().matches(options::OPT_freg_struct_return));
3937 CmdArgs.push_back("-freg-struct-return");
3938 }
3939 }
3940
Roman Divacky65b88cd2011-03-01 17:40:53 +00003941 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3942 CmdArgs.push_back("-mrtd");
3943
Rafael Espindola224dd632011-12-14 21:02:23 +00003944 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003945 CmdArgs.push_back("-mdisable-fp-elim");
3946 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3947 options::OPT_fno_zero_initialized_in_bss))
3948 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003949
3950 bool OFastEnabled = isOptimizationLevelFast(Args);
3951 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3952 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953 OptSpecifier StrictAliasingAliasOption =
3954 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003955 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3956 // doesn't do any TBAA.
3957 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003958 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003959 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003960 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003961 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3962 options::OPT_fno_struct_path_tbaa))
3963 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003964 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3965 false))
3966 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003967 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3968 options::OPT_fno_strict_vtable_pointers,
3969 false))
3970 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003971 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3972 options::OPT_fno_optimize_sibling_calls))
3973 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003974
Eric Christopher006208c2013-04-04 06:29:47 +00003975 // Handle segmented stacks.
3976 if (Args.hasArg(options::OPT_fsplit_stack))
3977 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003978
3979 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3980 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003981 OptSpecifier FastMathAliasOption =
3982 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3983
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003984 // Handle various floating point optimization flags, mapping them to the
3985 // appropriate LLVM code generation flags. The pattern for all of these is to
3986 // default off the codegen optimizations, and if any flag enables them and no
3987 // flag disables them after the flag enabling them, enable the codegen
3988 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003989 if (Arg *A = Args.getLastArg(
3990 options::OPT_ffast_math, FastMathAliasOption,
3991 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3992 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3993 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003994 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3995 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003996 A->getOption().getID() != options::OPT_fhonor_infinities)
3997 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003998 if (Arg *A = Args.getLastArg(
3999 options::OPT_ffast_math, FastMathAliasOption,
4000 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4001 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4002 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004003 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4004 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004005 A->getOption().getID() != options::OPT_fhonor_nans)
4006 CmdArgs.push_back("-menable-no-nans");
4007
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004008 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4009 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004010 if (Arg *A =
4011 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4012 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4013 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004014 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4015 // However, turning *off* -ffast_math merely restores the toolchain default
4016 // (which may be false).
4017 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4018 A->getOption().getID() == options::OPT_ffast_math ||
4019 A->getOption().getID() == options::OPT_Ofast)
4020 MathErrno = false;
4021 else if (A->getOption().getID() == options::OPT_fmath_errno)
4022 MathErrno = true;
4023 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004024 if (MathErrno)
4025 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004026
4027 // There are several flags which require disabling very specific
4028 // optimizations. Any of these being disabled forces us to turn off the
4029 // entire set of LLVM optimizations, so collect them through all the flag
4030 // madness.
4031 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004032 if (Arg *A = Args.getLastArg(
4033 options::OPT_ffast_math, FastMathAliasOption,
4034 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4035 options::OPT_fno_unsafe_math_optimizations,
4036 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004037 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4038 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004039 A->getOption().getID() != options::OPT_fno_associative_math)
4040 AssociativeMath = true;
4041 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004042 if (Arg *A = Args.getLastArg(
4043 options::OPT_ffast_math, FastMathAliasOption,
4044 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4045 options::OPT_fno_unsafe_math_optimizations,
4046 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004047 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4048 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004049 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4050 ReciprocalMath = true;
4051 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004052 if (Arg *A = Args.getLastArg(
4053 options::OPT_ffast_math, FastMathAliasOption,
4054 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4055 options::OPT_fno_unsafe_math_optimizations,
4056 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004057 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4058 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004059 A->getOption().getID() != options::OPT_fsigned_zeros)
4060 SignedZeros = false;
4061 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004062 if (Arg *A = Args.getLastArg(
4063 options::OPT_ffast_math, FastMathAliasOption,
4064 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4065 options::OPT_fno_unsafe_math_optimizations,
4066 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004067 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4068 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004069 A->getOption().getID() != options::OPT_ftrapping_math)
4070 TrappingMath = false;
4071 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4072 !TrappingMath)
4073 CmdArgs.push_back("-menable-unsafe-fp-math");
4074
Sanjay Patel76c9e092015-01-23 16:40:50 +00004075 if (!SignedZeros)
4076 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004077
Sanjay Patel359b1052015-04-09 15:03:23 +00004078 if (ReciprocalMath)
4079 CmdArgs.push_back("-freciprocal-math");
4080
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004081 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004082 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004083 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004084 options::OPT_ffp_contract)) {
4085 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004086 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004087 if (Val == "fast" || Val == "on" || Val == "off") {
4088 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4089 } else {
4090 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004091 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004092 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004093 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4094 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004095 // If fast-math is set then set the fp-contract mode to fast.
4096 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4097 }
4098 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004099
Sanjay Patel2987c292015-06-11 14:53:41 +00004100 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004101
Bob Wilson6a039162012-07-19 03:52:53 +00004102 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4103 // and if we find them, tell the frontend to provide the appropriate
4104 // preprocessor macros. This is distinct from enabling any optimizations as
4105 // these options induce language changes which must survive serialization
4106 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004107 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4108 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004109 if (!A->getOption().matches(options::OPT_fno_fast_math))
4110 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004111 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4112 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004113 if (A->getOption().matches(options::OPT_ffinite_math_only))
4114 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004115
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004116 // Decide whether to use verbose asm. Verbose assembly is the default on
4117 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004118 bool IsIntegratedAssemblerDefault =
4119 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004120 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004121 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004122 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004123 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004124
Rafael Espindolab8a12932015-05-22 20:44:03 +00004125 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4126 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004127 CmdArgs.push_back("-no-integrated-as");
4128
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004129 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4130 CmdArgs.push_back("-mdebug-pass");
4131 CmdArgs.push_back("Structure");
4132 }
4133 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4134 CmdArgs.push_back("-mdebug-pass");
4135 CmdArgs.push_back("Arguments");
4136 }
4137
Justin Lebar710a35f2016-01-25 22:36:35 +00004138 // Enable -mconstructor-aliases except on darwin, where we have to work around
4139 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4140 // aliases aren't supported.
4141 if (!getToolChain().getTriple().isOSDarwin() &&
4142 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004143 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004144
John McCall7ef5cb32011-03-18 02:56:14 +00004145 // Darwin's kernel doesn't support guard variables; just die if we
4146 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004147 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004148 CmdArgs.push_back("-fforbid-guard-variables");
4149
Akira Hatanaka02028482015-11-12 17:21:22 +00004150 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4151 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004152 CmdArgs.push_back("-mms-bitfields");
4153 }
John McCall8517abc2010-02-19 02:45:38 +00004154
Daniel Dunbar306945d2009-09-16 06:17:29 +00004155 // This is a coarse approximation of what llvm-gcc actually does, both
4156 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4157 // complicated ways.
4158 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004159 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4160 options::OPT_fno_asynchronous_unwind_tables,
4161 (getToolChain().IsUnwindTablesDefault() ||
4162 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4163 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004164 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4165 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004166 CmdArgs.push_back("-munwind-tables");
4167
Chandler Carruth05fb5852012-11-21 23:40:23 +00004168 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004169
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004170 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4171 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004172 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004173 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004174
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004175 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004176 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004177
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004178 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004179 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004180 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004181 }
4182
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004183 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004184 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004185 if (!CPU.empty()) {
4186 CmdArgs.push_back("-target-cpu");
4187 CmdArgs.push_back(Args.MakeArgString(CPU));
4188 }
4189
Rafael Espindolaeb265472013-08-21 21:59:03 +00004190 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4191 CmdArgs.push_back("-mfpmath");
4192 CmdArgs.push_back(A->getValue());
4193 }
4194
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004195 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004196 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004197
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004198 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004199 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004200 default:
4201 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004202
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004203 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004204 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004205 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004206 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004207 // Use the effective triple, which takes into account the deployment target.
4208 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004209 break;
4210
Tim Northover573cbee2014-05-24 12:52:07 +00004211 case llvm::Triple::aarch64:
4212 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004213 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004214 break;
4215
Eric Christopher0b26a612010-03-02 02:41:08 +00004216 case llvm::Triple::mips:
4217 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004218 case llvm::Triple::mips64:
4219 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004220 AddMIPSTargetArgs(Args, CmdArgs);
4221 break;
4222
Ulrich Weigand8afad612014-07-28 13:17:52 +00004223 case llvm::Triple::ppc:
4224 case llvm::Triple::ppc64:
4225 case llvm::Triple::ppc64le:
4226 AddPPCTargetArgs(Args, CmdArgs);
4227 break;
4228
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004229 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004230 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004231 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004232 AddSparcTargetArgs(Args, CmdArgs);
4233 break;
4234
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004235 case llvm::Triple::x86:
4236 case llvm::Triple::x86_64:
4237 AddX86TargetArgs(Args, CmdArgs);
4238 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004239
Jacques Pienaard964cc22016-03-28 21:02:54 +00004240 case llvm::Triple::lanai:
4241 AddLanaiTargetArgs(Args, CmdArgs);
4242 break;
4243
Tony Linthicum76329bf2011-12-12 21:14:55 +00004244 case llvm::Triple::hexagon:
4245 AddHexagonTargetArgs(Args, CmdArgs);
4246 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004247
4248 case llvm::Triple::wasm32:
4249 case llvm::Triple::wasm64:
4250 AddWebAssemblyTargetArgs(Args, CmdArgs);
4251 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004252 }
4253
Douglas Katzman3459ce22015-10-08 04:24:12 +00004254 // The 'g' groups options involve a somewhat intricate sequence of decisions
4255 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004256 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004257 // * what level of debug info to generate
4258 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004259 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004260 // This avoids having to monkey around further in cc1 other than to disable
4261 // codeview if not running in a Windows environment. Perhaps even that
4262 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004263 unsigned DwarfVersion = 0;
4264 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4265 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004266 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004267 bool EmitCodeView = false;
4268
Hans Wennborg75958c42013-08-08 00:17:41 +00004269 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004270 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004271 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004272 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004273
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004274 // Pass the linker version in use.
4275 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4276 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004277 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004278 }
4279
Eric Christopherb7d97e92013-04-03 01:58:53 +00004280 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004281 CmdArgs.push_back("-momit-leaf-frame-pointer");
4282
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004283 // Explicitly error on some things we know we don't support and can't just
4284 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004285 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4286 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004288 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004289 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4290 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004291 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004292 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004293 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004294 }
4295
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004296 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004297 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004298 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004299 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004300 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4301 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004302 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004303 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004304 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004305
Chad Rosierbe10f982011-08-02 17:58:04 +00004306 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004307 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004308 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4309 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004310 }
4311
Rafael Espindola08a692a2010-03-07 04:46:18 +00004312 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004313 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004314 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004315 // If the last option explicitly specified a debug-info level, use it.
4316 if (A->getOption().matches(options::OPT_gN_Group)) {
4317 DebugInfoKind = DebugLevelToInfoKind(*A);
4318 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4319 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4320 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004321 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004322 A->getIndex() > SplitDwarfArg->getIndex())
4323 SplitDwarfArg = nullptr;
4324 } else
4325 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004326 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004327 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004328
Paul Robinson0334a042015-12-19 19:41:48 +00004329 // If a debugger tuning argument appeared, remember it.
4330 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4331 options::OPT_ggdbN_Group)) {
4332 if (A->getOption().matches(options::OPT_glldb))
4333 DebuggerTuning = llvm::DebuggerKind::LLDB;
4334 else if (A->getOption().matches(options::OPT_gsce))
4335 DebuggerTuning = llvm::DebuggerKind::SCE;
4336 else
4337 DebuggerTuning = llvm::DebuggerKind::GDB;
4338 }
4339
4340 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004341 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004342 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004343 DwarfVersion = DwarfVersionNum(A->getSpelling());
4344
Reid Kleckner124955a2015-08-05 18:51:13 +00004345 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004346 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4347 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4348 // DwarfVersion remains at 0 if no explicit choice was made.
4349 CmdArgs.push_back("-gcodeview");
4350 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004351 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004352 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4353 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004354
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004355 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4356 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004357
4358 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004359 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004360 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004361 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004362
Eric Christopher138c32b2013-09-13 22:37:55 +00004363 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004364 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004365 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004366 CmdArgs.push_back("-dwarf-ext-refs");
4367 CmdArgs.push_back("-fmodule-format=obj");
4368 }
4369
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004370 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4371 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004372 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004373 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004374 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004375 CmdArgs.push_back("-backend-option");
4376 CmdArgs.push_back("-split-dwarf=Enable");
4377 }
4378
Douglas Katzman3459ce22015-10-08 04:24:12 +00004379 // After we've dealt with all combinations of things that could
4380 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4381 // figure out if we need to "upgrade" it to standalone debug info.
4382 // We parse these two '-f' options whether or not they will be used,
4383 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4384 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4385 options::OPT_fno_standalone_debug,
4386 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004387 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4388 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004389 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4390 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004391
Eric Christopher138c32b2013-09-13 22:37:55 +00004392 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4393 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4394 CmdArgs.push_back("-backend-option");
4395 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4396 }
Eric Christophereec89c22013-06-18 00:03:50 +00004397
Eric Christopher0d403d22014-02-14 01:27:03 +00004398 // -gdwarf-aranges turns on the emission of the aranges section in the
4399 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004400 // Always enabled on the PS4.
4401 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004402 CmdArgs.push_back("-backend-option");
4403 CmdArgs.push_back("-generate-arange-section");
4404 }
4405
David Blaikief36d9ba2014-01-27 18:52:43 +00004406 if (Args.hasFlag(options::OPT_fdebug_types_section,
4407 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004408 CmdArgs.push_back("-backend-option");
4409 CmdArgs.push_back("-generate-type-units");
4410 }
Eric Christophereec89c22013-06-18 00:03:50 +00004411
Dan Gohmana5b804b2016-01-07 00:50:27 +00004412 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4413 // default.
4414 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4415 Triple.getArch() == llvm::Triple::wasm32 ||
4416 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004417
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004418 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004419 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004420 CmdArgs.push_back("-ffunction-sections");
4421 }
4422
Peter Collingbourneceef1452016-02-24 22:03:06 +00004423 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4424 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004425 if (!D.isUsingLTO())
4426 D.Diag(diag::err_drv_argument_only_allowed_with)
4427 << "-fwhole-program-vtables"
4428 << "-flto";
4429 CmdArgs.push_back("-fwhole-program-vtables");
4430
4431 clang::SmallString<64> Path(D.ResourceDir);
4432 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4433 if (llvm::sys::fs::exists(Path)) {
4434 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4435 BlacklistOpt += Path.str();
4436 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4437 }
4438
4439 for (const Arg *A :
4440 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4441 A->claim();
4442 if (!llvm::sys::fs::exists(A->getValue()))
4443 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4444 }
4445
4446 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4447 }
4448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004449 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4450 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004451 CmdArgs.push_back("-fdata-sections");
4452 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004453
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004454 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004455 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004456 CmdArgs.push_back("-fno-unique-section-names");
4457
Chris Lattner3c77a352010-06-22 00:03:40 +00004458 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4459
Diego Novilloa0545962015-07-10 18:00:07 +00004460 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004461
Paul Robinsond083b9a2015-12-16 17:25:27 +00004462 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4463 if (getToolChain().getTriple().isPS4CPU())
4464 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4465
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004466 // Pass options for controlling the default header search paths.
4467 if (Args.hasArg(options::OPT_nostdinc)) {
4468 CmdArgs.push_back("-nostdsysteminc");
4469 CmdArgs.push_back("-nobuiltininc");
4470 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004471 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004472 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004473 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4474 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4475 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004476
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004477 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004478 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004479 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004480
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004481 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4482
Ted Kremenekf7639e12012-03-06 20:06:33 +00004483 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004484 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004485 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004486 options::OPT_ccc_arcmt_modify,
4487 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004488 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004489 switch (A->getOption().getID()) {
4490 default:
4491 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004492 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004493 CmdArgs.push_back("-arcmt-check");
4494 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004495 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004496 CmdArgs.push_back("-arcmt-modify");
4497 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004498 case options::OPT_ccc_arcmt_migrate:
4499 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004500 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004501 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004502
4503 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4504 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004505 break;
John McCalld70fb982011-06-15 23:25:17 +00004506 }
4507 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004508 } else {
4509 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4510 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4511 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004512 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004513
Ted Kremenekf7639e12012-03-06 20:06:33 +00004514 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4515 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004516 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4517 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004518 }
4519 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004520 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004521
4522 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004523 options::OPT_objcmt_migrate_subscripting,
4524 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004525 // None specified, means enable them all.
4526 CmdArgs.push_back("-objcmt-migrate-literals");
4527 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004528 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004529 } else {
4530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004533 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004534 } else {
4535 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004551 }
4552
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004553 // Add preprocessing options like -I, -D, etc. if we are using the
4554 // preprocessor.
4555 //
4556 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004557 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004558 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4559 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004560
Rafael Espindolaa7431922011-07-21 23:40:37 +00004561 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4562 // that "The compiler can only warn and ignore the option if not recognized".
4563 // When building with ccache, it will pass -D options to clang even on
4564 // preprocessed inputs and configure concludes that -fPIC is not supported.
4565 Args.ClaimAllArgs(options::OPT_D);
4566
Alp Toker7874bdc2013-11-15 20:40:58 +00004567 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004568 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4569 if (A->getOption().matches(options::OPT_O4)) {
4570 CmdArgs.push_back("-O3");
4571 D.Diag(diag::warn_O4_is_O3);
4572 } else {
4573 A->render(Args, CmdArgs);
4574 }
4575 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004576
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004577 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004578 for (const Arg *A :
4579 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4580 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004581 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004582 }
4583
Rafael Espindola577637a2015-01-03 00:06:04 +00004584 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004585
Richard Smith3be1cb22014-08-07 00:24:21 +00004586 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004587 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004588 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4589 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004590 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004591 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004592
4593 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004594 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004595 //
4596 // If a std is supplied, only add -trigraphs if it follows the
4597 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004598 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004599 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4600 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004601 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004602 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004603 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004604 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004605 else
4606 Std->render(Args, CmdArgs);
4607
Nico Weber00721502014-12-23 22:32:37 +00004608 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004609 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004610 options::OPT_ftrigraphs,
4611 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004612 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004613 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004614 } else {
4615 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004616 //
4617 // FIXME: Clang doesn't correctly handle -std= when the input language
4618 // doesn't match. For the time being just ignore this for C++ inputs;
4619 // eventually we want to do all the standard defaulting here instead of
4620 // splitting it between the driver and clang -cc1.
4621 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004622 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4623 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004624 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004625 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004626
Nico Weber00721502014-12-23 22:32:37 +00004627 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4628 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004629 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004630
Richard Smith282b4492013-09-04 22:50:31 +00004631 // GCC's behavior for -Wwrite-strings is a bit strange:
4632 // * In C, this "warning flag" changes the types of string literals from
4633 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4634 // for the discarded qualifier.
4635 // * In C++, this is just a normal warning flag.
4636 //
4637 // Implementing this warning correctly in C is hard, so we follow GCC's
4638 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4639 // a non-const char* in C, rather than using this crude hack.
4640 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004641 // FIXME: This should behave just like a warning flag, and thus should also
4642 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4643 Arg *WriteStrings =
4644 Args.getLastArg(options::OPT_Wwrite_strings,
4645 options::OPT_Wno_write_strings, options::OPT_w);
4646 if (WriteStrings &&
4647 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004648 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004649 }
4650
Chandler Carruth61fbf622011-04-23 09:27:53 +00004651 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004652 // during C++ compilation, which it is by default. GCC keeps this define even
4653 // in the presence of '-w', match this behavior bug-for-bug.
4654 if (types::isCXX(InputType) &&
4655 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4656 true)) {
4657 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004658 }
4659
Chandler Carruthe0391482010-05-22 02:21:53 +00004660 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4661 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4662 if (Asm->getOption().matches(options::OPT_fasm))
4663 CmdArgs.push_back("-fgnu-keywords");
4664 else
4665 CmdArgs.push_back("-fno-gnu-keywords");
4666 }
4667
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004668 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4669 CmdArgs.push_back("-fno-dwarf-directory-asm");
4670
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004671 if (ShouldDisableAutolink(Args, getToolChain()))
4672 CmdArgs.push_back("-fno-autolink");
4673
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004674 // Add in -fdebug-compilation-dir if necessary.
4675 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004676
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004677 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4678 StringRef Map = A->getValue();
4679 if (Map.find('=') == StringRef::npos)
4680 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4681 else
4682 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4683 A->claim();
4684 }
4685
Richard Smith9a568822011-11-21 19:36:32 +00004686 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4687 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004688 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004689 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004690 }
4691
Richard Smith79c927b2013-11-06 19:31:51 +00004692 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4693 CmdArgs.push_back("-foperator-arrow-depth");
4694 CmdArgs.push_back(A->getValue());
4695 }
4696
Richard Smith9a568822011-11-21 19:36:32 +00004697 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4698 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004699 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004700 }
4701
Richard Smitha3d3bd22013-05-08 02:12:03 +00004702 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4703 CmdArgs.push_back("-fconstexpr-steps");
4704 CmdArgs.push_back(A->getValue());
4705 }
4706
Richard Smithb3a14522013-02-22 01:59:51 +00004707 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4708 CmdArgs.push_back("-fbracket-depth");
4709 CmdArgs.push_back(A->getValue());
4710 }
4711
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004712 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4713 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004714 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004715 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004716 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4717 } else
4718 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004719 }
4720
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004721 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004722 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004723
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004724 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4725 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004726 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004727 }
David Chisnall5778fce2009-08-31 16:41:57 +00004728
Chris Lattnere23003d2010-01-09 21:54:33 +00004729 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4730 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004731 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004732 }
4733
Chris Lattnerb35583d2010-04-07 20:49:23 +00004734 CmdArgs.push_back("-ferror-limit");
4735 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004736 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004737 else
4738 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004739
Chandler Carrutha77a7272010-05-06 04:55:18 +00004740 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4741 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004742 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004743 }
4744
4745 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4746 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004747 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004748 }
4749
Richard Smithf6f003a2011-12-16 19:06:07 +00004750 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4751 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004752 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004753 }
4754
Nick Lewycky24653262014-12-16 21:39:02 +00004755 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4756 CmdArgs.push_back("-fspell-checking-limit");
4757 CmdArgs.push_back(A->getValue());
4758 }
4759
Daniel Dunbar2c978472009-11-04 06:24:47 +00004760 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004761 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004762 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004763 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004764 } else {
4765 // If -fmessage-length=N was not specified, determine whether this is a
4766 // terminal and, if so, implicitly define -fmessage-length appropriately.
4767 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004768 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004769 }
4770
John McCallb4a99d32013-02-19 01:57:35 +00004771 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4772 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4773 options::OPT_fvisibility_ms_compat)) {
4774 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4775 CmdArgs.push_back("-fvisibility");
4776 CmdArgs.push_back(A->getValue());
4777 } else {
4778 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4779 CmdArgs.push_back("-fvisibility");
4780 CmdArgs.push_back("hidden");
4781 CmdArgs.push_back("-ftype-visibility");
4782 CmdArgs.push_back("default");
4783 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004784 }
4785
Douglas Gregor08329632010-06-15 17:05:35 +00004786 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004787
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004788 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4789
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004790 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004791 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4792 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004793 CmdArgs.push_back("-ffreestanding");
4794
Daniel Dunbare357d562009-12-03 18:42:11 +00004795 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004796 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004797 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004798 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004799 // Emulated TLS is enabled by default on Android, and can be enabled manually
4800 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004801 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004802 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4803 EmulatedTLSDefault))
4804 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004805 // AltiVec-like language extensions aren't relevant for assembling.
4806 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004807 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004808 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4809 }
Richard Trieu91844232012-06-26 18:18:47 +00004810 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4811 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004812
Alexey Bataevdb390212015-05-20 04:24:19 +00004813 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004814 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4815 options::OPT_fno_openmp, false))
4816 switch (getOpenMPRuntime(getToolChain(), Args)) {
4817 case OMPRT_OMP:
4818 case OMPRT_IOMP5:
4819 // Clang can generate useful OpenMP code for these two runtime libraries.
4820 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004821
4822 // If no option regarding the use of TLS in OpenMP codegeneration is
4823 // given, decide a default based on the target. Otherwise rely on the
4824 // options and pass the right information to the frontend.
4825 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004826 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004827 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004828 break;
4829 default:
4830 // By default, if Clang doesn't know how to generate useful OpenMP code
4831 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4832 // down to the actual compilation.
4833 // FIXME: It would be better to have a mode which *only* omits IR
4834 // generation based on the OpenMP support so that we get consistent
4835 // semantic analysis, etc.
4836 break;
4837 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004838
Peter Collingbourne32701642013-11-01 18:16:25 +00004839 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004840 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004841
Eric Christopher459d2712013-02-19 06:16:53 +00004842 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004843 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4844 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4845 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4846 Arch == llvm::Triple::ppc64le))
4847 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4848 << "ppc/ppc64/ppc64le";
4849 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004850
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004851 // -fzvector is incompatible with -faltivec.
4852 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4853 if (Args.hasArg(options::OPT_faltivec))
4854 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4855 << "-faltivec";
4856
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004857 if (getToolChain().SupportsProfiling())
4858 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004859
4860 // -flax-vector-conversions is default.
4861 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4862 options::OPT_fno_lax_vector_conversions))
4863 CmdArgs.push_back("-fno-lax-vector-conversions");
4864
John Brawna7b4ec02015-08-10 11:11:28 +00004865 if (Args.getLastArg(options::OPT_fapple_kext) ||
4866 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004867 CmdArgs.push_back("-fapple-kext");
4868
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004869 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004870 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004871 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004872 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4873 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004874
4875 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4876 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004877 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004878 }
4879
Bob Wilson14adb362012-02-03 06:27:22 +00004880 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004881
Chandler Carruth6e501032011-03-27 00:04:55 +00004882 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4883 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004885 if (A->getOption().matches(options::OPT_fwrapv))
4886 CmdArgs.push_back("-fwrapv");
4887 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4888 options::OPT_fno_strict_overflow)) {
4889 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4890 CmdArgs.push_back("-fwrapv");
4891 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004892
4893 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4894 options::OPT_fno_reroll_loops))
4895 if (A->getOption().matches(options::OPT_freroll_loops))
4896 CmdArgs.push_back("-freroll-loops");
4897
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004898 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004899 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4900 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004901
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004902 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4903
Daniel Dunbar4930e332009-11-17 08:07:36 +00004904 // -stack-protector=0 is default.
4905 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004906 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4907 options::OPT_fstack_protector_all,
4908 options::OPT_fstack_protector_strong,
4909 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004910 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004911 StackProtectorLevel = std::max<unsigned>(
4912 LangOptions::SSPOn,
4913 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004914 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004915 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004916 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004917 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004918 } else {
4919 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004920 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004921 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004922 if (StackProtectorLevel) {
4923 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004924 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004925 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004926
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004927 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004928 for (const Arg *A : Args.filtered(options::OPT__param)) {
4929 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004930 if (Str.startswith("ssp-buffer-size=")) {
4931 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004932 CmdArgs.push_back("-stack-protector-buffer-size");
4933 // FIXME: Verify the argument is a valid integer.
4934 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004935 }
Sean Silva14facf32015-06-09 01:57:17 +00004936 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004937 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004938 }
4939
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004940 // Translate -mstackrealign
4941 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004942 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004943 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004944
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004945 if (Args.hasArg(options::OPT_mstack_alignment)) {
4946 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4947 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004948 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004949
Hans Wennborg77dc2362015-01-20 19:45:50 +00004950 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4951 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4952
4953 if (!Size.empty())
4954 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4955 else
4956 CmdArgs.push_back("-mstack-probe-size=0");
4957 }
4958
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004959 switch (getToolChain().getArch()) {
4960 case llvm::Triple::aarch64:
4961 case llvm::Triple::aarch64_be:
4962 case llvm::Triple::arm:
4963 case llvm::Triple::armeb:
4964 case llvm::Triple::thumb:
4965 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004966 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004967 break;
4968
4969 default:
4970 break;
4971 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004972
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004973 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4974 options::OPT_mno_restrict_it)) {
4975 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4976 CmdArgs.push_back("-backend-option");
4977 CmdArgs.push_back("-arm-restrict-it");
4978 } else {
4979 CmdArgs.push_back("-backend-option");
4980 CmdArgs.push_back("-arm-no-restrict-it");
4981 }
James Y Knight2db38f32015-08-15 03:45:25 +00004982 } else if (Triple.isOSWindows() &&
4983 (Triple.getArch() == llvm::Triple::arm ||
4984 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004985 // Windows on ARM expects restricted IT blocks
4986 CmdArgs.push_back("-backend-option");
4987 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004988 }
4989
Daniel Dunbard18049a2009-04-07 21:16:11 +00004990 // Forward -f options with positive and negative forms; we translate
4991 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004992 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4993 StringRef fname = A->getValue();
4994 if (!llvm::sys::fs::exists(fname))
4995 D.Diag(diag::err_drv_no_such_file) << fname;
4996 else
4997 A->render(Args, CmdArgs);
4998 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004999
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005000 // -fbuiltin is default unless -mkernel is used.
5001 bool UseBuiltins =
5002 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5003 !Args.hasArg(options::OPT_mkernel));
5004 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005005 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005006
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005007 // -ffreestanding implies -fno-builtin.
5008 if (Args.hasArg(options::OPT_ffreestanding))
5009 UseBuiltins = false;
5010
5011 // Process the -fno-builtin-* options.
5012 for (const auto &Arg : Args) {
5013 const Option &O = Arg->getOption();
5014 if (!O.matches(options::OPT_fno_builtin_))
5015 continue;
5016
5017 Arg->claim();
5018 // If -fno-builtin is specified, then there's no need to pass the option to
5019 // the frontend.
5020 if (!UseBuiltins)
5021 continue;
5022
5023 StringRef FuncName = Arg->getValue();
5024 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5025 }
5026
Nuno Lopes13c88c72009-12-16 16:59:22 +00005027 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5028 options::OPT_fno_assume_sane_operator_new))
5029 CmdArgs.push_back("-fno-assume-sane-operator-new");
5030
Daniel Dunbar4930e332009-11-17 08:07:36 +00005031 // -fblocks=0 is default.
5032 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005033 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005034 (Args.hasArg(options::OPT_fgnu_runtime) &&
5035 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5036 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005037 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005039 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005040 !getToolChain().hasBlocksRuntime())
5041 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005042 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005043
Richard Smith47972af2015-06-16 00:08:24 +00005044 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005045 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005046 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005047 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005048 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005049 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5050 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005051 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005052 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005053 HaveModules = true;
5054 }
5055 }
5056
Richard Smith47972af2015-06-16 00:08:24 +00005057 // -fmodule-maps enables implicit reading of module map files. By default,
5058 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005059 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5060 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005061 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005062 }
5063
Daniel Jasperac42b752013-10-21 06:34:34 +00005064 // -fmodules-decluse checks that modules used are declared so (off by
5065 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005066 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005067 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005068 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005069 }
5070
Daniel Jasper962b38e2014-04-11 11:47:45 +00005071 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5072 // all #included headers are part of modules.
5073 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005075 CmdArgs.push_back("-fmodules-strict-decluse");
5076 }
5077
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005078 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5079 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5080 options::OPT_fno_implicit_modules)) {
5081 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005082 } else if (HaveModules) {
5083 // -fmodule-cache-path specifies where our implicitly-built module files
5084 // should be written.
5085 SmallString<128> Path;
5086 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5087 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005088 if (C.isForDiagnostics()) {
5089 // When generating crash reports, we want to emit the modules along with
5090 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005091 Path = Output.getFilename();
5092 llvm::sys::path::replace_extension(Path, ".cache");
5093 llvm::sys::path::append(Path, "modules");
5094 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005095 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005096 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005097 llvm::sys::path::append(Path, "org.llvm.clang.");
5098 appendUserToPath(Path);
5099 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005100 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005101 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005102 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5103 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005104 }
5105
Richard Smith8d83d6d2016-03-21 19:06:06 +00005106 // -fmodule-name specifies the module that is currently being built (or
5107 // used for header checking by -fmodule-maps).
5108 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5109
5110 // -fmodule-map-file can be used to specify files containing module
5111 // definitions.
5112 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5113
5114 // -fmodule-file can be used to specify files containing precompiled modules.
5115 if (HaveModules)
5116 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5117 else
5118 Args.ClaimAllArgs(options::OPT_fmodule_file);
5119
Justin Bognera88f0122014-06-20 22:59:50 +00005120 // When building modules and generating crashdumps, we need to dump a module
5121 // dependency VFS alongside the output.
5122 if (HaveModules && C.isForDiagnostics()) {
5123 SmallString<128> VFSDir(Output.getFilename());
5124 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005125 // Add the cache directory as a temp so the crash diagnostics pick it up.
5126 C.addTempFile(Args.MakeArgString(VFSDir));
5127
Justin Bognera88f0122014-06-20 22:59:50 +00005128 llvm::sys::path::append(VFSDir, "vfs");
5129 CmdArgs.push_back("-module-dependency-dir");
5130 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005131 }
5132
Richard Smith9887d792014-10-17 01:42:53 +00005133 if (HaveModules)
5134 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005135
Douglas Gregor35b04d62013-02-07 19:01:24 +00005136 // Pass through all -fmodules-ignore-macro arguments.
5137 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005138 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5139 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005140
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005141 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5142
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005143 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5144 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5145 D.Diag(diag::err_drv_argument_not_allowed_with)
5146 << A->getAsString(Args) << "-fbuild-session-timestamp";
5147
5148 llvm::sys::fs::file_status Status;
5149 if (llvm::sys::fs::status(A->getValue(), Status))
5150 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005151 CmdArgs.push_back(Args.MakeArgString(
5152 "-fbuild-session-timestamp=" +
5153 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005154 }
5155
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005156 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005157 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5158 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005159 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5160
5161 Args.AddLastArg(CmdArgs,
5162 options::OPT_fmodules_validate_once_per_build_session);
5163 }
5164
Ben Langmuirdcf73862014-03-12 00:06:17 +00005165 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5166
John McCalldfea9982010-04-09 19:12:06 +00005167 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005168 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005170 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005171
Anders Carlssond470fef2010-11-21 00:09:52 +00005172 // -felide-constructors is the default.
5173 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005174 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005175 CmdArgs.push_back("-fno-elide-constructors");
5176
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005177 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005178
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005179 if (KernelOrKext || (types::isCXX(InputType) &&
5180 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5181 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005182 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005183
Tony Linthicum76329bf2011-12-12 21:14:55 +00005184 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005185 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5186 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005187 CmdArgs.push_back("-fshort-enums");
5188
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005189 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005190 if (Arg *A = Args.getLastArg(
5191 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5192 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5193 if (A->getOption().matches(options::OPT_funsigned_char) ||
5194 A->getOption().matches(options::OPT_fno_signed_char)) {
5195 CmdArgs.push_back("-fno-signed-char");
5196 }
5197 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005198 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005199 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005200
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005201 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005202 if (!Args.hasFlag(
5203 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5204 !IsWindowsCygnus && !IsWindowsGNU &&
5205 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5206 getToolChain().getArch() != llvm::Triple::hexagon &&
5207 getToolChain().getArch() != llvm::Triple::xcore &&
5208 ((getToolChain().getTriple().getVendor() !=
5209 llvm::Triple::MipsTechnologies) ||
5210 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005211 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005212 CmdArgs.push_back("-fno-use-cxa-atexit");
5213
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005214 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005215 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005216 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005217 CmdArgs.push_back("-fms-extensions");
5218
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005219 // -fno-use-line-directives is default.
5220 if (Args.hasFlag(options::OPT_fuse_line_directives,
5221 options::OPT_fno_use_line_directives, false))
5222 CmdArgs.push_back("-fuse-line-directives");
5223
Francois Pichet1b4f1632011-09-17 04:32:15 +00005224 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005225 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005226 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005227 (IsWindowsMSVC &&
5228 Args.hasFlag(options::OPT_fms_extensions,
5229 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005230 CmdArgs.push_back("-fms-compatibility");
5231
David Majnemerc371ff02015-03-22 08:39:22 +00005232 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005233 VersionTuple MSVT = visualstudio::getMSVCVersion(
5234 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5235 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005236 CmdArgs.push_back(
5237 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005238
David Majnemer8db91762015-05-18 04:49:30 +00005239 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5240 if (ImplyVCPPCXXVer) {
5241 if (IsMSVC2015Compatible)
5242 CmdArgs.push_back("-std=c++14");
5243 else
5244 CmdArgs.push_back("-std=c++11");
5245 }
5246
Eric Christopher5ecce122013-02-18 00:38:31 +00005247 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005248 if (Args.hasFlag(options::OPT_fborland_extensions,
5249 options::OPT_fno_borland_extensions, false))
5250 CmdArgs.push_back("-fborland-extensions");
5251
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005252 // -fno-declspec is default, except for PS4.
5253 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5254 getToolChain().getTriple().isPS4()))
5255 CmdArgs.push_back("-fdeclspec");
5256 else if (Args.hasArg(options::OPT_fno_declspec))
5257 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5258
David Majnemerc371ff02015-03-22 08:39:22 +00005259 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5260 // than 19.
5261 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5262 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005263 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005264 CmdArgs.push_back("-fno-threadsafe-statics");
5265
Francois Pichet02744872011-09-01 16:38:08 +00005266 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5267 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005268 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005269 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005270 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005271
Chandler Carruthe03aa552010-04-17 20:17:31 +00005272 // -fgnu-keywords default varies depending on language; only pass if
5273 // specified.
5274 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005275 options::OPT_fno_gnu_keywords))
5276 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005278 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005279 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005280 CmdArgs.push_back("-fgnu89-inline");
5281
Chad Rosier9c76d242012-03-15 22:31:42 +00005282 if (Args.hasArg(options::OPT_fno_inline))
5283 CmdArgs.push_back("-fno-inline");
5284
Chad Rosier64d6be92012-03-06 21:17:19 +00005285 if (Args.hasArg(options::OPT_fno_inline_functions))
5286 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005287
John McCall5fb5df92012-06-20 06:18:46 +00005288 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005289
John McCall5fb5df92012-06-20 06:18:46 +00005290 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005291 // legacy is the default. Except for deployment taget of 10.5,
5292 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5293 // gets ignored silently.
5294 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005295 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5296 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005297 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005298 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005299 if (getToolChain().UseObjCMixedDispatch())
5300 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5301 else
5302 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5303 }
5304 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005305
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005306 // When ObjectiveC legacy runtime is in effect on MacOSX,
5307 // turn on the option to do Array/Dictionary subscripting
5308 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005309 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005310 getToolChain().getTriple().isMacOSX() &&
5311 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5312 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005313 objcRuntime.isNeXTFamily())
5314 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005315
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005316 // -fencode-extended-block-signature=1 is default.
5317 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5318 CmdArgs.push_back("-fencode-extended-block-signature");
5319 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005320
John McCall24fc0de2011-07-06 00:26:06 +00005321 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5322 // NOTE: This logic is duplicated in ToolChains.cpp.
5323 bool ARC = isObjCAutoRefCount(Args);
5324 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005325 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005326
John McCall24fc0de2011-07-06 00:26:06 +00005327 CmdArgs.push_back("-fobjc-arc");
5328
Chandler Carruth491db322011-11-04 07:34:47 +00005329 // FIXME: It seems like this entire block, and several around it should be
5330 // wrapped in isObjC, but for now we just use it here as this is where it
5331 // was being used previously.
5332 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5333 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5334 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5335 else
5336 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5337 }
5338
John McCall24fc0de2011-07-06 00:26:06 +00005339 // Allow the user to enable full exceptions code emission.
5340 // We define off for Objective-CC, on for Objective-C++.
5341 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5342 options::OPT_fno_objc_arc_exceptions,
5343 /*default*/ types::isCXX(InputType)))
5344 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005345
John McCall24fc0de2011-07-06 00:26:06 +00005346 }
5347
5348 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5349 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005350 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005351 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005352
John McCall24fc0de2011-07-06 00:26:06 +00005353 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5354 // takes precedence.
5355 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5356 if (!GCArg)
5357 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5358 if (GCArg) {
5359 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005361 } else if (getToolChain().SupportsObjCGC()) {
5362 GCArg->render(Args, CmdArgs);
5363 } else {
5364 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005365 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005366 }
5367 }
5368
John McCallfbe5ed72015-11-05 19:19:56 +00005369 // Pass down -fobjc-weak or -fno-objc-weak if present.
5370 if (types::isObjC(InputType)) {
5371 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5372 options::OPT_fno_objc_weak);
5373 if (!WeakArg) {
5374 // nothing to do
5375 } else if (GCArg) {
5376 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5377 D.Diag(diag::err_objc_weak_with_gc);
5378 } else if (!objcRuntime.allowsWeak()) {
5379 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5380 D.Diag(diag::err_objc_weak_unsupported);
5381 } else {
5382 WeakArg->render(Args, CmdArgs);
5383 }
5384 }
5385
Bob Wilsonb111ec92015-03-02 19:01:14 +00005386 if (Args.hasFlag(options::OPT_fapplication_extension,
5387 options::OPT_fno_application_extension, false))
5388 CmdArgs.push_back("-fapplication-extension");
5389
Reid Klecknerc542d372014-06-27 17:02:02 +00005390 // Handle GCC-style exception args.
5391 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005392 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5393 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005394
Tim Northovere931f9f2015-10-30 16:30:41 +00005395 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005396 CmdArgs.push_back("-fsjlj-exceptions");
5397
5398 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005399 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5400 options::OPT_fno_assume_sane_operator_new))
5401 CmdArgs.push_back("-fno-assume-sane-operator-new");
5402
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005403 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5404 // most platforms.
5405 if (Args.hasFlag(options::OPT_fsized_deallocation,
5406 options::OPT_fno_sized_deallocation, false))
5407 CmdArgs.push_back("-fsized-deallocation");
5408
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005409 // -fconstant-cfstrings is default, and may be subject to argument translation
5410 // on Darwin.
5411 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5412 options::OPT_fno_constant_cfstrings) ||
5413 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5414 options::OPT_mno_constant_cfstrings))
5415 CmdArgs.push_back("-fno-constant-cfstrings");
5416
John Thompsoned4e2952009-11-05 20:14:16 +00005417 // -fshort-wchar default varies depending on platform; only
5418 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005419 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5420 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005421 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005422
Hans Wennborg28c96312013-07-31 23:39:13 +00005423 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005424 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005425 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005426 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005427
Daniel Dunbar096ed292011-10-05 21:04:55 +00005428 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5429 // -fno-pack-struct doesn't apply to -fpack-struct=.
5430 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005431 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005432 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005433 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005434 } else if (Args.hasFlag(options::OPT_fpack_struct,
5435 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005436 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005437 }
5438
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005439 // Handle -fmax-type-align=N and -fno-type-align
5440 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5441 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5442 if (!SkipMaxTypeAlign) {
5443 std::string MaxTypeAlignStr = "-fmax-type-align=";
5444 MaxTypeAlignStr += A->getValue();
5445 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5446 }
5447 } else if (getToolChain().getTriple().isOSDarwin()) {
5448 if (!SkipMaxTypeAlign) {
5449 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5450 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5451 }
5452 }
5453
John Brawna7b4ec02015-08-10 11:11:28 +00005454 // -fcommon is the default unless compiling kernel code or the target says so
5455 bool NoCommonDefault =
5456 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5457 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5458 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005459 CmdArgs.push_back("-fno-common");
5460
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005461 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005462 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005463 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005464 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005465 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005466 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005467
Daniel Dunbar6358d682010-10-15 22:30:42 +00005468 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005470 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005471 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005472
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005473 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005474 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5475 StringRef value = inputCharset->getValue();
5476 if (value != "UTF-8")
5477 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5478 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005479 }
5480
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005481 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005482 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5483 StringRef value = execCharset->getValue();
5484 if (value != "UTF-8")
5485 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5486 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005487 }
5488
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005489 // -fcaret-diagnostics is default.
5490 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5491 options::OPT_fno_caret_diagnostics, true))
5492 CmdArgs.push_back("-fno-caret-diagnostics");
5493
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005494 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005495 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005496 options::OPT_fno_diagnostics_fixit_info))
5497 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005498
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005499 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005500 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005501 options::OPT_fno_diagnostics_show_option))
5502 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005503
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005504 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005506 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005507 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005508 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005510 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005511 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005512 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005513 }
5514
Chandler Carruthb6766f02011-03-27 01:50:55 +00005515 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005516 options::OPT_fdiagnostics_show_note_include_stack,
5517 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005518 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005519 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005520 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5521 else
5522 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5523 }
5524
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005525 // Color diagnostics are the default, unless the terminal doesn't support
5526 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005527 // Support both clang's -f[no-]color-diagnostics and gcc's
5528 // -f[no-]diagnostics-colors[=never|always|auto].
5529 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005530 for (const auto &Arg : Args) {
5531 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005532 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5533 !O.matches(options::OPT_fdiagnostics_color) &&
5534 !O.matches(options::OPT_fno_color_diagnostics) &&
5535 !O.matches(options::OPT_fno_diagnostics_color) &&
5536 !O.matches(options::OPT_fdiagnostics_color_EQ))
5537 continue;
5538
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005539 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005540 if (O.matches(options::OPT_fcolor_diagnostics) ||
5541 O.matches(options::OPT_fdiagnostics_color)) {
5542 ShowColors = Colors_On;
5543 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5544 O.matches(options::OPT_fno_diagnostics_color)) {
5545 ShowColors = Colors_Off;
5546 } else {
5547 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005548 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005549 if (value == "always")
5550 ShowColors = Colors_On;
5551 else if (value == "never")
5552 ShowColors = Colors_Off;
5553 else if (value == "auto")
5554 ShowColors = Colors_Auto;
5555 else
5556 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005557 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005558 }
5559 }
5560 if (ShowColors == Colors_On ||
5561 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005562 CmdArgs.push_back("-fcolor-diagnostics");
5563
Nico Rieck7857d462013-09-11 00:38:02 +00005564 if (Args.hasArg(options::OPT_fansi_escape_codes))
5565 CmdArgs.push_back("-fansi-escape-codes");
5566
Daniel Dunbardb097022009-06-08 21:13:54 +00005567 if (!Args.hasFlag(options::OPT_fshow_source_location,
5568 options::OPT_fno_show_source_location))
5569 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005571 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005572 true))
5573 CmdArgs.push_back("-fno-show-column");
5574
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005575 if (!Args.hasFlag(options::OPT_fspell_checking,
5576 options::OPT_fno_spell_checking))
5577 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005578
Chad Rosierc8e56e82012-12-05 21:08:21 +00005579 // -fno-asm-blocks is default.
5580 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5581 false))
5582 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005583
Steven Wucb0d13f2015-01-16 23:05:28 +00005584 // -fgnu-inline-asm is default.
5585 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5586 options::OPT_fno_gnu_inline_asm, true))
5587 CmdArgs.push_back("-fno-gnu-inline-asm");
5588
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005589 // Enable vectorization per default according to the optimization level
5590 // selected. For optimization levels that want vectorization we use the alias
5591 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005592 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 OptSpecifier VectorizeAliasOption =
5594 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005595 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005596 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005597 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005598
Chad Rosier136d67d2014-04-28 19:30:57 +00005599 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005600 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005601 OptSpecifier SLPVectAliasOption =
5602 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005603 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005604 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005605 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005606
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005607 // -fno-slp-vectorize-aggressive is default.
5608 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005609 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005610 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005611
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005612 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5613 A->render(Args, CmdArgs);
5614
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005615 // -fdollars-in-identifiers default varies depending on platform and
5616 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005617 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005618 options::OPT_fno_dollars_in_identifiers)) {
5619 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005620 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005621 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005622 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005623 }
5624
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005625 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5626 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005627 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005628 options::OPT_fno_unit_at_a_time)) {
5629 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005630 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005631 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005632
Eli Friedman055c9702011-11-02 01:53:16 +00005633 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5634 options::OPT_fno_apple_pragma_pack, false))
5635 CmdArgs.push_back("-fapple-pragma-pack");
5636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005637 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005638 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5639 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005640 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005641 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005642 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005644// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5645//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005646// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005647#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005648 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005649 (getToolChain().getArch() == llvm::Triple::arm ||
5650 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005651 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5652 CmdArgs.push_back("-fno-builtin-strcat");
5653 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5654 CmdArgs.push_back("-fno-builtin-strcpy");
5655 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005656#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005657
Justin Bognera88f0122014-06-20 22:59:50 +00005658 // Enable rewrite includes if the user's asked for it or if we're generating
5659 // diagnostics.
5660 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5661 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005662 if (Args.hasFlag(options::OPT_frewrite_includes,
5663 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005664 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005665 CmdArgs.push_back("-frewrite-includes");
5666
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005667 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005668 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005669 options::OPT_traditional_cpp)) {
5670 if (isa<PreprocessJobAction>(JA))
5671 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005672 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005673 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005674 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005675
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005676 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005677 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005678
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005679 // Handle serialized diagnostics.
5680 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5681 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005682 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005683 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005684
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005685 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5686 CmdArgs.push_back("-fretain-comments-from-system-headers");
5687
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005688 // Forward -fcomment-block-commands to -cc1.
5689 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005690 // Forward -fparse-all-comments to -cc1.
5691 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005692
John Brawnad31ace2015-09-23 13:55:40 +00005693 // Turn -fplugin=name.so into -load name.so
5694 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5695 CmdArgs.push_back("-load");
5696 CmdArgs.push_back(A->getValue());
5697 A->claim();
5698 }
5699
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005700 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5701 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005702 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005703 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5704 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005705
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005706 // We translate this by hand to the -cc1 argument, since nightly test uses
5707 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005708 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005709 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005710 } else
Sean Silva14facf32015-06-09 01:57:17 +00005711 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005712 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005713
Bob Wilson23a55f12014-12-21 07:00:00 +00005714 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005715 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5716 // by the frontend.
5717 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5718 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005719
Daniel Dunbard67a3222009-03-30 06:36:42 +00005720 if (Output.getType() == types::TY_Dependencies) {
5721 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005722 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005723 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005724 CmdArgs.push_back(Output.getFilename());
5725 } else {
5726 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005727 }
5728
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005729 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005730
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005731 if (Input.isFilename())
5732 CmdArgs.push_back(Input.getFilename());
5733 else
5734 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005735
Chris Lattnere9d7d782009-11-03 19:50:27 +00005736 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5737
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005738 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005739
5740 // Optionally embed the -cc1 level arguments into the debug info, for build
5741 // analysis.
5742 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005743 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005744 for (const auto &Arg : Args)
5745 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005746
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005747 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005748 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005749 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005750 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005751 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005752 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005753 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005754 }
5755 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005756 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005757 }
5758
Eric Christopherd3804002013-02-22 20:12:52 +00005759 // Add the split debug info name to the command lines here so we
5760 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005761 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005762 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5763 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005764 const char *SplitDwarfOut;
5765 if (SplitDwarf) {
5766 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005767 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005768 CmdArgs.push_back(SplitDwarfOut);
5769 }
5770
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005771 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5772 // Include them with -fcuda-include-gpubinary.
5773 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005774 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005775 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005776 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005777 }
5778
Eric Christopherd3804002013-02-22 20:12:52 +00005779 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005780 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005781 Output.getType() == types::TY_Object &&
5782 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005783 auto CLCommand =
5784 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005785 C.addCommand(llvm::make_unique<FallbackCommand>(
5786 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005787 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5788 isa<PrecompileJobAction>(JA)) {
5789 // In /fallback builds, run the main compilation even if the pch generation
5790 // fails, so that the main compilation's fallback to cl.exe runs.
5791 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5792 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005793 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005794 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005795 }
5796
Eric Christopherf1545832013-02-22 23:50:16 +00005797 // Handle the debug info splitting at object creation time if we're
5798 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005799 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005800 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005801 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005802
Roman Divacky178e01602011-02-10 16:52:03 +00005803 if (Arg *A = Args.getLastArg(options::OPT_pg))
5804 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005805 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5806 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005807
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005808 // Claim some arguments which clang supports automatically.
5809
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005810 // -fpch-preprocess is used with gcc to add a special marker in the output to
5811 // include the PCH file. Clang's PTH solution is completely transparent, so we
5812 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005813 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005814
Daniel Dunbar17731772009-03-23 19:03:36 +00005815 // Claim some arguments which clang doesn't support, but we don't
5816 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005817 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5818 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005819
Rafael Espindolab0092d72013-09-04 19:37:35 +00005820 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005821 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005822}
5823
John McCall5fb5df92012-06-20 06:18:46 +00005824/// Add options related to the Objective-C runtime/ABI.
5825///
5826/// Returns true if the runtime is non-fragile.
5827ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5828 ArgStringList &cmdArgs,
5829 RewriteKind rewriteKind) const {
5830 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005831 Arg *runtimeArg =
5832 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5833 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005834
5835 // Just forward -fobjc-runtime= to the frontend. This supercedes
5836 // options about fragility.
5837 if (runtimeArg &&
5838 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5839 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005840 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005841 if (runtime.tryParse(value)) {
5842 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005844 }
5845
5846 runtimeArg->render(args, cmdArgs);
5847 return runtime;
5848 }
5849
5850 // Otherwise, we'll need the ABI "version". Version numbers are
5851 // slightly confusing for historical reasons:
5852 // 1 - Traditional "fragile" ABI
5853 // 2 - Non-fragile ABI, version 1
5854 // 3 - Non-fragile ABI, version 2
5855 unsigned objcABIVersion = 1;
5856 // If -fobjc-abi-version= is present, use that to set the version.
5857 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005858 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005859 if (value == "1")
5860 objcABIVersion = 1;
5861 else if (value == "2")
5862 objcABIVersion = 2;
5863 else if (value == "3")
5864 objcABIVersion = 3;
5865 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005866 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005867 } else {
5868 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005869 bool nonFragileABIIsDefault =
5870 (rewriteKind == RK_NonFragile ||
5871 (rewriteKind == RK_None &&
5872 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005873 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5874 options::OPT_fno_objc_nonfragile_abi,
5875 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005876// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005877#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5878 unsigned nonFragileABIVersion = 1;
5879#else
5880 unsigned nonFragileABIVersion = 2;
5881#endif
5882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005883 if (Arg *abiArg =
5884 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005885 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005886 if (value == "1")
5887 nonFragileABIVersion = 1;
5888 else if (value == "2")
5889 nonFragileABIVersion = 2;
5890 else
5891 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005892 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005893 }
5894
5895 objcABIVersion = 1 + nonFragileABIVersion;
5896 } else {
5897 objcABIVersion = 1;
5898 }
5899 }
5900
5901 // We don't actually care about the ABI version other than whether
5902 // it's non-fragile.
5903 bool isNonFragile = objcABIVersion != 1;
5904
5905 // If we have no runtime argument, ask the toolchain for its default runtime.
5906 // However, the rewriter only really supports the Mac runtime, so assume that.
5907 ObjCRuntime runtime;
5908 if (!runtimeArg) {
5909 switch (rewriteKind) {
5910 case RK_None:
5911 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5912 break;
5913 case RK_Fragile:
5914 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5915 break;
5916 case RK_NonFragile:
5917 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5918 break;
5919 }
5920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005921 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005922 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5923 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005924 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005925 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005927 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005928 } else {
5929 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5930 }
5931
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005932 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005933 } else {
5934 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005935 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005936 // non-fragile mode or the GCC runtime in fragile mode.
5937 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005938 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005939 else
5940 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005941 }
5942
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005943 cmdArgs.push_back(
5944 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005945 return runtime;
5946}
5947
Reid Klecknerc542d372014-06-27 17:02:02 +00005948static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5949 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5950 I += HaveDash;
5951 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005952}
Reid Klecknerc542d372014-06-27 17:02:02 +00005953
Benjamin Kramere003ca22015-10-28 13:54:16 +00005954namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005955struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005956 bool Synch = false;
5957 bool Asynch = false;
5958 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005959};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005960} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005961
5962/// /EH controls whether to run destructor cleanups when exceptions are
5963/// thrown. There are three modifiers:
5964/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5965/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5966/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005967/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005968/// The default is /EHs-c-, meaning cleanups are disabled.
5969static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5970 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005971
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005972 std::vector<std::string> EHArgs =
5973 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005974 for (auto EHVal : EHArgs) {
5975 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5976 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005977 case 'a':
5978 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005979 if (EH.Asynch)
5980 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 continue;
5982 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005983 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005984 continue;
5985 case 's':
5986 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005987 if (EH.Synch)
5988 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005989 continue;
5990 default:
5991 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005992 }
5993 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5994 break;
5995 }
5996 }
David Majnemerb8809092016-02-20 09:23:44 +00005997 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005998 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005999 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006000 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6001 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006002 EH.Synch = true;
6003 EH.NoUnwindC = true;
6004 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006005
Reid Klecknerc542d372014-06-27 17:02:02 +00006006 return EH;
6007}
6008
David Majnemercd5855e2016-02-29 01:40:36 +00006009void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6010 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006011 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006012 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006013 unsigned RTOptionID = options::OPT__SLASH_MT;
6014
Hans Wennborgf1a74252013-09-10 20:18:04 +00006015 if (Args.hasArg(options::OPT__SLASH_LDd))
6016 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6017 // but defining _DEBUG is sticky.
6018 RTOptionID = options::OPT__SLASH_MTd;
6019
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006020 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006021 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006022
David Majnemere2afb472015-07-24 06:49:13 +00006023 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006024 switch (RTOptionID) {
6025 case options::OPT__SLASH_MD:
6026 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006027 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006028 CmdArgs.push_back("-D_MT");
6029 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006030 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006031 break;
6032 case options::OPT__SLASH_MDd:
6033 CmdArgs.push_back("-D_DEBUG");
6034 CmdArgs.push_back("-D_MT");
6035 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006036 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006037 break;
6038 case options::OPT__SLASH_MT:
6039 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006040 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006041 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006042 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006043 break;
6044 case options::OPT__SLASH_MTd:
6045 CmdArgs.push_back("-D_DEBUG");
6046 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006047 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006048 break;
6049 default:
6050 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006051 }
6052
David Majnemere2afb472015-07-24 06:49:13 +00006053 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6054 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6055 } else {
6056 CmdArgs.push_back(FlagForCRT.data());
6057
6058 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6059 // users want. The /Za flag to cl.exe turns this off, but it's not
6060 // implemented in clang.
6061 CmdArgs.push_back("--dependent-lib=oldnames");
6062 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006063
Hans Wennborg8858a032014-07-21 23:42:07 +00006064 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6065 // would produce interleaved output, so ignore /showIncludes in such cases.
6066 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6067 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6068 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006069
David Majnemerf6072342014-07-01 22:24:56 +00006070 // This controls whether or not we emit RTTI data for polymorphic types.
6071 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6072 /*default=*/false))
6073 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006074
Reid Kleckner124955a2015-08-05 18:51:13 +00006075 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006076 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006077 if (*EmitCodeView)
6078 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006079 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006080 CmdArgs.push_back("-gcodeview");
6081
Reid Klecknerc542d372014-06-27 17:02:02 +00006082 const Driver &D = getToolChain().getDriver();
6083 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006084 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006085 if (types::isCXX(InputType))
6086 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006087 CmdArgs.push_back("-fexceptions");
6088 }
David Majnemercd5855e2016-02-29 01:40:36 +00006089 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6090 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006091
Hans Wennborge50cec32014-06-13 20:59:54 +00006092 // /EP should expand to -E -P.
6093 if (Args.hasArg(options::OPT__SLASH_EP)) {
6094 CmdArgs.push_back("-E");
6095 CmdArgs.push_back("-P");
6096 }
6097
David Majnemera5b195a2015-02-14 01:35:12 +00006098 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006099 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6100 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006101 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6102 else
6103 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6104
6105 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6106 VolatileOptionID = A->getOption().getID();
6107
6108 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6109 CmdArgs.push_back("-fms-volatile");
6110
David Majnemer86c318f2014-02-11 21:05:00 +00006111 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6112 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6113 if (MostGeneralArg && BestCaseArg)
6114 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6115 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6116
6117 if (MostGeneralArg) {
6118 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6119 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6120 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6121
6122 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6123 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6124 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6125 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6126 << FirstConflict->getAsString(Args)
6127 << SecondConflict->getAsString(Args);
6128
6129 if (SingleArg)
6130 CmdArgs.push_back("-fms-memptr-rep=single");
6131 else if (MultipleArg)
6132 CmdArgs.push_back("-fms-memptr-rep=multiple");
6133 else
6134 CmdArgs.push_back("-fms-memptr-rep=virtual");
6135 }
6136
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006137 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6138 A->render(Args, CmdArgs);
6139
Hans Wennborg81f74482013-09-10 01:07:07 +00006140 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6141 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006142 if (Args.hasArg(options::OPT__SLASH_fallback))
6143 CmdArgs.push_back("msvc-fallback");
6144 else
6145 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006146 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006147}
6148
Douglas Katzman95354292015-06-23 20:42:09 +00006149visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006150 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006151 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006152 return CLFallback.get();
6153}
6154
Daniel Sanders7f933f42015-01-30 17:35:23 +00006155void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6156 ArgStringList &CmdArgs) const {
6157 StringRef CPUName;
6158 StringRef ABIName;
6159 const llvm::Triple &Triple = getToolChain().getTriple();
6160 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6161
6162 CmdArgs.push_back("-target-abi");
6163 CmdArgs.push_back(ABIName.data());
6164}
6165
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006166void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006167 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006168 const ArgList &Args,
6169 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006170 ArgStringList CmdArgs;
6171
6172 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6173 const InputInfo &Input = Inputs[0];
6174
James Y Knight2db38f32015-08-15 03:45:25 +00006175 std::string TripleStr =
6176 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6177 const llvm::Triple Triple(TripleStr);
6178
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006179 // Don't warn about "clang -w -c foo.s"
6180 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006181 // and "clang -emit-llvm -c foo.s"
6182 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006183
Rafael Espindola577637a2015-01-03 00:06:04 +00006184 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006185
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006186 // Invoke ourselves in -cc1as mode.
6187 //
6188 // FIXME: Implement custom jobs for internal actions.
6189 CmdArgs.push_back("-cc1as");
6190
6191 // Add the "effective" target triple.
6192 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006193 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6194
6195 // Set the output mode, we currently only expect to be used as a real
6196 // assembler.
6197 CmdArgs.push_back("-filetype");
6198 CmdArgs.push_back("obj");
6199
Eric Christopher45f2e712012-12-18 00:31:10 +00006200 // Set the main file name, so that debug info works even with
6201 // -save-temps or preprocessed assembly.
6202 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006203 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006204
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006205 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006206 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006207 if (!CPU.empty()) {
6208 CmdArgs.push_back("-target-cpu");
6209 CmdArgs.push_back(Args.MakeArgString(CPU));
6210 }
6211
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006212 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006213 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006214
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006215 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006216 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006217
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006218 // Pass along any -I options so we get proper .include search paths.
6219 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6220
Eric Christopherfc3ee562012-01-10 00:38:01 +00006221 // Determine the original source input.
6222 const Action *SourceAction = &JA;
6223 while (SourceAction->getKind() != Action::InputClass) {
6224 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6225 SourceAction = SourceAction->getInputs()[0];
6226 }
6227
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006228 // Forward -g and handle debug info related flags, assuming we are dealing
6229 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006230 if (SourceAction->getType() == types::TY_Asm ||
6231 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006232 bool WantDebug = false;
6233 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006234 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006235 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006236 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6237 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006238 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006239 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006240 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006241 if (DwarfVersion == 0)
6242 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006243 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006244 (WantDebug ? codegenoptions::LimitedDebugInfo
6245 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006246 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006247
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006248 // Add the -fdebug-compilation-dir flag if needed.
6249 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006250
6251 // Set the AT_producer to the clang version when using the integrated
6252 // assembler on assembly source files.
6253 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006254 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6255 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006256
6257 // And pass along -I options
6258 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006259 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006260
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006261 // Handle -fPIC et al -- the relocation-model affects the assembler
6262 // for some targets.
6263 llvm::Reloc::Model RelocationModel;
6264 unsigned PICLevel;
6265 bool IsPIE;
6266 std::tie(RelocationModel, PICLevel, IsPIE) =
6267 ParsePICArgs(getToolChain(), Triple, Args);
6268
6269 const char *RMName = RelocationModelName(RelocationModel);
6270 if (RMName) {
6271 CmdArgs.push_back("-mrelocation-model");
6272 CmdArgs.push_back(RMName);
6273 }
6274
Kevin Enderby292dc082011-12-22 19:31:58 +00006275 // Optionally embed the -cc1as level arguments into the debug info, for build
6276 // analysis.
6277 if (getToolChain().UseDwarfDebugFlags()) {
6278 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006279 for (const auto &Arg : Args)
6280 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006281
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006282 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006283 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6284 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006285 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006286 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006287 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006288 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006289 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006290 }
6291 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006292 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006293 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006294
6295 // FIXME: Add -static support, once we have it.
6296
Daniel Sanders7f933f42015-01-30 17:35:23 +00006297 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006298 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006299 default:
6300 break;
6301
6302 case llvm::Triple::mips:
6303 case llvm::Triple::mipsel:
6304 case llvm::Triple::mips64:
6305 case llvm::Triple::mips64el:
6306 AddMIPSTargetArgs(Args, CmdArgs);
6307 break;
6308 }
6309
David Blaikie372d9502014-01-17 03:17:40 +00006310 // Consume all the warning flags. Usually this would be handled more
6311 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6312 // doesn't handle that so rather than warning about unused flags that are
6313 // actually used, we'll lie by omission instead.
6314 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006315 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006316
David Blaikie9260ed62013-07-25 21:19:01 +00006317 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6318 getToolChain().getDriver());
6319
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006320 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006321
6322 assert(Output.isFilename() && "Unexpected lipo output.");
6323 CmdArgs.push_back("-o");
6324 CmdArgs.push_back(Output.getFilename());
6325
Daniel Dunbarb440f562010-08-02 02:38:21 +00006326 assert(Input.isFilename() && "Invalid input.");
6327 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006328
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006329 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006330 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006331
6332 // Handle the debug info splitting at object creation time if we're
6333 // creating an object.
6334 // TODO: Currently only works on linux with newer objcopy.
6335 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006336 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006337 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006338 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006339}
6340
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006341void GnuTool::anchor() {}
6342
Daniel Dunbara3246a02009-03-18 08:07:30 +00006343void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006344 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006345 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006346 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006347 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006348 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006349
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006350 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006351 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006352 // It is unfortunate that we have to claim here, as this means
6353 // we will basically never report anything interesting for
6354 // platforms using a generic gcc, even if we are just using gcc
6355 // to get to the assembler.
6356 A->claim();
6357
Daniel Dunbar939c1212010-08-03 16:14:14 +00006358 // Don't forward any -g arguments to assembly steps.
6359 if (isa<AssembleJobAction>(JA) &&
6360 A->getOption().matches(options::OPT_g_Group))
6361 continue;
6362
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006363 // Don't forward any -W arguments to assembly and link steps.
6364 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6365 A->getOption().matches(options::OPT_W_Group))
6366 continue;
6367
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006368 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006369 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006370 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006371
Daniel Dunbar4e295052010-01-25 22:35:08 +00006372 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006373
6374 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006375 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006376 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006377 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006378 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006379 }
6380
Daniel Dunbar5716d872009-05-02 21:41:52 +00006381 // Try to force gcc to match the tool chain we want, if we recognize
6382 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006383 //
6384 // FIXME: The triple class should directly provide the information we want
6385 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006386 switch (getToolChain().getArch()) {
6387 default:
6388 break;
6389 case llvm::Triple::x86:
6390 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006391 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006392 break;
6393 case llvm::Triple::x86_64:
6394 case llvm::Triple::ppc64:
6395 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006396 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006397 break;
6398 case llvm::Triple::sparcel:
6399 CmdArgs.push_back("-EL");
6400 break;
6401 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006402
Daniel Dunbarb440f562010-08-02 02:38:21 +00006403 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006404 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006405 CmdArgs.push_back(Output.getFilename());
6406 } else {
6407 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006408 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006409 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006410
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006411 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006412
6413 // Only pass -x if gcc will understand it; otherwise hope gcc
6414 // understands the suffix correctly. The main use case this would go
6415 // wrong in is for linker inputs if they happened to have an odd
6416 // suffix; really the only way to get this to happen is a command
6417 // like '-x foobar a.c' which will treat a.c like a linker input.
6418 //
6419 // FIXME: For the linker case specifically, can we safely convert
6420 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006421 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006422 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006423 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006424 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006425 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006426 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006427 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006428 else if (II.getType() == types::TY_ModuleFile)
6429 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006430 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006431
Daniel Dunbara3246a02009-03-18 08:07:30 +00006432 if (types::canTypeBeUserSpecified(II.getType())) {
6433 CmdArgs.push_back("-x");
6434 CmdArgs.push_back(types::getTypeName(II.getType()));
6435 }
6436
Daniel Dunbarb440f562010-08-02 02:38:21 +00006437 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006438 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006439 else {
6440 const Arg &A = II.getInputArg();
6441
6442 // Reverse translate some rewritten options.
6443 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6444 CmdArgs.push_back("-lstdc++");
6445 continue;
6446 }
6447
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006448 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006449 A.render(Args, CmdArgs);
6450 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006451 }
6452
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006453 const std::string customGCCName = D.getCCCGenericGCCName();
6454 const char *GCCName;
6455 if (!customGCCName.empty())
6456 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006457 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006458 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006459 } else
6460 GCCName = "gcc";
6461
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006462 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006463 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006464}
6465
Douglas Katzman95354292015-06-23 20:42:09 +00006466void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6467 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006468 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006469}
6470
Douglas Katzman95354292015-06-23 20:42:09 +00006471void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6472 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006473 const Driver &D = getToolChain().getDriver();
6474
Eric Christophercc7ff502015-01-29 00:56:17 +00006475 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006476 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006477 case types::TY_LLVM_IR:
6478 case types::TY_LTO_IR:
6479 case types::TY_LLVM_BC:
6480 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006481 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006482 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006483 // We assume we've got an "integrated" assembler in that gcc will produce an
6484 // object file itself.
6485 case types::TY_Object:
6486 CmdArgs.push_back("-c");
6487 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006488 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006489 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006490 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006491 case types::TY_Nothing:
6492 CmdArgs.push_back("-fsyntax-only");
6493 break;
6494 default:
6495 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006496 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006497}
6498
Douglas Katzman95354292015-06-23 20:42:09 +00006499void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6500 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006501 // The types are (hopefully) good enough.
6502}
6503
Tony Linthicum76329bf2011-12-12 21:14:55 +00006504// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006505void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006506 ArgStringList &CmdArgs) const {
6507}
6508
Douglas Katzman95354292015-06-23 20:42:09 +00006509void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6510 const InputInfo &Output,
6511 const InputInfoList &Inputs,
6512 const ArgList &Args,
6513 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006514 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006515
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6517 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006518 ArgStringList CmdArgs;
6519
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 std::string MArchString = "-march=hexagon";
6521 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006522
6523 RenderExtraToolArgs(JA, CmdArgs);
6524
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 std::string AsName = "hexagon-llvm-mc";
6526 std::string MCpuString = "-mcpu=hexagon" +
6527 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6528 CmdArgs.push_back("-filetype=obj");
6529 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6530
Tony Linthicum76329bf2011-12-12 21:14:55 +00006531 if (Output.isFilename()) {
6532 CmdArgs.push_back("-o");
6533 CmdArgs.push_back(Output.getFilename());
6534 } else {
6535 assert(Output.isNothing() && "Unexpected output");
6536 CmdArgs.push_back("-fsyntax-only");
6537 }
6538
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006539 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6540 std::string N = llvm::utostr(G.getValue());
6541 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6542 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006543
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006544 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006545
Tony Linthicum76329bf2011-12-12 21:14:55 +00006546 // Only pass -x if gcc will understand it; otherwise hope gcc
6547 // understands the suffix correctly. The main use case this would go
6548 // wrong in is for linker inputs if they happened to have an odd
6549 // suffix; really the only way to get this to happen is a command
6550 // like '-x foobar a.c' which will treat a.c like a linker input.
6551 //
6552 // FIXME: For the linker case specifically, can we safely convert
6553 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006554 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006555 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006556 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006557 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559 else if (II.getType() == types::TY_AST)
6560 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006561 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006562 else if (II.getType() == types::TY_ModuleFile)
6563 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006564 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006565
6566 if (II.isFilename())
6567 CmdArgs.push_back(II.getFilename());
6568 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006569 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006570 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006571 II.getInputArg().render(Args, CmdArgs);
6572 }
6573
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006575 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006576}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006577
Douglas Katzman95354292015-06-23 20:42:09 +00006578void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6579 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006580}
6581
Douglas Katzman54366072015-07-27 16:53:08 +00006582static void
6583constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006584 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006585 const InputInfo &Output, const InputInfoList &Inputs,
6586 const ArgList &Args, ArgStringList &CmdArgs,
6587 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006588
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006590
Matthew Curtise689b052012-12-06 15:46:07 +00006591 //----------------------------------------------------------------------------
6592 //
6593 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006594 bool IsStatic = Args.hasArg(options::OPT_static);
6595 bool IsShared = Args.hasArg(options::OPT_shared);
6596 bool IsPIE = Args.hasArg(options::OPT_pie);
6597 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6598 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6599 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6600 bool UseG0 = false;
6601 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006602
Matthew Curtise689b052012-12-06 15:46:07 +00006603 //----------------------------------------------------------------------------
6604 // Silence warnings for various options
6605 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006606 Args.ClaimAllArgs(options::OPT_g_Group);
6607 Args.ClaimAllArgs(options::OPT_emit_llvm);
6608 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6609 // handled somewhere else.
6610 Args.ClaimAllArgs(options::OPT_static_libgcc);
6611
6612 //----------------------------------------------------------------------------
6613 //
6614 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006615 if (Args.hasArg(options::OPT_s))
6616 CmdArgs.push_back("-s");
6617
6618 if (Args.hasArg(options::OPT_r))
6619 CmdArgs.push_back("-r");
6620
6621 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006622 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006623
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006624 CmdArgs.push_back("-march=hexagon");
6625 std::string CpuVer =
6626 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6627 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6628 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006629
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006631 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006632 // The following should be the default, but doing as hexagon-gcc does.
6633 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006634 }
6635
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006636 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006637 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006638
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006639 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006640 CmdArgs.push_back("-pie");
6641
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006642 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6643 std::string N = llvm::utostr(G.getValue());
6644 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6645 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006646 }
6647
Matthew Curtise689b052012-12-06 15:46:07 +00006648 //----------------------------------------------------------------------------
6649 //
6650 //----------------------------------------------------------------------------
6651 CmdArgs.push_back("-o");
6652 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006653
Matthew Curtise689b052012-12-06 15:46:07 +00006654 //----------------------------------------------------------------------------
6655 // moslib
6656 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657 std::vector<std::string> OsLibs;
6658 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006659
Sean Silva14facf32015-06-09 01:57:17 +00006660 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6661 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006662 OsLibs.emplace_back(A->getValue());
6663 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006664 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006665 if (OsLibs.empty()) {
6666 OsLibs.push_back("standalone");
6667 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006668 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006669
Matthew Curtise689b052012-12-06 15:46:07 +00006670 //----------------------------------------------------------------------------
6671 // Start Files
6672 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006673 const std::string MCpuSuffix = "/" + CpuVer;
6674 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6675 const std::string RootDir =
6676 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6677 const std::string StartSubDir =
6678 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006679
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006680 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6681 const char *Name) -> std::string {
6682 std::string RelName = SubDir + Name;
6683 std::string P = HTC.GetFilePath(RelName.c_str());
6684 if (llvm::sys::fs::exists(P))
6685 return P;
6686 return RootDir + RelName;
6687 };
6688
6689 if (IncStdLib && IncStartFiles) {
6690 if (!IsShared) {
6691 if (HasStandalone) {
6692 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6693 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006694 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006695 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6696 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006697 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006698 std::string Init = UseShared
6699 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6700 : Find(RootDir, StartSubDir, "/init.o");
6701 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006702 }
6703
6704 //----------------------------------------------------------------------------
6705 // Library Search Paths
6706 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006707 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6708 for (const auto &LibPath : LibPaths)
6709 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006710
6711 //----------------------------------------------------------------------------
6712 //
6713 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006714 Args.AddAllArgs(CmdArgs,
6715 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6716 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006717
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006718 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006719
6720 //----------------------------------------------------------------------------
6721 // Libraries
6722 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006723 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006724 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006725 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006726 CmdArgs.push_back("-lm");
6727 }
6728
6729 CmdArgs.push_back("--start-group");
6730
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006731 if (!IsShared) {
6732 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006733 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006734 CmdArgs.push_back("-lc");
6735 }
6736 CmdArgs.push_back("-lgcc");
6737
6738 CmdArgs.push_back("--end-group");
6739 }
6740
6741 //----------------------------------------------------------------------------
6742 // End files
6743 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006744 if (IncStdLib && IncStartFiles) {
6745 std::string Fini = UseShared
6746 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6747 : Find(RootDir, StartSubDir, "/fini.o");
6748 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006749 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006750}
6751
Douglas Katzman95354292015-06-23 20:42:09 +00006752void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6753 const InputInfo &Output,
6754 const InputInfoList &Inputs,
6755 const ArgList &Args,
6756 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006757 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006758
6759 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006760 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006761 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006762
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006763 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006764 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006765 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006766}
6767// Hexagon tools end.
6768
Tom Stellard8fa33092015-07-18 01:49:05 +00006769void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6770 const InputInfo &Output,
6771 const InputInfoList &Inputs,
6772 const ArgList &Args,
6773 const char *LinkingOutput) const {
6774
6775 std::string Linker = getToolChain().GetProgramPath(getShortName());
6776 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006777 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006778 CmdArgs.push_back(Output.getFilename());
6779 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6780 CmdArgs, Inputs));
6781}
6782// AMDGPU tools end.
6783
Dan Gohman52816862015-12-16 23:30:41 +00006784wasm::Linker::Linker(const ToolChain &TC)
6785 : GnuTool("wasm::Linker", "lld", TC) {}
6786
6787bool wasm::Linker::isLinkJob() const {
6788 return true;
6789}
6790
6791bool wasm::Linker::hasIntegratedCPP() const {
6792 return false;
6793}
6794
6795void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6796 const InputInfo &Output,
6797 const InputInfoList &Inputs,
6798 const ArgList &Args,
6799 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006800
6801 const ToolChain &ToolChain = getToolChain();
6802 const Driver &D = ToolChain.getDriver();
6803 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006804 ArgStringList CmdArgs;
6805 CmdArgs.push_back("-flavor");
6806 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006807
6808 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006809 // size is of particular importance. This is significantly facilitated by
6810 // the enabling of -ffunction-sections and -fdata-sections in
6811 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006812 if (areOptimizationsEnabled(Args))
6813 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006814
Dan Gohman57b62c52016-02-22 19:26:15 +00006815 if (Args.hasArg(options::OPT_rdynamic))
6816 CmdArgs.push_back("-export-dynamic");
6817 if (Args.hasArg(options::OPT_s))
6818 CmdArgs.push_back("--strip-all");
6819 if (Args.hasArg(options::OPT_shared))
6820 CmdArgs.push_back("-shared");
6821 if (Args.hasArg(options::OPT_static))
6822 CmdArgs.push_back("-Bstatic");
6823
6824 Args.AddAllArgs(CmdArgs, options::OPT_L);
6825 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6826
6827 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6828 if (Args.hasArg(options::OPT_shared))
6829 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6830 else if (Args.hasArg(options::OPT_pie))
6831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6832 else
6833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6834
6835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6836 }
6837
6838 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6839
6840 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6841 if (D.CCCIsCXX())
6842 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6843
6844 if (Args.hasArg(options::OPT_pthread))
6845 CmdArgs.push_back("-lpthread");
6846
6847 CmdArgs.push_back("-lc");
6848 CmdArgs.push_back("-lcompiler_rt");
6849 }
6850
6851 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6852 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6853
Dan Gohman52816862015-12-16 23:30:41 +00006854 CmdArgs.push_back("-o");
6855 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006856
Dan Gohman52816862015-12-16 23:30:41 +00006857 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6858}
6859
Renato Golin7c542b42015-07-27 23:44:45 +00006860const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006861 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006862 if (!Arch.empty())
6863 MArch = Arch;
6864 else
Bernard Ogden31561762013-12-12 13:27:11 +00006865 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006866 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006867
6868 // Handle -march=native.
6869 if (MArch == "native") {
6870 std::string CPU = llvm::sys::getHostCPUName();
6871 if (CPU != "generic") {
6872 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006873 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006874 // If there is no valid architecture suffix for this CPU we don't know how
6875 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006876 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006877 MArch = "";
6878 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006879 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006880 }
6881 }
6882
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006883 return MArch;
6884}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006885
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006886/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006887StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006888 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006889 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6890 // here means an -march=native that we can't handle, so instead return no CPU.
6891 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006892 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006893
John Brawna95c1a82015-05-08 12:52:18 +00006894 // We need to return an empty string here on invalid MArch values as the
6895 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006896 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006897}
6898
6899/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006900std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006901 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006902 // FIXME: Warn on inconsistent use of -mcpu and -march.
6903 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006904 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006905 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006906 // Handle -mcpu=native.
6907 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006908 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006909 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006910 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006911 }
6912
Renato Goline17c5802015-07-27 23:44:42 +00006913 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006914}
6915
6916/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006917/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006918// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006919StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6920 const llvm::Triple &Triple) {
6921 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006922 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006923 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006924 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006925 if (ArchKind == llvm::ARM::AK_INVALID)
6926 // In case of generic Arch, i.e. "arm",
6927 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006928 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006929 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006930 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6931 // armv7k triple if it's actually been specified via "-arch armv7k".
6932 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006933 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006934 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006935 }
Renato Golin3c007252015-05-28 15:05:53 +00006936 if (ArchKind == llvm::ARM::AK_INVALID)
6937 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006938 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006939}
6940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006941void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006942 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006943 if (Args.hasArg(options::OPT_r))
6944 return;
6945
John Brawn94fd9632015-05-21 12:19:49 +00006946 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6947 // to generate BE-8 executables.
6948 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6949 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006950}
6951
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006952mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006953 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6954 // was first introduced in Release 3. However, other compilers have
6955 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006956 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6957 .Case("mips1", NanLegacy)
6958 .Case("mips2", NanLegacy)
6959 .Case("mips3", NanLegacy)
6960 .Case("mips4", NanLegacy)
6961 .Case("mips5", NanLegacy)
6962 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006963 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006964 .Case("mips32r3", NanLegacy | Nan2008)
6965 .Case("mips32r5", NanLegacy | Nan2008)
6966 .Case("mips32r6", Nan2008)
6967 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006968 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006969 .Case("mips64r3", NanLegacy | Nan2008)
6970 .Case("mips64r5", NanLegacy | Nan2008)
6971 .Case("mips64r6", Nan2008)
6972 .Default(NanLegacy);
6973}
6974
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006975bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6976 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6977 return A && (A->getValue() == StringRef(Value));
6978}
6979
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006980bool mips::isUCLibc(const ArgList &Args) {
6981 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006982 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006983}
6984
Daniel Sanders2bf13662014-07-10 14:40:57 +00006985bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006986 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6987 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006988 .Case("2008", true)
6989 .Case("legacy", false)
6990 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006991
6992 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006993 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006994 .Cases("mips32r6", "mips64r6", true)
6995 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006996
6997 return false;
6998}
6999
Daniel Sanders379d44b2014-07-16 11:52:23 +00007000bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007001 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007002 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00007003 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00007004 return false;
7005
7006 if (ABIName != "32")
7007 return false;
7008
Toma Tabacu94ea6862015-06-16 13:54:13 +00007009 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7010 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007011 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007012 return false;
7013
Daniel Sanders379d44b2014-07-16 11:52:23 +00007014 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007015 .Cases("mips2", "mips3", "mips4", "mips5", true)
7016 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7017 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7018 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007019}
7020
Toma Tabacu94ea6862015-06-16 13:54:13 +00007021bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7022 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007023 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007024 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7025
7026 // FPXX shouldn't be used if -msingle-float is present.
7027 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7028 options::OPT_mdouble_float))
7029 if (A->getOption().matches(options::OPT_msingle_float))
7030 UseFPXX = false;
7031
7032 return UseFPXX;
7033}
7034
Tim Northover157d9112014-01-16 08:48:16 +00007035llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007036 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7037 // archs which Darwin doesn't use.
7038
7039 // The matching this routine does is fairly pointless, since it is neither the
7040 // complete architecture list, nor a reasonable subset. The problem is that
7041 // historically the driver driver accepts this and also ties its -march=
7042 // handling to the architecture name, so we need to be careful before removing
7043 // support for it.
7044
7045 // This code must be kept in sync with Clang's Darwin specific argument
7046 // translation.
7047
7048 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007049 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7050 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7051 .Case("ppc64", llvm::Triple::ppc64)
7052 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7053 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7054 llvm::Triple::x86)
7055 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7056 // This is derived from the driver driver.
7057 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7058 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7059 .Cases("armv7s", "xscale", llvm::Triple::arm)
7060 .Case("arm64", llvm::Triple::aarch64)
7061 .Case("r600", llvm::Triple::r600)
7062 .Case("amdgcn", llvm::Triple::amdgcn)
7063 .Case("nvptx", llvm::Triple::nvptx)
7064 .Case("nvptx64", llvm::Triple::nvptx64)
7065 .Case("amdil", llvm::Triple::amdil)
7066 .Case("spir", llvm::Triple::spir)
7067 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007068}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007069
Tim Northover157d9112014-01-16 08:48:16 +00007070void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007071 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007072 T.setArch(Arch);
7073
7074 if (Str == "x86_64h")
7075 T.setArchName(Str);
7076 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7077 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007078 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007079 }
7080}
7081
Bob Wilsondecc03e2012-11-23 06:14:39 +00007082const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007083 const InputInfo &Input) {
7084 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007085}
7086
Bob Wilsondecc03e2012-11-23 06:14:39 +00007087const char *Clang::getBaseInputStem(const ArgList &Args,
7088 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007089 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007090
Chris Lattner906bb902011-01-16 08:14:11 +00007091 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007092 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007093
7094 return Str;
7095}
7096
Bob Wilsondecc03e2012-11-23 06:14:39 +00007097const char *Clang::getDependencyFileName(const ArgList &Args,
7098 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007099 // FIXME: Think about this more.
7100 std::string Res;
7101
7102 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007103 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007104 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007105 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007106 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007107 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007108 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007109}
7110
Douglas Katzman95354292015-06-23 20:42:09 +00007111void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7112 const InputInfo &Output,
7113 const InputInfoList &Inputs,
7114 const ArgList &Args,
7115 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007116 const ToolChain &ToolChain = getToolChain();
7117 const Driver &D = ToolChain.getDriver();
7118 ArgStringList CmdArgs;
7119
7120 // Silence warning for "clang -g foo.o -o foo"
7121 Args.ClaimAllArgs(options::OPT_g_Group);
7122 // and "clang -emit-llvm foo.o -o foo"
7123 Args.ClaimAllArgs(options::OPT_emit_llvm);
7124 // and for "clang -w foo.o -o foo". Other warning options are already
7125 // handled somewhere else.
7126 Args.ClaimAllArgs(options::OPT_w);
7127
7128 if (!D.SysRoot.empty())
7129 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7130
7131 // CloudABI only supports static linkage.
7132 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007133
7134 // CloudABI uses Position Independent Executables exclusively.
7135 CmdArgs.push_back("-pie");
7136 CmdArgs.push_back("--no-dynamic-linker");
7137 CmdArgs.push_back("-zrelro");
7138
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007139 CmdArgs.push_back("--eh-frame-hdr");
7140 CmdArgs.push_back("--gc-sections");
7141
7142 if (Output.isFilename()) {
7143 CmdArgs.push_back("-o");
7144 CmdArgs.push_back(Output.getFilename());
7145 } else {
7146 assert(Output.isNothing() && "Invalid output.");
7147 }
7148
Douglas Katzman78b37b02015-11-17 20:28:07 +00007149 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007150 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7151 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7152 }
7153
7154 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007155 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007156 Args.AddAllArgs(CmdArgs,
7157 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7158 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007159
Teresa Johnson945bc502015-10-15 20:35:53 +00007160 if (D.isUsingLTO())
7161 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007162
7163 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7164
Douglas Katzman78b37b02015-11-17 20:28:07 +00007165 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007166 if (D.CCCIsCXX())
7167 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7168 CmdArgs.push_back("-lc");
7169 CmdArgs.push_back("-lcompiler_rt");
7170 }
7171
Douglas Katzman78b37b02015-11-17 20:28:07 +00007172 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007173 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7174
7175 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007176 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007177}
7178
Douglas Katzman95354292015-06-23 20:42:09 +00007179void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7180 const InputInfo &Output,
7181 const InputInfoList &Inputs,
7182 const ArgList &Args,
7183 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007184 ArgStringList CmdArgs;
7185
7186 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7187 const InputInfo &Input = Inputs[0];
7188
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007189 // Determine the original source input.
7190 const Action *SourceAction = &JA;
7191 while (SourceAction->getKind() != Action::InputClass) {
7192 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7193 SourceAction = SourceAction->getInputs()[0];
7194 }
7195
Eric Christopherf5a8f492015-12-08 00:10:10 +00007196 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007197 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007198 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7199 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007200 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007201 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007202 const llvm::Triple &T(getToolChain().getTriple());
7203 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007204 CmdArgs.push_back("-Q");
7205 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007206
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007207 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007208 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007209 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007210 if (Args.hasArg(options::OPT_gstabs))
7211 CmdArgs.push_back("--gstabs");
7212 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007213 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007214 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007215
Daniel Dunbarbe220842009-03-20 16:06:39 +00007216 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007217 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007218
Daniel Dunbar6d484762010-07-22 01:47:22 +00007219 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007220 if (getToolChain().getArch() == llvm::Triple::x86 ||
7221 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007222 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7223 CmdArgs.push_back("-force_cpusubtype_ALL");
7224
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007225 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007226 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007227 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007228 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007229 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007230 CmdArgs.push_back("-static");
7231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007232 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007233
7234 assert(Output.isFilename() && "Unexpected lipo output.");
7235 CmdArgs.push_back("-o");
7236 CmdArgs.push_back(Output.getFilename());
7237
Daniel Dunbarb440f562010-08-02 02:38:21 +00007238 assert(Input.isFilename() && "Invalid input.");
7239 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007240
7241 // asm_final spec is empty.
7242
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007243 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007244 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007245}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007246
Tim Northover157d9112014-01-16 08:48:16 +00007247void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007248
Tim Northover157d9112014-01-16 08:48:16 +00007249void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7250 ArgStringList &CmdArgs) const {
7251 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007252
Daniel Dunbarc1964212009-03-26 16:23:12 +00007253 // Derived from darwin_arch spec.
7254 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007255 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007256
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007257 // FIXME: Is this needed anymore?
7258 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007259 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007260}
7261
Douglas Katzman95354292015-06-23 20:42:09 +00007262bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007263 // We only need to generate a temp path for LTO if we aren't compiling object
7264 // files. When compiling source files, we run 'dsymutil' after linking. We
7265 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007266 for (const auto &Input : Inputs)
7267 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007268 return true;
7269
7270 return false;
7271}
7272
Douglas Katzman95354292015-06-23 20:42:09 +00007273void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7274 ArgStringList &CmdArgs,
7275 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007276 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007277 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007278
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007279 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007280 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007281 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007282 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007283 }
7284
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007285 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007286 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007287 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7288 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007289
Bob Wilson3d27dad2013-08-02 22:25:34 +00007290 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7291 CmdArgs.push_back("-export_dynamic");
7292
Bob Wilsonb111ec92015-03-02 19:01:14 +00007293 // If we are using App Extension restrictions, pass a flag to the linker
7294 // telling it that the compiled code has been audited.
7295 if (Args.hasFlag(options::OPT_fapplication_extension,
7296 options::OPT_fno_application_extension, false))
7297 CmdArgs.push_back("-application_extension");
7298
Teresa Johnson945bc502015-10-15 20:35:53 +00007299 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007300 // If we are using LTO, then automatically create a temporary file path for
7301 // the linker to use, so that it's lifetime will extend past a possible
7302 // dsymutil step.
7303 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7304 const char *TmpPath = C.getArgs().MakeArgString(
7305 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7306 C.addTempFile(TmpPath);
7307 CmdArgs.push_back("-object_path_lto");
7308 CmdArgs.push_back(TmpPath);
7309 }
7310
7311 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7312 // it in clang installed libraries. If not found, the option is not used
7313 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7314 if (Version[0] >= 133) {
7315 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7316 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7317 SmallString<128> LibLTOPath(P);
7318 llvm::sys::path::append(LibLTOPath, "lib");
7319 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7320 if (llvm::sys::fs::exists(LibLTOPath)) {
7321 CmdArgs.push_back("-lto_library");
7322 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7323 } else {
7324 D.Diag(diag::warn_drv_lto_libpath);
7325 }
7326 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007327 }
7328
Daniel Dunbarc1964212009-03-26 16:23:12 +00007329 // Derived from the "link" spec.
7330 Args.AddAllArgs(CmdArgs, options::OPT_static);
7331 if (!Args.hasArg(options::OPT_static))
7332 CmdArgs.push_back("-dynamic");
7333 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7334 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7335 // here. How do we wish to handle such things?
7336 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007337
Daniel Dunbarc1964212009-03-26 16:23:12 +00007338 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007339 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007340 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007341 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007342
7343 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7344 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7345 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7346
7347 Arg *A;
7348 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7349 (A = Args.getLastArg(options::OPT_current__version)) ||
7350 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007351 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7352 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007353
7354 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7355 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7356 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7357 } else {
7358 CmdArgs.push_back("-dylib");
7359
7360 Arg *A;
7361 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7362 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7363 (A = Args.getLastArg(options::OPT_client__name)) ||
7364 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7365 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7366 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007367 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7368 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007369
Daniel Dunbarc1964212009-03-26 16:23:12 +00007370 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7371 "-dylib_compatibility_version");
7372 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7373 "-dylib_current_version");
7374
Tim Northover157d9112014-01-16 08:48:16 +00007375 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007376
7377 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7378 "-dylib_install_name");
7379 }
7380
7381 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7382 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7383 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007384 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007385 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007386 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7387 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7388 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7389 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7390 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7391 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007392 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007393 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7394 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7395 Args.AddAllArgs(CmdArgs, options::OPT_init);
7396
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007397 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007398 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007399
Daniel Dunbarc1964212009-03-26 16:23:12 +00007400 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7401 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7402 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7403 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7404 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007406 if (const Arg *A =
7407 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7408 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007409 if (A->getOption().matches(options::OPT_fpie) ||
7410 A->getOption().matches(options::OPT_fPIE))
7411 CmdArgs.push_back("-pie");
7412 else
7413 CmdArgs.push_back("-no_pie");
7414 }
Steven Wu574b0f22016-03-01 01:07:58 +00007415 // for embed-bitcode, use -bitcode_bundle in linker command
7416 if (C.getDriver().embedBitcodeEnabled() ||
7417 C.getDriver().embedBitcodeMarkerOnly()) {
7418 // Check if the toolchain supports bitcode build flow.
7419 if (MachOTC.SupportsEmbeddedBitcode())
7420 CmdArgs.push_back("-bitcode_bundle");
7421 else
7422 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7423 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007424
7425 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7426 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7427 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7428 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7429 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7430 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7431 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7432 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7433 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7434 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7435 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7436 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7437 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7438 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7439 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7440 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007441
Daniel Dunbar84384642011-05-02 21:03:47 +00007442 // Give --sysroot= preference, over the Apple specific behavior to also use
7443 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007444 StringRef sysroot = C.getSysRoot();
7445 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007446 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007447 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007448 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7449 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007450 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007451 }
7452
Daniel Dunbarc1964212009-03-26 16:23:12 +00007453 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7454 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7455 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7456 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7457 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007458 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007459 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7460 Args.AddAllArgs(CmdArgs, options::OPT_y);
7461 Args.AddLastArg(CmdArgs, options::OPT_w);
7462 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7463 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7464 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7465 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7466 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7467 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7468 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7469 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7470 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7471 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7472 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7473 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7474}
7475
Douglas Katzman95354292015-06-23 20:42:09 +00007476void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7477 const InputInfo &Output,
7478 const InputInfoList &Inputs,
7479 const ArgList &Args,
7480 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007481 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007482
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007483 // If the number of arguments surpasses the system limits, we will encode the
7484 // input files in a separate file, shortening the command line. To this end,
7485 // build a list of input file names that can be passed via a file with the
7486 // -filelist linker option.
7487 llvm::opt::ArgStringList InputFileList;
7488
Daniel Dunbarc1964212009-03-26 16:23:12 +00007489 // The logic here is derived from gcc's behavior; most of which
7490 // comes from specs (starting with link_command). Consult gcc for
7491 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007492 ArgStringList CmdArgs;
7493
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007494 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7495 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7496 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007497 for (const auto &Arg : Args)
7498 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007499 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007500 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007501 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007502 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007503 return;
7504 }
7505
Daniel Dunbarc1964212009-03-26 16:23:12 +00007506 // I'm not sure why this particular decomposition exists in gcc, but
7507 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007508 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007509
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007510 // It seems that the 'e' option is completely ignored for dynamic executables
7511 // (the default), and with static executables, the last one wins, as expected.
7512 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7513 options::OPT_Z_Flag, options::OPT_u_Group,
7514 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007515
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007516 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7517 // members of static archive libraries which implement Objective-C classes or
7518 // categories.
7519 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7520 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007521
Daniel Dunbarc1964212009-03-26 16:23:12 +00007522 CmdArgs.push_back("-o");
7523 CmdArgs.push_back(Output.getFilename());
7524
Douglas Katzman78b37b02015-11-17 20:28:07 +00007525 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007526 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007527
Peter Collingbournec4122c12015-06-15 21:08:13 +00007528 // SafeStack requires its own runtime libraries
7529 // These libraries should be linked first, to make sure the
7530 // __safestack_init constructor executes before everything else
7531 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7532 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7533 "libclang_rt.safestack_osx.a",
7534 /*AlwaysLink=*/true);
7535 }
7536
Daniel Dunbarc1964212009-03-26 16:23:12 +00007537 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007538
Douglas Gregor9295df02012-05-15 21:00:27 +00007539 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007540 // Build the input file for -filelist (list of linker input files) in case we
7541 // need it later
7542 for (const auto &II : Inputs) {
7543 if (!II.isFilename()) {
7544 // This is a linker input argument.
7545 // We cannot mix input arguments and file names in a -filelist input, thus
7546 // we prematurely stop our list (remaining files shall be passed as
7547 // arguments).
7548 if (InputFileList.size() > 0)
7549 break;
7550
7551 continue;
7552 }
7553
7554 InputFileList.push_back(II.getFilename());
7555 }
7556
Douglas Katzman78b37b02015-11-17 20:28:07 +00007557 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007558 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7559
Douglas Katzman78b37b02015-11-17 20:28:07 +00007560 if (isObjCRuntimeLinked(Args) &&
7561 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007562 // We use arclite library for both ARC and subscripting support.
7563 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7564
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007565 CmdArgs.push_back("-framework");
7566 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007567 // Link libobj.
7568 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007569 }
John McCall31168b02011-06-15 23:02:42 +00007570
Daniel Dunbarc1964212009-03-26 16:23:12 +00007571 if (LinkingOutput) {
7572 CmdArgs.push_back("-arch_multiple");
7573 CmdArgs.push_back("-final_output");
7574 CmdArgs.push_back(LinkingOutput);
7575 }
7576
Daniel Dunbarc1964212009-03-26 16:23:12 +00007577 if (Args.hasArg(options::OPT_fnested_functions))
7578 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007579
Justin Bognerc7701242015-05-12 05:44:36 +00007580 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7581
Douglas Katzman78b37b02015-11-17 20:28:07 +00007582 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007583 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007584 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007585
Daniel Dunbarc1964212009-03-26 16:23:12 +00007586 // link_ssp spec is empty.
7587
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007588 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007589 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007590 }
7591
Douglas Katzman78b37b02015-11-17 20:28:07 +00007592 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007593 // endfile_spec is empty.
7594 }
7595
7596 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7597 Args.AddAllArgs(CmdArgs, options::OPT_F);
7598
Steven Wu3ffb61b2015-02-06 18:08:29 +00007599 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007600 for (const Arg *A : Args.filtered(options::OPT_iframework))
7601 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007602
Douglas Katzman78b37b02015-11-17 20:28:07 +00007603 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007604 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7605 if (A->getValue() == StringRef("Accelerate")) {
7606 CmdArgs.push_back("-framework");
7607 CmdArgs.push_back("Accelerate");
7608 }
7609 }
7610 }
7611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007612 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007613 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007614 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007615 Cmd->setInputFileList(std::move(InputFileList));
7616 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007617}
7618
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007619void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007620 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007621 const InputInfoList &Inputs,
7622 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007623 const char *LinkingOutput) const {
7624 ArgStringList CmdArgs;
7625
7626 CmdArgs.push_back("-create");
7627 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007628
7629 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007630 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007631
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007632 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007633 assert(II.isFilename() && "Unexpected lipo input.");
7634 CmdArgs.push_back(II.getFilename());
7635 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007636
7637 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007638 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007639}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007640
Daniel Dunbar88299622010-06-04 18:28:36 +00007641void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007642 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007643 const InputInfoList &Inputs,
7644 const ArgList &Args,
7645 const char *LinkingOutput) const {
7646 ArgStringList CmdArgs;
7647
Daniel Dunbareb86b042011-05-09 17:23:16 +00007648 CmdArgs.push_back("-o");
7649 CmdArgs.push_back(Output.getFilename());
7650
Daniel Dunbar88299622010-06-04 18:28:36 +00007651 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7652 const InputInfo &Input = Inputs[0];
7653 assert(Input.isFilename() && "Unexpected dsymutil input.");
7654 CmdArgs.push_back(Input.getFilename());
7655
Daniel Dunbar88299622010-06-04 18:28:36 +00007656 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007657 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007658 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007659}
7660
Eric Christopher551ef452011-08-23 17:56:55 +00007661void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007662 const InputInfo &Output,
7663 const InputInfoList &Inputs,
7664 const ArgList &Args,
7665 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007666 ArgStringList CmdArgs;
7667 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007668 CmdArgs.push_back("--debug-info");
7669 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007670 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007671
7672 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7673 const InputInfo &Input = Inputs[0];
7674 assert(Input.isFilename() && "Unexpected verify input");
7675
7676 // Grabbing the output of the earlier dsymutil run.
7677 CmdArgs.push_back(Input.getFilename());
7678
7679 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007680 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007681 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007682}
7683
Douglas Katzman95354292015-06-23 20:42:09 +00007684void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007685 const InputInfo &Output,
7686 const InputInfoList &Inputs,
7687 const ArgList &Args,
7688 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007689 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007690 ArgStringList CmdArgs;
7691
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007692 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007693
7694 CmdArgs.push_back("-o");
7695 CmdArgs.push_back(Output.getFilename());
7696
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007697 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007698 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007699
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007700 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007701 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007702}
7703
Douglas Katzman95354292015-06-23 20:42:09 +00007704void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7705 const InputInfo &Output,
7706 const InputInfoList &Inputs,
7707 const ArgList &Args,
7708 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007709 ArgStringList CmdArgs;
7710
David Chisnall272a0712012-02-29 15:06:12 +00007711 // Demangle C++ names in errors
7712 CmdArgs.push_back("-C");
7713
Douglas Katzman78b37b02015-11-17 20:28:07 +00007714 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007715 CmdArgs.push_back("-e");
7716 CmdArgs.push_back("_start");
7717 }
7718
7719 if (Args.hasArg(options::OPT_static)) {
7720 CmdArgs.push_back("-Bstatic");
7721 CmdArgs.push_back("-dn");
7722 } else {
7723 CmdArgs.push_back("-Bdynamic");
7724 if (Args.hasArg(options::OPT_shared)) {
7725 CmdArgs.push_back("-shared");
7726 } else {
7727 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007728 CmdArgs.push_back(
7729 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007730 }
7731 }
7732
7733 if (Output.isFilename()) {
7734 CmdArgs.push_back("-o");
7735 CmdArgs.push_back(Output.getFilename());
7736 } else {
7737 assert(Output.isNothing() && "Invalid output.");
7738 }
7739
Douglas Katzman78b37b02015-11-17 20:28:07 +00007740 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007741 if (!Args.hasArg(options::OPT_shared))
7742 CmdArgs.push_back(
7743 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7744
7745 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7746 CmdArgs.push_back(
7747 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7748 CmdArgs.push_back(
7749 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007750 }
7751
Douglas Katzman6059ef92015-11-17 17:41:23 +00007752 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007753
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007754 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7755 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007756
7757 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7758
Douglas Katzman78b37b02015-11-17 20:28:07 +00007759 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007760 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007761 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007762 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007763 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007764 if (!Args.hasArg(options::OPT_shared)) {
7765 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007766 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007767 }
David Chisnallf571cde2012-02-15 13:39:01 +00007768 }
7769
Douglas Katzman78b37b02015-11-17 20:28:07 +00007770 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007771 CmdArgs.push_back(
7772 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007773 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007774 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007775
Xinliang David Li69306c02015-10-22 06:15:31 +00007776 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007777
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007778 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007779 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007780}
7781
Douglas Katzman95354292015-06-23 20:42:09 +00007782void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7783 const InputInfo &Output,
7784 const InputInfoList &Inputs,
7785 const ArgList &Args,
7786 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007787 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007788 ArgStringList CmdArgs;
7789
Rafael Espindolacc126272014-02-28 01:55:21 +00007790 switch (getToolChain().getArch()) {
7791 case llvm::Triple::x86:
7792 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7793 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007794 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007795 break;
7796
7797 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007798 CmdArgs.push_back("-mppc");
7799 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007800 break;
7801
7802 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007803 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007804 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007805 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7806 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7807 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007808 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007809 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007810
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007811 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007812 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007813 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7814 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7815 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007816 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007817 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007818
7819 case llvm::Triple::mips64:
7820 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007821 StringRef CPUName;
7822 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007823 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007824
7825 CmdArgs.push_back("-mabi");
7826 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7827
7828 if (getToolChain().getArch() == llvm::Triple::mips64)
7829 CmdArgs.push_back("-EB");
7830 else
7831 CmdArgs.push_back("-EL");
7832
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007833 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007834 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007835 }
7836
Rafael Espindolacc126272014-02-28 01:55:21 +00007837 default:
7838 break;
7839 }
7840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007841 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007842
7843 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007844 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007845
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007846 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007847 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007849 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007850 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007851}
7852
Douglas Katzman95354292015-06-23 20:42:09 +00007853void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7854 const InputInfo &Output,
7855 const InputInfoList &Inputs,
7856 const ArgList &Args,
7857 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007858 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007859 ArgStringList CmdArgs;
7860
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007861 // Silence warning for "clang -g foo.o -o foo"
7862 Args.ClaimAllArgs(options::OPT_g_Group);
7863 // and "clang -emit-llvm foo.o -o foo"
7864 Args.ClaimAllArgs(options::OPT_emit_llvm);
7865 // and for "clang -w foo.o -o foo". Other warning options are already
7866 // handled somewhere else.
7867 Args.ClaimAllArgs(options::OPT_w);
7868
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007869 if (getToolChain().getArch() == llvm::Triple::mips64)
7870 CmdArgs.push_back("-EB");
7871 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7872 CmdArgs.push_back("-EL");
7873
Douglas Katzman78b37b02015-11-17 20:28:07 +00007874 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007875 CmdArgs.push_back("-e");
7876 CmdArgs.push_back("__start");
7877 }
7878
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007879 if (Args.hasArg(options::OPT_static)) {
7880 CmdArgs.push_back("-Bstatic");
7881 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007882 if (Args.hasArg(options::OPT_rdynamic))
7883 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007884 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007885 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007886 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007887 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007888 } else {
7889 CmdArgs.push_back("-dynamic-linker");
7890 CmdArgs.push_back("/usr/libexec/ld.so");
7891 }
7892 }
7893
Rafael Espindola044f7832013-06-05 04:28:55 +00007894 if (Args.hasArg(options::OPT_nopie))
7895 CmdArgs.push_back("-nopie");
7896
Daniel Dunbarb440f562010-08-02 02:38:21 +00007897 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007898 CmdArgs.push_back("-o");
7899 CmdArgs.push_back(Output.getFilename());
7900 } else {
7901 assert(Output.isNothing() && "Invalid output.");
7902 }
7903
Douglas Katzman78b37b02015-11-17 20:28:07 +00007904 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007905 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007906 if (Args.hasArg(options::OPT_pg))
7907 CmdArgs.push_back(
7908 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007909 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007910 CmdArgs.push_back(
7911 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7912 CmdArgs.push_back(
7913 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007914 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007915 CmdArgs.push_back(
7916 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007917 }
7918 }
7919
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007920 std::string Triple = getToolChain().getTripleString();
7921 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007922 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007923 CmdArgs.push_back(
7924 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007925
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007926 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7927 options::OPT_e, options::OPT_s, options::OPT_t,
7928 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007929
Daniel Dunbar54423b22010-09-17 00:24:54 +00007930 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007931
Douglas Katzman78b37b02015-11-17 20:28:07 +00007932 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007933 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007934 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007935 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007936 CmdArgs.push_back("-lm_p");
7937 else
7938 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007939 }
7940
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007941 // FIXME: For some reason GCC passes -lgcc before adding
7942 // the default system libraries. Just mimic this for now.
7943 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007944
Eric Christopher17674ec2012-09-13 06:32:34 +00007945 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007946 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7947 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007948 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007949 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007950 }
7951
Chandler Carruth45661652011-12-17 22:32:42 +00007952 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007953 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007954 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007955 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007956 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007957 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007958
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007959 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007960 }
7961
Douglas Katzman78b37b02015-11-17 20:28:07 +00007962 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007963 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007964 CmdArgs.push_back(
7965 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007966 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007967 CmdArgs.push_back(
7968 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007969 }
7970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007971 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007972 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007973}
Ed Schoutene33194b2009-04-02 19:13:12 +00007974
Douglas Katzman95354292015-06-23 20:42:09 +00007975void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7976 const InputInfo &Output,
7977 const InputInfoList &Inputs,
7978 const ArgList &Args,
7979 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007980 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007981 ArgStringList CmdArgs;
7982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007983 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007984
7985 CmdArgs.push_back("-o");
7986 CmdArgs.push_back(Output.getFilename());
7987
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007988 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007989 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007990
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007991 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007992 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007993}
7994
Douglas Katzman95354292015-06-23 20:42:09 +00007995void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7996 const InputInfo &Output,
7997 const InputInfoList &Inputs,
7998 const ArgList &Args,
7999 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008000 const Driver &D = getToolChain().getDriver();
8001 ArgStringList CmdArgs;
8002
Douglas Katzman78b37b02015-11-17 20:28:07 +00008003 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008004 CmdArgs.push_back("-e");
8005 CmdArgs.push_back("__start");
8006 }
8007
8008 if (Args.hasArg(options::OPT_static)) {
8009 CmdArgs.push_back("-Bstatic");
8010 } else {
8011 if (Args.hasArg(options::OPT_rdynamic))
8012 CmdArgs.push_back("-export-dynamic");
8013 CmdArgs.push_back("--eh-frame-hdr");
8014 CmdArgs.push_back("-Bdynamic");
8015 if (Args.hasArg(options::OPT_shared)) {
8016 CmdArgs.push_back("-shared");
8017 } else {
8018 CmdArgs.push_back("-dynamic-linker");
8019 CmdArgs.push_back("/usr/libexec/ld.so");
8020 }
8021 }
8022
8023 if (Output.isFilename()) {
8024 CmdArgs.push_back("-o");
8025 CmdArgs.push_back(Output.getFilename());
8026 } else {
8027 assert(Output.isNothing() && "Invalid output.");
8028 }
8029
Douglas Katzman78b37b02015-11-17 20:28:07 +00008030 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008031 if (!Args.hasArg(options::OPT_shared)) {
8032 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008033 CmdArgs.push_back(
8034 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008035 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008036 CmdArgs.push_back(
8037 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8038 CmdArgs.push_back(
8039 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008040 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008041 CmdArgs.push_back(
8042 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008043 }
8044 }
8045
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008046 Args.AddAllArgs(CmdArgs,
8047 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008048
8049 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8050
Douglas Katzman78b37b02015-11-17 20:28:07 +00008051 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008052 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008053 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8054 if (Args.hasArg(options::OPT_pg))
8055 CmdArgs.push_back("-lm_p");
8056 else
8057 CmdArgs.push_back("-lm");
8058 }
8059
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008060 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008061 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008062 CmdArgs.push_back("-lpthread_p");
8063 else
8064 CmdArgs.push_back("-lpthread");
8065 }
8066
Eli Friedman9fa28852012-08-08 23:57:20 +00008067 if (!Args.hasArg(options::OPT_shared)) {
8068 if (Args.hasArg(options::OPT_pg))
8069 CmdArgs.push_back("-lc_p");
8070 else
8071 CmdArgs.push_back("-lc");
8072 }
8073
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008074 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008075 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008076 case llvm::Triple::arm:
8077 MyArch = "arm";
8078 break;
8079 case llvm::Triple::x86:
8080 MyArch = "i386";
8081 break;
8082 case llvm::Triple::x86_64:
8083 MyArch = "amd64";
8084 break;
8085 default:
8086 llvm_unreachable("Unsupported architecture");
8087 }
8088 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008089 }
8090
Douglas Katzman78b37b02015-11-17 20:28:07 +00008091 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008092 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008093 CmdArgs.push_back(
8094 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008095 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008096 CmdArgs.push_back(
8097 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008098 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008099
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008100 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008101 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008102}
8103
Douglas Katzman95354292015-06-23 20:42:09 +00008104void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8105 const InputInfo &Output,
8106 const InputInfoList &Inputs,
8107 const ArgList &Args,
8108 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008109 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008110 ArgStringList CmdArgs;
8111
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008112 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8113 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008114 switch (getToolChain().getArch()) {
8115 default:
8116 break;
8117 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008118 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008119 break;
8120 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008121 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008122 break;
8123 case llvm::Triple::mips:
8124 case llvm::Triple::mipsel:
8125 case llvm::Triple::mips64:
8126 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008127 StringRef CPUName;
8128 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008129 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008130
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008131 CmdArgs.push_back("-march");
8132 CmdArgs.push_back(CPUName.data());
8133
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008134 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008135 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008136
8137 if (getToolChain().getArch() == llvm::Triple::mips ||
8138 getToolChain().getArch() == llvm::Triple::mips64)
8139 CmdArgs.push_back("-EB");
8140 else
8141 CmdArgs.push_back("-EL");
8142
Dimitry Andric46f338c2015-12-27 10:36:44 +00008143 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8144 StringRef v = A->getValue();
8145 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8146 A->claim();
8147 }
8148
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008149 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008150 break;
8151 }
8152 case llvm::Triple::arm:
8153 case llvm::Triple::armeb:
8154 case llvm::Triple::thumb:
8155 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008156 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008157
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008158 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008159 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008160 else
Renato Golinf4421f72014-02-19 10:44:07 +00008161 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008162
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008163 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008164 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008165 case llvm::Triple::GNUEABI:
8166 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008167 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008168 break;
8169
8170 default:
8171 CmdArgs.push_back("-matpcs");
8172 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008173 break;
8174 }
8175 case llvm::Triple::sparc:
8176 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008177 case llvm::Triple::sparcv9: {
8178 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8179 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008180 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008181 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008182 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008183 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008185 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008186
8187 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008188 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008189
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008190 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008191 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008192
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008193 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008194 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008195}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008196
Douglas Katzman95354292015-06-23 20:42:09 +00008197void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8198 const InputInfo &Output,
8199 const InputInfoList &Inputs,
8200 const ArgList &Args,
8201 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008202 const toolchains::FreeBSD &ToolChain =
8203 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008204 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008205 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008206 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008207 !Args.hasArg(options::OPT_shared) &&
8208 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008209 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008210
8211 // Silence warning for "clang -g foo.o -o foo"
8212 Args.ClaimAllArgs(options::OPT_g_Group);
8213 // and "clang -emit-llvm foo.o -o foo"
8214 Args.ClaimAllArgs(options::OPT_emit_llvm);
8215 // and for "clang -w foo.o -o foo". Other warning options are already
8216 // handled somewhere else.
8217 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008218
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008219 if (!D.SysRoot.empty())
8220 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8221
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008222 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008223 CmdArgs.push_back("-pie");
8224
Ed Maste1bc232d2016-04-12 21:11:46 +00008225 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008226 if (Args.hasArg(options::OPT_static)) {
8227 CmdArgs.push_back("-Bstatic");
8228 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008229 if (Args.hasArg(options::OPT_rdynamic))
8230 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008231 if (Args.hasArg(options::OPT_shared)) {
8232 CmdArgs.push_back("-Bshareable");
8233 } else {
8234 CmdArgs.push_back("-dynamic-linker");
8235 CmdArgs.push_back("/libexec/ld-elf.so.1");
8236 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008237 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008238 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8239 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8240 CmdArgs.push_back("--hash-style=both");
8241 }
8242 }
8243 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244 }
8245
8246 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8247 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008248 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008249 CmdArgs.push_back("-m");
8250 CmdArgs.push_back("elf_i386_fbsd");
8251 }
8252
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008253 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008254 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008255 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008256 }
8257
Dimitry Andric904895f2015-12-27 06:47:09 +00008258 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8259 if (ToolChain.getArch() == llvm::Triple::mips ||
8260 ToolChain.getArch() == llvm::Triple::mipsel ||
8261 ToolChain.getArch() == llvm::Triple::mips64 ||
8262 ToolChain.getArch() == llvm::Triple::mips64el) {
8263 StringRef v = A->getValue();
8264 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8265 A->claim();
8266 }
8267 }
8268
Daniel Dunbarb440f562010-08-02 02:38:21 +00008269 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008270 CmdArgs.push_back("-o");
8271 CmdArgs.push_back(Output.getFilename());
8272 } else {
8273 assert(Output.isNothing() && "Invalid output.");
8274 }
8275
Douglas Katzman78b37b02015-11-17 20:28:07 +00008276 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008277 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008278 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008279 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008280 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008281 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008282 crt1 = "Scrt1.o";
8283 else
8284 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008285 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008286 if (crt1)
8287 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8288
8289 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8290
Craig Topper92fc2df2014-05-17 16:56:41 +00008291 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008292 if (Args.hasArg(options::OPT_static))
8293 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008294 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008295 crtbegin = "crtbeginS.o";
8296 else
8297 crtbegin = "crtbegin.o";
8298
8299 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008300 }
8301
8302 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008303 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008304 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8305 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008306 Args.AddAllArgs(CmdArgs, options::OPT_s);
8307 Args.AddAllArgs(CmdArgs, options::OPT_t);
8308 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8309 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008310
Teresa Johnson945bc502015-10-15 20:35:53 +00008311 if (D.isUsingLTO())
8312 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008313
Alexey Samsonov52550342014-09-15 19:58:40 +00008314 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008315 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008316
Douglas Katzman78b37b02015-11-17 20:28:07 +00008317 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008318 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008319 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008320 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008321 if (Args.hasArg(options::OPT_pg))
8322 CmdArgs.push_back("-lm_p");
8323 else
8324 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008325 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008326 if (NeedsSanitizerDeps)
8327 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008328 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8329 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008330 if (Args.hasArg(options::OPT_pg))
8331 CmdArgs.push_back("-lgcc_p");
8332 else
8333 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008334 if (Args.hasArg(options::OPT_static)) {
8335 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008336 } else if (Args.hasArg(options::OPT_pg)) {
8337 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008338 } else {
8339 CmdArgs.push_back("--as-needed");
8340 CmdArgs.push_back("-lgcc_s");
8341 CmdArgs.push_back("--no-as-needed");
8342 }
8343
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008344 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008345 if (Args.hasArg(options::OPT_pg))
8346 CmdArgs.push_back("-lpthread_p");
8347 else
8348 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008349 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008350
Roman Divacky66f22762011-02-10 16:59:40 +00008351 if (Args.hasArg(options::OPT_pg)) {
8352 if (Args.hasArg(options::OPT_shared))
8353 CmdArgs.push_back("-lc");
8354 else
8355 CmdArgs.push_back("-lc_p");
8356 CmdArgs.push_back("-lgcc_p");
8357 } else {
8358 CmdArgs.push_back("-lc");
8359 CmdArgs.push_back("-lgcc");
8360 }
8361
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008362 if (Args.hasArg(options::OPT_static)) {
8363 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008364 } else if (Args.hasArg(options::OPT_pg)) {
8365 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008366 } else {
8367 CmdArgs.push_back("--as-needed");
8368 CmdArgs.push_back("-lgcc_s");
8369 CmdArgs.push_back("--no-as-needed");
8370 }
8371 }
8372
Douglas Katzman78b37b02015-11-17 20:28:07 +00008373 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008374 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008375 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008376 else
8377 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008378 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008379 }
8380
Xinliang David Li69306c02015-10-22 06:15:31 +00008381 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008382
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008383 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008384 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008385}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008386
Douglas Katzman95354292015-06-23 20:42:09 +00008387void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008388 const InputInfo &Output,
8389 const InputInfoList &Inputs,
8390 const ArgList &Args,
8391 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008392 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008393 ArgStringList CmdArgs;
8394
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008395 // GNU as needs different flags for creating the correct output format
8396 // on architectures with different ABIs or optional feature sets.
8397 switch (getToolChain().getArch()) {
8398 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008400 break;
8401 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008402 case llvm::Triple::armeb:
8403 case llvm::Triple::thumb:
8404 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008405 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008406 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8407 std::string Arch =
8408 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008409 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008410 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008411 }
8412
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008413 case llvm::Triple::mips:
8414 case llvm::Triple::mipsel:
8415 case llvm::Triple::mips64:
8416 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008417 StringRef CPUName;
8418 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008419 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008420
8421 CmdArgs.push_back("-march");
8422 CmdArgs.push_back(CPUName.data());
8423
8424 CmdArgs.push_back("-mabi");
8425 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8426
8427 if (getToolChain().getArch() == llvm::Triple::mips ||
8428 getToolChain().getArch() == llvm::Triple::mips64)
8429 CmdArgs.push_back("-EB");
8430 else
8431 CmdArgs.push_back("-EL");
8432
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008433 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008434 break;
8435 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008436
8437 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008438 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008439 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008440 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8441 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008442 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008443 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008444 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008445
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008446 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008447 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008448 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8449 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008450 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008451 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008452 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008453
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008454 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008455 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008456 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008457
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008458 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008459
8460 CmdArgs.push_back("-o");
8461 CmdArgs.push_back(Output.getFilename());
8462
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008463 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008464 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008465
David Chisnallddbd68f2011-09-27 22:03:18 +00008466 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008467 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008468}
8469
Douglas Katzman95354292015-06-23 20:42:09 +00008470void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8471 const InputInfo &Output,
8472 const InputInfoList &Inputs,
8473 const ArgList &Args,
8474 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008475 const Driver &D = getToolChain().getDriver();
8476 ArgStringList CmdArgs;
8477
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008478 if (!D.SysRoot.empty())
8479 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8480
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008481 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008482 if (Args.hasArg(options::OPT_static)) {
8483 CmdArgs.push_back("-Bstatic");
8484 } else {
8485 if (Args.hasArg(options::OPT_rdynamic))
8486 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008487 if (Args.hasArg(options::OPT_shared)) {
8488 CmdArgs.push_back("-Bshareable");
8489 } else {
8490 CmdArgs.push_back("-dynamic-linker");
8491 CmdArgs.push_back("/libexec/ld.elf_so");
8492 }
8493 }
8494
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008495 // Many NetBSD architectures support more than one ABI.
8496 // Determine the correct emulation for ld.
8497 switch (getToolChain().getArch()) {
8498 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008499 CmdArgs.push_back("-m");
8500 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008501 break;
8502 case llvm::Triple::arm:
8503 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008504 CmdArgs.push_back("-m");
8505 switch (getToolChain().getTriple().getEnvironment()) {
8506 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008507 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008508 CmdArgs.push_back("armelf_nbsd_eabi");
8509 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008510 case llvm::Triple::EABIHF:
8511 case llvm::Triple::GNUEABIHF:
8512 CmdArgs.push_back("armelf_nbsd_eabihf");
8513 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008514 default:
8515 CmdArgs.push_back("armelf_nbsd");
8516 break;
8517 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008518 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008519 case llvm::Triple::armeb:
8520 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008521 arm::appendEBLinkFlags(
8522 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008523 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008524 CmdArgs.push_back("-m");
8525 switch (getToolChain().getTriple().getEnvironment()) {
8526 case llvm::Triple::EABI:
8527 case llvm::Triple::GNUEABI:
8528 CmdArgs.push_back("armelfb_nbsd_eabi");
8529 break;
8530 case llvm::Triple::EABIHF:
8531 case llvm::Triple::GNUEABIHF:
8532 CmdArgs.push_back("armelfb_nbsd_eabihf");
8533 break;
8534 default:
8535 CmdArgs.push_back("armelfb_nbsd");
8536 break;
8537 }
8538 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008539 case llvm::Triple::mips64:
8540 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008541 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008542 CmdArgs.push_back("-m");
8543 if (getToolChain().getArch() == llvm::Triple::mips64)
8544 CmdArgs.push_back("elf32btsmip");
8545 else
8546 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008547 } else if (mips::hasMipsAbiArg(Args, "64")) {
8548 CmdArgs.push_back("-m");
8549 if (getToolChain().getArch() == llvm::Triple::mips64)
8550 CmdArgs.push_back("elf64btsmip");
8551 else
8552 CmdArgs.push_back("elf64ltsmip");
8553 }
8554 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008555 case llvm::Triple::ppc:
8556 CmdArgs.push_back("-m");
8557 CmdArgs.push_back("elf32ppc_nbsd");
8558 break;
8559
8560 case llvm::Triple::ppc64:
8561 case llvm::Triple::ppc64le:
8562 CmdArgs.push_back("-m");
8563 CmdArgs.push_back("elf64ppc");
8564 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008565
8566 case llvm::Triple::sparc:
8567 CmdArgs.push_back("-m");
8568 CmdArgs.push_back("elf32_sparc");
8569 break;
8570
8571 case llvm::Triple::sparcv9:
8572 CmdArgs.push_back("-m");
8573 CmdArgs.push_back("elf64_sparc");
8574 break;
8575
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008576 default:
8577 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008578 }
8579
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008580 if (Output.isFilename()) {
8581 CmdArgs.push_back("-o");
8582 CmdArgs.push_back(Output.getFilename());
8583 } else {
8584 assert(Output.isNothing() && "Invalid output.");
8585 }
8586
Douglas Katzman78b37b02015-11-17 20:28:07 +00008587 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008588 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008589 CmdArgs.push_back(
8590 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8591 CmdArgs.push_back(
8592 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8593 CmdArgs.push_back(
8594 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008595 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008596 CmdArgs.push_back(
8597 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8598 CmdArgs.push_back(
8599 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008600 }
8601 }
8602
8603 Args.AddAllArgs(CmdArgs, options::OPT_L);
8604 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8605 Args.AddAllArgs(CmdArgs, options::OPT_e);
8606 Args.AddAllArgs(CmdArgs, options::OPT_s);
8607 Args.AddAllArgs(CmdArgs, options::OPT_t);
8608 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8609 Args.AddAllArgs(CmdArgs, options::OPT_r);
8610
8611 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8612
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008613 unsigned Major, Minor, Micro;
8614 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8615 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008616 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008617 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008618 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008619 case llvm::Triple::arm:
8620 case llvm::Triple::armeb:
8621 case llvm::Triple::thumb:
8622 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008623 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008624 case llvm::Triple::ppc64:
8625 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008626 case llvm::Triple::sparc:
8627 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008628 case llvm::Triple::x86:
8629 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008630 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008631 break;
8632 default:
8633 break;
8634 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008635 }
8636
Douglas Katzman78b37b02015-11-17 20:28:07 +00008637 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008638 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008639 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008640 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8641 CmdArgs.push_back("-lm");
8642 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008643 if (Args.hasArg(options::OPT_pthread))
8644 CmdArgs.push_back("-lpthread");
8645 CmdArgs.push_back("-lc");
8646
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008647 if (useLibgcc) {
8648 if (Args.hasArg(options::OPT_static)) {
8649 // libgcc_eh depends on libc, so resolve as much as possible,
8650 // pull in any new requirements from libc and then get the rest
8651 // of libgcc.
8652 CmdArgs.push_back("-lgcc_eh");
8653 CmdArgs.push_back("-lc");
8654 CmdArgs.push_back("-lgcc");
8655 } else {
8656 CmdArgs.push_back("-lgcc");
8657 CmdArgs.push_back("--as-needed");
8658 CmdArgs.push_back("-lgcc_s");
8659 CmdArgs.push_back("--no-as-needed");
8660 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008661 }
8662 }
8663
Douglas Katzman78b37b02015-11-17 20:28:07 +00008664 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008665 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008666 CmdArgs.push_back(
8667 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008668 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008669 CmdArgs.push_back(
8670 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8671 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008672 }
8673
Xinliang David Li69306c02015-10-22 06:15:31 +00008674 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008675
Logan Chieneb9162f2014-06-26 14:23:45 +00008676 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008677 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008678}
8679
Douglas Katzman95354292015-06-23 20:42:09 +00008680void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8681 const InputInfo &Output,
8682 const InputInfoList &Inputs,
8683 const ArgList &Args,
8684 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008685 claimNoWarnArgs(Args);
8686
James Y Knight2db38f32015-08-15 03:45:25 +00008687 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8688 llvm::Triple Triple = llvm::Triple(TripleStr);
8689
Rafael Espindola92b00932010-08-10 00:25:48 +00008690 ArgStringList CmdArgs;
8691
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008692 llvm::Reloc::Model RelocationModel;
8693 unsigned PICLevel;
8694 bool IsPIE;
8695 std::tie(RelocationModel, PICLevel, IsPIE) =
8696 ParsePICArgs(getToolChain(), Triple, Args);
8697
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008698 switch (getToolChain().getArch()) {
8699 default:
8700 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008701 // Add --32/--64 to make sure we get the format we want.
8702 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008703 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008704 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008705 break;
8706 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008707 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8708 CmdArgs.push_back("--x32");
8709 else
8710 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008711 break;
8712 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008713 CmdArgs.push_back("-a32");
8714 CmdArgs.push_back("-mppc");
8715 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008716 break;
8717 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008718 CmdArgs.push_back("-a64");
8719 CmdArgs.push_back("-mppc64");
8720 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008721 break;
8722 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008723 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008724 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008725 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008726 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008727 break;
8728 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008729 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008730 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008731 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8732 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8733 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008734 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008735 }
8736 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008737 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008738 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8739 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8740 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008741 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008742 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008743 case llvm::Triple::arm:
8744 case llvm::Triple::armeb:
8745 case llvm::Triple::thumb:
8746 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008747 const llvm::Triple &Triple2 = getToolChain().getTriple();
8748 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008749 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008750 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008751 break;
8752 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008753 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008754 break;
8755 default:
8756 break;
8757 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008758
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008759 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008760 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8761 case arm::FloatABI::Soft:
8762 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8763 break;
8764 case arm::FloatABI::SoftFP:
8765 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8766 break;
8767 case arm::FloatABI::Hard:
8768 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8769 break;
8770 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008771
8772 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008773
8774 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008775 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008776 // march from being picked in the absence of a cpu flag.
8777 Arg *A;
8778 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008779 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008780 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008781 else
8782 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008783 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008784 break;
8785 }
8786 case llvm::Triple::mips:
8787 case llvm::Triple::mipsel:
8788 case llvm::Triple::mips64:
8789 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008790 StringRef CPUName;
8791 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008792 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008793 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008794
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008795 CmdArgs.push_back("-march");
8796 CmdArgs.push_back(CPUName.data());
8797
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008798 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008799 CmdArgs.push_back(ABIName.data());
8800
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008801 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8802 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008803 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008804 CmdArgs.push_back("-mno-shared");
8805
Daniel Sanders379d44b2014-07-16 11:52:23 +00008806 // LLVM doesn't support -mplt yet and acts as if it is always given.
8807 // However, -mplt has no effect with the N64 ABI.
8808 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008809
8810 if (getToolChain().getArch() == llvm::Triple::mips ||
8811 getToolChain().getArch() == llvm::Triple::mips64)
8812 CmdArgs.push_back("-EB");
8813 else
8814 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008815
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008816 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8817 if (StringRef(A->getValue()) == "2008")
8818 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8819 }
8820
Daniel Sanders379d44b2014-07-16 11:52:23 +00008821 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8822 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8823 options::OPT_mfp64)) {
8824 A->claim();
8825 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008826 } else if (mips::shouldUseFPXX(
8827 Args, getToolChain().getTriple(), CPUName, ABIName,
8828 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008829 CmdArgs.push_back("-mfpxx");
8830
8831 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8832 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008833 if (Arg *A =
8834 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008835 if (A->getOption().matches(options::OPT_mips16)) {
8836 A->claim();
8837 A->render(Args, CmdArgs);
8838 } else {
8839 A->claim();
8840 CmdArgs.push_back("-no-mips16");
8841 }
8842 }
8843
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008844 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8845 options::OPT_mno_micromips);
8846 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8847 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8848
Simon Atanasyanbd986632013-11-26 11:58:04 +00008849 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8850 // Do not use AddLastArg because not all versions of MIPS assembler
8851 // support -mmsa / -mno-msa options.
8852 if (A->getOption().matches(options::OPT_mmsa))
8853 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8854 }
8855
Daniel Sanders379d44b2014-07-16 11:52:23 +00008856 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8857 options::OPT_msoft_float);
8858
Toma Tabacub36d6102015-06-11 12:13:18 +00008859 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8860 options::OPT_msingle_float);
8861
Daniel Sanders379d44b2014-07-16 11:52:23 +00008862 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8863 options::OPT_mno_odd_spreg);
8864
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008865 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008866 break;
8867 }
8868 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008869 // Always pass an -march option, since our default of z10 is later
8870 // than the GNU assembler's default.
8871 StringRef CPUName = getSystemZTargetCPU(Args);
8872 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008873 break;
8874 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008875 }
8876
Renato Golina74bbc72015-07-22 15:32:36 +00008877 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008878 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008879
8880 CmdArgs.push_back("-o");
8881 CmdArgs.push_back(Output.getFilename());
8882
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008883 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008884 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008885
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008886 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008887 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008888
8889 // Handle the debug info splitting at object creation time if we're
8890 // creating an object.
8891 // TODO: Currently only works on linux with newer objcopy.
8892 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008893 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008894 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008895 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008896}
8897
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008898static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008899 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008900 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008901 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008902 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8903 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008904 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008905 CmdArgs.push_back("-lgcc");
8906
Logan Chien3d3373c2012-11-19 12:04:11 +00008907 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008908 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008909 CmdArgs.push_back("-lgcc");
8910 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008911 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008912 CmdArgs.push_back("--as-needed");
8913 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008914 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008915 CmdArgs.push_back("--no-as-needed");
8916 }
8917
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008918 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008919 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008920 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008921 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008922
8923 // According to Android ABI, we have to link with libdl if we are
8924 // linking with non-static libgcc.
8925 //
8926 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8927 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8928 if (isAndroid && !StaticLibgcc)
8929 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008930}
8931
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008932static std::string getLinuxDynamicLinker(const ArgList &Args,
8933 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008934 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8935
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008936 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008937 if (ToolChain.getTriple().isArch64Bit())
8938 return "/system/bin/linker64";
8939 else
8940 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008941 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8942 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008943 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008944 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008945 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008946 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008947 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008948 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008949 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008950 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008951 return "/lib/ld-linux-armhf.so.3";
8952 else
8953 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008954 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8955 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008956 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008957 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008958 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008959 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008960 return "/lib/ld-linux.so.3";
8961 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8962 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008963 std::string LibDir =
8964 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008965 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008966 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008967 if (mips::isUCLibc(Args))
8968 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008969 else if (!ToolChain.getTriple().hasEnvironment()) {
8970 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8971 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8972 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8973 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008974 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008975
8976 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008977 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008978 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008979 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008980 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8981 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008982 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008983 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008984 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8985 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008986 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008987 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008988 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008989 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008990 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008991 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008992 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8993 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008994 else
8995 return "/lib64/ld-linux-x86-64.so.2";
8996}
8997
Renato Golinc4b49242014-02-13 10:01:16 +00008998static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008999 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009000 // Make use of compiler-rt if --rtlib option is used
9001 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9002
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009003 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009004 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009005 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009006 default:
9007 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009008 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009009 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009010 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009011 break;
9012 }
Renato Golinc4b49242014-02-13 10:01:16 +00009013 break;
9014 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009015 // Make sure libgcc is not used under MSVC environment by default
9016 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9017 // Issue error diagnostic if libgcc is explicitly specified
9018 // through command line as --rtlib option argument.
9019 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9020 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9021 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9022 }
9023 } else
9024 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009025 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009026 }
9027}
9028
Rafael Espindola1e085772014-08-15 17:14:35 +00009029static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9030 switch (T.getArch()) {
9031 case llvm::Triple::x86:
9032 return "elf_i386";
9033 case llvm::Triple::aarch64:
9034 return "aarch64linux";
9035 case llvm::Triple::aarch64_be:
9036 return "aarch64_be_linux";
9037 case llvm::Triple::arm:
9038 case llvm::Triple::thumb:
9039 return "armelf_linux_eabi";
9040 case llvm::Triple::armeb:
9041 case llvm::Triple::thumbeb:
9042 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9043 case llvm::Triple::ppc:
9044 return "elf32ppclinux";
9045 case llvm::Triple::ppc64:
9046 return "elf64ppc";
9047 case llvm::Triple::ppc64le:
9048 return "elf64lppc";
9049 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009050 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009051 return "elf32_sparc";
9052 case llvm::Triple::sparcv9:
9053 return "elf64_sparc";
9054 case llvm::Triple::mips:
9055 return "elf32btsmip";
9056 case llvm::Triple::mipsel:
9057 return "elf32ltsmip";
9058 case llvm::Triple::mips64:
9059 if (mips::hasMipsAbiArg(Args, "n32"))
9060 return "elf32btsmipn32";
9061 return "elf64btsmip";
9062 case llvm::Triple::mips64el:
9063 if (mips::hasMipsAbiArg(Args, "n32"))
9064 return "elf32ltsmipn32";
9065 return "elf64ltsmip";
9066 case llvm::Triple::systemz:
9067 return "elf64_s390";
9068 case llvm::Triple::x86_64:
9069 if (T.getEnvironment() == llvm::Triple::GNUX32)
9070 return "elf32_x86_64";
9071 return "elf_x86_64";
9072 default:
9073 llvm_unreachable("Unexpected arch");
9074 }
9075}
9076
Douglas Katzman95354292015-06-23 20:42:09 +00009077void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9078 const InputInfo &Output,
9079 const InputInfoList &Inputs,
9080 const ArgList &Args,
9081 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009082 const toolchains::Linux &ToolChain =
9083 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009084 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009085
9086 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9087 llvm::Triple Triple = llvm::Triple(TripleStr);
9088
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009089 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009090 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009091 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009092 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9093 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009094 const bool HasCRTBeginEndFiles =
9095 ToolChain.getTriple().hasEnvironment() ||
9096 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009097
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009098 ArgStringList CmdArgs;
9099
Rafael Espindolad1002f62010-11-15 18:28:16 +00009100 // Silence warning for "clang -g foo.o -o foo"
9101 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009102 // and "clang -emit-llvm foo.o -o foo"
9103 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009104 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009105 // handled somewhere else.
9106 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009107
Peter Collingbourne39719a72015-11-20 20:49:39 +00009108 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9109 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009110 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009111 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009112 CmdArgs.push_back("-target");
9113 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9114 }
9115
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009116 if (!D.SysRoot.empty())
9117 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009118
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009119 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009120 CmdArgs.push_back("-pie");
9121
Rafael Espindola1c76c592010-11-07 22:57:16 +00009122 if (Args.hasArg(options::OPT_rdynamic))
9123 CmdArgs.push_back("-export-dynamic");
9124
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009125 if (Args.hasArg(options::OPT_s))
9126 CmdArgs.push_back("-s");
9127
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009128 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009129 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009130
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009131 for (const auto &Opt : ToolChain.ExtraOpts)
9132 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009133
9134 if (!Args.hasArg(options::OPT_static)) {
9135 CmdArgs.push_back("--eh-frame-hdr");
9136 }
9137
9138 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009139 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009140
9141 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009142 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9143 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009144 CmdArgs.push_back("-Bstatic");
9145 else
9146 CmdArgs.push_back("-static");
9147 } else if (Args.hasArg(options::OPT_shared)) {
9148 CmdArgs.push_back("-shared");
9149 }
9150
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009151 if (!Args.hasArg(options::OPT_static)) {
9152 if (Args.hasArg(options::OPT_rdynamic))
9153 CmdArgs.push_back("-export-dynamic");
9154
9155 if (!Args.hasArg(options::OPT_shared)) {
9156 const std::string Loader =
9157 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9158 CmdArgs.push_back("-dynamic-linker");
9159 CmdArgs.push_back(Args.MakeArgString(Loader));
9160 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009161 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009162
9163 CmdArgs.push_back("-o");
9164 CmdArgs.push_back(Output.getFilename());
9165
Douglas Katzman78b37b02015-11-17 20:28:07 +00009166 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009167 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009168 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009169 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009170 if (Args.hasArg(options::OPT_pg))
9171 crt1 = "gcrt1.o";
9172 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009173 crt1 = "Scrt1.o";
9174 else
9175 crt1 = "crt1.o";
9176 }
9177 if (crt1)
9178 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009179
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009180 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9181 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009182
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009183 const char *crtbegin;
9184 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009185 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009186 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009187 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009188 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009189 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009190 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009191 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009192
9193 if (HasCRTBeginEndFiles)
9194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009195
9196 // Add crtfastmath.o if available and fast math is enabled.
9197 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009198 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009199
9200 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009201 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009202
Douglas Katzman6059ef92015-11-17 17:41:23 +00009203 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009204
Teresa Johnson945bc502015-10-15 20:35:53 +00009205 if (D.isUsingLTO())
9206 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009207
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009208 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9209 CmdArgs.push_back("--no-demangle");
9210
Alexey Samsonov52550342014-09-15 19:58:40 +00009211 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009212 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009213 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009214 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009215
Douglas Katzman78b37b02015-11-17 20:28:07 +00009216 if (D.CCCIsCXX() &&
9217 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009218 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009219 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009220 if (OnlyLibstdcxxStatic)
9221 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009222 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009223 if (OnlyLibstdcxxStatic)
9224 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009225 CmdArgs.push_back("-lm");
9226 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009227 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9228 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009229
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009230 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009231 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9232 if (Args.hasArg(options::OPT_static))
9233 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009234
Alexey Samsonov52550342014-09-15 19:58:40 +00009235 if (NeedsSanitizerDeps)
9236 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9237
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009238 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9239 Args.hasArg(options::OPT_pthreads);
9240
9241 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9242 options::OPT_fno_openmp, false)) {
9243 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9244 // FIXME: Does this really make sense for all GNU toolchains?
9245 WantPthread = true;
9246
9247 // Also link the particular OpenMP runtimes.
9248 switch (getOpenMPRuntime(ToolChain, Args)) {
9249 case OMPRT_OMP:
9250 CmdArgs.push_back("-lomp");
9251 break;
9252 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009253 CmdArgs.push_back("-lgomp");
9254
9255 // FIXME: Exclude this for platforms with libgomp that don't require
9256 // librt. Most modern Linux platforms require it, but some may not.
9257 CmdArgs.push_back("-lrt");
9258 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009259 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009260 CmdArgs.push_back("-liomp5");
9261 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009262 case OMPRT_Unknown:
9263 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009264 break;
9265 }
Chandler Carruth01538002013-01-17 13:19:29 +00009266 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009267
Renato Golinc4b49242014-02-13 10:01:16 +00009268 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009269
Richard Smith31d1de22015-05-20 22:48:44 +00009270 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009271 CmdArgs.push_back("-lpthread");
9272
Rafael Espindolab17bc532016-01-25 18:29:16 +00009273 if (Args.hasArg(options::OPT_fsplit_stack))
9274 CmdArgs.push_back("--wrap=pthread_create");
9275
Chandler Carruth94a32012012-05-14 18:31:18 +00009276 CmdArgs.push_back("-lc");
9277
9278 if (Args.hasArg(options::OPT_static))
9279 CmdArgs.push_back("--end-group");
9280 else
Renato Golinc4b49242014-02-13 10:01:16 +00009281 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009282 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009283
Rafael Espindola81937ec2010-12-01 01:52:43 +00009284 if (!Args.hasArg(options::OPT_nostartfiles)) {
9285 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009286 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009287 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009288 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009289 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009290 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009291 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009292
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009293 if (HasCRTBeginEndFiles)
9294 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009295 if (!isAndroid)
9296 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009297 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009298 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009299
Peter Collingbourne39719a72015-11-20 20:49:39 +00009300 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009301}
9302
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009303// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9304// for the various SFI requirements like register masking. The assembly tool
9305// inserts the file containing the macros as an input into all the assembly
9306// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009307void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9308 const InputInfo &Output,
9309 const InputInfoList &Inputs,
9310 const ArgList &Args,
9311 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009312 const toolchains::NaClToolChain &ToolChain =
9313 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009314 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009315 "nacl-arm-macros.s");
9316 InputInfoList NewInputs;
9317 NewInputs.push_back(NaClMacros);
9318 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009319 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9320 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009321}
9322
Douglas Katzman750cfc52015-06-29 18:42:16 +00009323// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009324// we use static by default, do not yet support sanitizers or LTO, and a few
9325// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009326// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009327void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9328 const InputInfo &Output,
9329 const InputInfoList &Inputs,
9330 const ArgList &Args,
9331 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009332
Douglas Katzman54366072015-07-27 16:53:08 +00009333 const toolchains::NaClToolChain &ToolChain =
9334 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009335 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009336 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009337 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009338 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009339
9340 ArgStringList CmdArgs;
9341
9342 // Silence warning for "clang -g foo.o -o foo"
9343 Args.ClaimAllArgs(options::OPT_g_Group);
9344 // and "clang -emit-llvm foo.o -o foo"
9345 Args.ClaimAllArgs(options::OPT_emit_llvm);
9346 // and for "clang -w foo.o -o foo". Other warning options are already
9347 // handled somewhere else.
9348 Args.ClaimAllArgs(options::OPT_w);
9349
9350 if (!D.SysRoot.empty())
9351 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9352
9353 if (Args.hasArg(options::OPT_rdynamic))
9354 CmdArgs.push_back("-export-dynamic");
9355
9356 if (Args.hasArg(options::OPT_s))
9357 CmdArgs.push_back("-s");
9358
Douglas Katzman54366072015-07-27 16:53:08 +00009359 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9360 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009361 CmdArgs.push_back("--build-id");
9362
9363 if (!IsStatic)
9364 CmdArgs.push_back("--eh-frame-hdr");
9365
9366 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009367 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009368 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009369 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009370 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009371 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009372 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009373 else if (Arch == llvm::Triple::mipsel)
9374 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009375 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009376 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9377 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009378
9379 if (IsStatic)
9380 CmdArgs.push_back("-static");
9381 else if (Args.hasArg(options::OPT_shared))
9382 CmdArgs.push_back("-shared");
9383
9384 CmdArgs.push_back("-o");
9385 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009386 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009387 if (!Args.hasArg(options::OPT_shared))
9388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9389 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9390
9391 const char *crtbegin;
9392 if (IsStatic)
9393 crtbegin = "crtbeginT.o";
9394 else if (Args.hasArg(options::OPT_shared))
9395 crtbegin = "crtbeginS.o";
9396 else
9397 crtbegin = "crtbegin.o";
9398 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9399 }
9400
9401 Args.AddAllArgs(CmdArgs, options::OPT_L);
9402 Args.AddAllArgs(CmdArgs, options::OPT_u);
9403
Douglas Katzman6059ef92015-11-17 17:41:23 +00009404 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009405
9406 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9407 CmdArgs.push_back("--no-demangle");
9408
9409 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9410
Douglas Katzman78b37b02015-11-17 20:28:07 +00009411 if (D.CCCIsCXX() &&
9412 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009413 bool OnlyLibstdcxxStatic =
9414 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009415 if (OnlyLibstdcxxStatic)
9416 CmdArgs.push_back("-Bstatic");
9417 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9418 if (OnlyLibstdcxxStatic)
9419 CmdArgs.push_back("-Bdynamic");
9420 CmdArgs.push_back("-lm");
9421 }
9422
9423 if (!Args.hasArg(options::OPT_nostdlib)) {
9424 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9425 // Always use groups, since it has no effect on dynamic libraries.
9426 CmdArgs.push_back("--start-group");
9427 CmdArgs.push_back("-lc");
9428 // NaCl's libc++ currently requires libpthread, so just always include it
9429 // in the group for C++.
9430 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009431 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009432 // Gold, used by Mips, handles nested groups differently than ld, and
9433 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9434 // which is not a desired behaviour here.
9435 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9436 if (getToolChain().getArch() == llvm::Triple::mipsel)
9437 CmdArgs.push_back("-lnacl");
9438
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009439 CmdArgs.push_back("-lpthread");
9440 }
9441
9442 CmdArgs.push_back("-lgcc");
9443 CmdArgs.push_back("--as-needed");
9444 if (IsStatic)
9445 CmdArgs.push_back("-lgcc_eh");
9446 else
9447 CmdArgs.push_back("-lgcc_s");
9448 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009449
9450 // Mips needs to create and use pnacl_legacy library that contains
9451 // definitions from bitcode/pnaclmm.c and definitions for
9452 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9453 if (getToolChain().getArch() == llvm::Triple::mipsel)
9454 CmdArgs.push_back("-lpnacl_legacy");
9455
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009456 CmdArgs.push_back("--end-group");
9457 }
9458
9459 if (!Args.hasArg(options::OPT_nostartfiles)) {
9460 const char *crtend;
9461 if (Args.hasArg(options::OPT_shared))
9462 crtend = "crtendS.o";
9463 else
9464 crtend = "crtend.o";
9465
9466 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9467 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9468 }
9469 }
9470
Peter Collingbourne39719a72015-11-20 20:49:39 +00009471 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9472 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009473}
9474
Douglas Katzman95354292015-06-23 20:42:09 +00009475void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9476 const InputInfo &Output,
9477 const InputInfoList &Inputs,
9478 const ArgList &Args,
9479 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009480 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009481 ArgStringList CmdArgs;
9482
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009483 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009484
9485 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009486 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009487
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009488 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009489 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009490
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009491 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009492 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009493}
9494
Douglas Katzman95354292015-06-23 20:42:09 +00009495void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9496 const InputInfo &Output,
9497 const InputInfoList &Inputs,
9498 const ArgList &Args,
9499 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009500 const Driver &D = getToolChain().getDriver();
9501 ArgStringList CmdArgs;
9502
Daniel Dunbarb440f562010-08-02 02:38:21 +00009503 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009504 CmdArgs.push_back("-o");
9505 CmdArgs.push_back(Output.getFilename());
9506 } else {
9507 assert(Output.isNothing() && "Invalid output.");
9508 }
9509
Douglas Katzman78b37b02015-11-17 20:28:07 +00009510 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009511 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9512 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9513 CmdArgs.push_back(
9514 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9515 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009516 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009517
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009518 Args.AddAllArgs(CmdArgs,
9519 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009520
Daniel Dunbar54423b22010-09-17 00:24:54 +00009521 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009522
Xinliang David Li69306c02015-10-22 06:15:31 +00009523 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009524
Douglas Katzman78b37b02015-11-17 20:28:07 +00009525 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009526 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009527 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009528 CmdArgs.push_back("-lm");
9529 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009530 }
9531
Douglas Katzman78b37b02015-11-17 20:28:07 +00009532 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009533 if (Args.hasArg(options::OPT_pthread))
9534 CmdArgs.push_back("-lpthread");
9535 CmdArgs.push_back("-lc");
9536 CmdArgs.push_back("-lCompilerRT-Generic");
9537 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9538 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009539 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009540 }
9541
Logan Chieneb9162f2014-06-26 14:23:45 +00009542 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009543 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009544}
9545
Daniel Dunbarcc912342009-05-02 18:28:39 +00009546/// DragonFly Tools
9547
9548// For now, DragonFly Assemble does just about the same as for
9549// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009550void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9551 const InputInfo &Output,
9552 const InputInfoList &Inputs,
9553 const ArgList &Args,
9554 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009555 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009556 ArgStringList CmdArgs;
9557
9558 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9559 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009560 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009561 CmdArgs.push_back("--32");
9562
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009563 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009564
9565 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009566 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009567
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009568 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009569 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009570
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009571 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009572 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009573}
9574
Douglas Katzman95354292015-06-23 20:42:09 +00009575void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9576 const InputInfo &Output,
9577 const InputInfoList &Inputs,
9578 const ArgList &Args,
9579 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009580 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009581 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009582
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009583 if (!D.SysRoot.empty())
9584 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9585
John McCall65b8da02013-04-11 22:55:55 +00009586 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009587 if (Args.hasArg(options::OPT_static)) {
9588 CmdArgs.push_back("-Bstatic");
9589 } else {
John McCall65b8da02013-04-11 22:55:55 +00009590 if (Args.hasArg(options::OPT_rdynamic))
9591 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009592 if (Args.hasArg(options::OPT_shared))
9593 CmdArgs.push_back("-Bshareable");
9594 else {
9595 CmdArgs.push_back("-dynamic-linker");
9596 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9597 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009598 CmdArgs.push_back("--hash-style=gnu");
9599 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009600 }
9601
9602 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9603 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009604 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009605 CmdArgs.push_back("-m");
9606 CmdArgs.push_back("elf_i386");
9607 }
9608
Daniel Dunbarb440f562010-08-02 02:38:21 +00009609 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009610 CmdArgs.push_back("-o");
9611 CmdArgs.push_back(Output.getFilename());
9612 } else {
9613 assert(Output.isNothing() && "Invalid output.");
9614 }
9615
Douglas Katzman78b37b02015-11-17 20:28:07 +00009616 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009617 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009618 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009619 CmdArgs.push_back(
9620 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009621 else {
9622 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009623 CmdArgs.push_back(
9624 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009625 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009626 CmdArgs.push_back(
9627 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009628 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009629 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009630 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009631 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009632 CmdArgs.push_back(
9633 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009634 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009635 CmdArgs.push_back(
9636 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009637 }
9638
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009639 Args.AddAllArgs(CmdArgs,
9640 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009641
Daniel Dunbar54423b22010-09-17 00:24:54 +00009642 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009643
Douglas Katzman78b37b02015-11-17 20:28:07 +00009644 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009645 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009646
9647 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009648 CmdArgs.push_back("-rpath");
9649 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009650 }
9651
Hans Wennborg70850d82013-07-18 20:29:38 +00009652 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009653 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009654 CmdArgs.push_back("-lm");
9655 }
9656
Daniel Dunbarcc912342009-05-02 18:28:39 +00009657 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009658 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009659
9660 if (!Args.hasArg(options::OPT_nolibc)) {
9661 CmdArgs.push_back("-lc");
9662 }
9663
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009664 if (Args.hasArg(options::OPT_static) ||
9665 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009666 CmdArgs.push_back("-lgcc");
9667 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009668 } else {
9669 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009670 CmdArgs.push_back("-lgcc_pic");
9671 if (!Args.hasArg(options::OPT_shared))
9672 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009673 } else {
John McCall65b8da02013-04-11 22:55:55 +00009674 CmdArgs.push_back("-lgcc");
9675 CmdArgs.push_back("--as-needed");
9676 CmdArgs.push_back("-lgcc_pic");
9677 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009678 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009679 }
9680 }
9681
Douglas Katzman78b37b02015-11-17 20:28:07 +00009682 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009683 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009684 CmdArgs.push_back(
9685 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009686 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009687 CmdArgs.push_back(
9688 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9689 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009690 }
9691
Xinliang David Li69306c02015-10-22 06:15:31 +00009692 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009693
Logan Chieneb9162f2014-06-26 14:23:45 +00009694 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009695 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009696}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009697
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009698// Try to find Exe from a Visual Studio distribution. This first tries to find
9699// an installed copy of Visual Studio and, failing that, looks in the PATH,
9700// making sure that whatever executable that's found is not a same-named exe
9701// from clang itself to prevent clang from falling back to itself.
9702static std::string FindVisualStudioExecutable(const ToolChain &TC,
9703 const char *Exe,
9704 const char *ClangProgramPath) {
9705 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9706 std::string visualStudioBinDir;
9707 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9708 visualStudioBinDir)) {
9709 SmallString<128> FilePath(visualStudioBinDir);
9710 llvm::sys::path::append(FilePath, Exe);
9711 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9712 return FilePath.str();
9713 }
9714
9715 return Exe;
9716}
9717
Douglas Katzman95354292015-06-23 20:42:09 +00009718void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9719 const InputInfo &Output,
9720 const InputInfoList &Inputs,
9721 const ArgList &Args,
9722 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009723 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009724 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009725
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009726 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9727 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009728 CmdArgs.push_back(
9729 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009730
Douglas Katzman78b37b02015-11-17 20:28:07 +00009731 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9732 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009733 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009734
Zachary Turner10d75b22014-10-22 20:40:43 +00009735 if (!llvm::sys::Process::GetEnv("LIB")) {
9736 // If the VC environment hasn't been configured (perhaps because the user
9737 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009738 // the environment variable is set however, assume the user knows what
9739 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009740 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009741 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009742 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9743 SmallString<128> LibDir(VisualStudioDir);
9744 llvm::sys::path::append(LibDir, "VC", "lib");
9745 switch (MSVC.getArch()) {
9746 case llvm::Triple::x86:
9747 // x86 just puts the libraries directly in lib
9748 break;
9749 case llvm::Triple::x86_64:
9750 llvm::sys::path::append(LibDir, "amd64");
9751 break;
9752 case llvm::Triple::arm:
9753 llvm::sys::path::append(LibDir, "arm");
9754 break;
9755 default:
9756 break;
9757 }
9758 CmdArgs.push_back(
9759 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009760
9761 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9762 std::string UniversalCRTLibPath;
9763 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9764 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9765 UniversalCRTLibPath.c_str()));
9766 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009767 }
9768
9769 std::string WindowsSdkLibPath;
9770 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9771 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9772 WindowsSdkLibPath.c_str()));
9773 }
9774
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009775 CmdArgs.push_back("-nologo");
9776
Reid Kleckner124955a2015-08-05 18:51:13 +00009777 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009778 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009779
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009780 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009781 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009782 if (DLL) {
9783 CmdArgs.push_back(Args.MakeArgString("-dll"));
9784
9785 SmallString<128> ImplibName(Output.getFilename());
9786 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009787 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009788 }
9789
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009790 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009791 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009792 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009793 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009794 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9795 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009796 // Make sure the dynamic runtime thunk is not optimized out at link time
9797 // to ensure proper SEH handling.
9798 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009799 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009800 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009801 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009802 for (const auto &Lib : {"asan", "asan_cxx"})
9803 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009804 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009805 }
9806
Hans Wennborg2e274592013-08-13 23:38:57 +00009807 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009808
Alexey Bataevc7e84352015-08-19 04:49:01 +00009809 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9810 options::OPT_fno_openmp, false)) {
9811 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9812 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9813 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9814 TC.getDriver().Dir + "/../lib"));
9815 switch (getOpenMPRuntime(getToolChain(), Args)) {
9816 case OMPRT_OMP:
9817 CmdArgs.push_back("-defaultlib:libomp.lib");
9818 break;
9819 case OMPRT_IOMP5:
9820 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9821 break;
9822 case OMPRT_GOMP:
9823 break;
9824 case OMPRT_Unknown:
9825 // Already diagnosed.
9826 break;
9827 }
9828 }
9829
Andrey Turetskiya4868572016-03-14 11:19:43 +00009830 // Add compiler-rt lib in case if it was explicitly
9831 // specified as an argument for --rtlib option.
9832 if (!Args.hasArg(options::OPT_nostdlib)) {
9833 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9834 }
9835
Reid Kleckner337188f2014-09-16 19:22:00 +00009836 // Add filenames, libraries, and other linker inputs.
9837 for (const auto &Input : Inputs) {
9838 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009839 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009840 continue;
9841 }
9842
9843 const Arg &A = Input.getInputArg();
9844
9845 // Render -l options differently for the MSVC linker.
9846 if (A.getOption().matches(options::OPT_l)) {
9847 StringRef Lib = A.getValue();
9848 const char *LinkLibArg;
9849 if (Lib.endswith(".lib"))
9850 LinkLibArg = Args.MakeArgString(Lib);
9851 else
9852 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9853 CmdArgs.push_back(LinkLibArg);
9854 continue;
9855 }
9856
9857 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9858 // or -L. Render it, even if MSVC doesn't understand it.
9859 A.renderAsInput(Args, CmdArgs);
9860 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009861
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009862 TC.addProfileRTLibs(Args, CmdArgs);
9863
Zachary Turner719f58c2014-12-01 23:06:47 +00009864 // We need to special case some linker paths. In the case of lld, we need to
9865 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9866 // linker, we need to use a special search algorithm.
9867 llvm::SmallString<128> linkPath;
9868 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9869 if (Linker.equals_lower("lld"))
9870 Linker = "lld-link";
9871
9872 if (Linker.equals_lower("link")) {
9873 // If we're using the MSVC linker, it's not sufficient to just use link
9874 // from the program PATH, because other environments like GnuWin32 install
9875 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009876 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009877 C.getDriver().getClangProgramPath());
9878 } else {
9879 linkPath = Linker;
9880 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009881 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009882 }
9883
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009884 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009885 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009886}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009887
Douglas Katzman95354292015-06-23 20:42:09 +00009888void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9889 const InputInfo &Output,
9890 const InputInfoList &Inputs,
9891 const ArgList &Args,
9892 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009893 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9894}
9895
Douglas Katzman95354292015-06-23 20:42:09 +00009896std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009897 Compilation &C, const JobAction &JA, const InputInfo &Output,
9898 const InputInfoList &Inputs, const ArgList &Args,
9899 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009900 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009901 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009902 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009903 CmdArgs.push_back("/W0"); // No warnings.
9904
9905 // The goal is to be able to invoke this tool correctly based on
9906 // any flag accepted by clang-cl.
9907
9908 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009909 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009910
9911 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009912 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9913 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9914 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009915 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9916 if (A->getOption().getID() == options::OPT_O0) {
9917 CmdArgs.push_back("/Od");
9918 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009919 CmdArgs.push_back("/Og");
9920
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009921 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009922 if (OptLevel == "s" || OptLevel == "z")
9923 CmdArgs.push_back("/Os");
9924 else
9925 CmdArgs.push_back("/Ot");
9926
9927 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009928 }
9929 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009930 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9931 options::OPT_fno_omit_frame_pointer))
9932 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9933 ? "/Oy"
9934 : "/Oy-");
9935 if (!Args.hasArg(options::OPT_fwritable_strings))
9936 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009937
Nico Weber3f8dafb2015-03-12 19:37:10 +00009938 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009939 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9940
David Majnemerf6072342014-07-01 22:24:56 +00009941 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9942 /*default=*/false))
9943 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009944 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9945 options::OPT_fno_function_sections))
9946 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9947 ? "/Gy"
9948 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009949 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9950 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009951 CmdArgs.push_back(
9952 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009953 if (Args.hasArg(options::OPT_fsyntax_only))
9954 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009955 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9956 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009957 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009958
Nico Weber3f8dafb2015-03-12 19:37:10 +00009959 std::vector<std::string> Includes =
9960 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009961 for (const auto &Include : Includes)
9962 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009963
Hans Wennborg87cfa712013-09-19 20:32:16 +00009964 // Flags that can simply be passed through.
9965 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9966 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009967 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9968 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009969 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009970 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009971
9972 // The order of these flags is relevant, so pick the last one.
9973 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9974 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9975 A->render(Args, CmdArgs);
9976
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009977 // Pass through all unknown arguments so that the fallback command can see
9978 // them too.
9979 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9980
Hans Wennborg87cfa712013-09-19 20:32:16 +00009981 // Input filename.
9982 assert(Inputs.size() == 1);
9983 const InputInfo &II = Inputs[0];
9984 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9985 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9986 if (II.isFilename())
9987 CmdArgs.push_back(II.getFilename());
9988 else
9989 II.getInputArg().renderAsInput(Args, CmdArgs);
9990
9991 // Output filename.
9992 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009993 const char *Fo =
9994 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009995 CmdArgs.push_back(Fo);
9996
Hans Wennborg188382e2013-09-20 18:16:35 +00009997 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009998 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9999 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010000 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010001 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010002}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010003
Yaron Keren1c0070c2015-07-02 04:45:27 +000010004/// MinGW Tools
10005void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10006 const InputInfo &Output,
10007 const InputInfoList &Inputs,
10008 const ArgList &Args,
10009 const char *LinkingOutput) const {
10010 claimNoWarnArgs(Args);
10011 ArgStringList CmdArgs;
10012
10013 if (getToolChain().getArch() == llvm::Triple::x86) {
10014 CmdArgs.push_back("--32");
10015 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10016 CmdArgs.push_back("--64");
10017 }
10018
10019 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10020
10021 CmdArgs.push_back("-o");
10022 CmdArgs.push_back(Output.getFilename());
10023
10024 for (const auto &II : Inputs)
10025 CmdArgs.push_back(II.getFilename());
10026
10027 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010028 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010029
10030 if (Args.hasArg(options::OPT_gsplit_dwarf))
10031 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10032 SplitDebugName(Args, Inputs[0]));
10033}
10034
10035void MinGW::Linker::AddLibGCC(const ArgList &Args,
10036 ArgStringList &CmdArgs) const {
10037 if (Args.hasArg(options::OPT_mthreads))
10038 CmdArgs.push_back("-lmingwthrd");
10039 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010040
Yaron Kerenaa281332015-08-09 00:24:07 +000010041 // Make use of compiler-rt if --rtlib option is used
10042 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10043 if (RLT == ToolChain::RLT_Libgcc) {
10044 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10045 Args.hasArg(options::OPT_static);
10046 bool Shared = Args.hasArg(options::OPT_shared);
10047 bool CXX = getToolChain().getDriver().CCCIsCXX();
10048
10049 if (Static || (!CXX && !Shared)) {
10050 CmdArgs.push_back("-lgcc");
10051 CmdArgs.push_back("-lgcc_eh");
10052 } else {
10053 CmdArgs.push_back("-lgcc_s");
10054 CmdArgs.push_back("-lgcc");
10055 }
10056 } else {
10057 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10058 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010059
Yaron Keren1c0070c2015-07-02 04:45:27 +000010060 CmdArgs.push_back("-lmoldname");
10061 CmdArgs.push_back("-lmingwex");
10062 CmdArgs.push_back("-lmsvcrt");
10063}
10064
10065void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10066 const InputInfo &Output,
10067 const InputInfoList &Inputs,
10068 const ArgList &Args,
10069 const char *LinkingOutput) const {
10070 const ToolChain &TC = getToolChain();
10071 const Driver &D = TC.getDriver();
10072 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10073
10074 ArgStringList CmdArgs;
10075
10076 // Silence warning for "clang -g foo.o -o foo"
10077 Args.ClaimAllArgs(options::OPT_g_Group);
10078 // and "clang -emit-llvm foo.o -o foo"
10079 Args.ClaimAllArgs(options::OPT_emit_llvm);
10080 // and for "clang -w foo.o -o foo". Other warning options are already
10081 // handled somewhere else.
10082 Args.ClaimAllArgs(options::OPT_w);
10083
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010084 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10085 if (LinkerName.equals_lower("lld")) {
10086 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010087 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010088 } else if (!LinkerName.equals_lower("ld")) {
10089 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010090 }
10091
Yaron Keren1c0070c2015-07-02 04:45:27 +000010092 if (!D.SysRoot.empty())
10093 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10094
10095 if (Args.hasArg(options::OPT_s))
10096 CmdArgs.push_back("-s");
10097
10098 CmdArgs.push_back("-m");
10099 if (TC.getArch() == llvm::Triple::x86)
10100 CmdArgs.push_back("i386pe");
10101 if (TC.getArch() == llvm::Triple::x86_64)
10102 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010103 if (TC.getArch() == llvm::Triple::arm)
10104 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010105
10106 if (Args.hasArg(options::OPT_mwindows)) {
10107 CmdArgs.push_back("--subsystem");
10108 CmdArgs.push_back("windows");
10109 } else if (Args.hasArg(options::OPT_mconsole)) {
10110 CmdArgs.push_back("--subsystem");
10111 CmdArgs.push_back("console");
10112 }
10113
10114 if (Args.hasArg(options::OPT_static))
10115 CmdArgs.push_back("-Bstatic");
10116 else {
10117 if (Args.hasArg(options::OPT_mdll))
10118 CmdArgs.push_back("--dll");
10119 else if (Args.hasArg(options::OPT_shared))
10120 CmdArgs.push_back("--shared");
10121 CmdArgs.push_back("-Bdynamic");
10122 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10123 CmdArgs.push_back("-e");
10124 if (TC.getArch() == llvm::Triple::x86)
10125 CmdArgs.push_back("_DllMainCRTStartup@12");
10126 else
10127 CmdArgs.push_back("DllMainCRTStartup");
10128 CmdArgs.push_back("--enable-auto-image-base");
10129 }
10130 }
10131
10132 CmdArgs.push_back("-o");
10133 CmdArgs.push_back(Output.getFilename());
10134
10135 Args.AddAllArgs(CmdArgs, options::OPT_e);
10136 // FIXME: add -N, -n flags
10137 Args.AddLastArg(CmdArgs, options::OPT_r);
10138 Args.AddLastArg(CmdArgs, options::OPT_s);
10139 Args.AddLastArg(CmdArgs, options::OPT_t);
10140 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10141 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10142
Douglas Katzman78b37b02015-11-17 20:28:07 +000010143 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010144 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10145 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10146 } else {
10147 if (Args.hasArg(options::OPT_municode))
10148 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10149 else
10150 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10151 }
10152 if (Args.hasArg(options::OPT_pg))
10153 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10154 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10155 }
10156
10157 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010158 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010159 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10160
10161 // TODO: Add ASan stuff here
10162
10163 // TODO: Add profile stuff here
10164
Douglas Katzman78b37b02015-11-17 20:28:07 +000010165 if (D.CCCIsCXX() &&
10166 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010167 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10168 !Args.hasArg(options::OPT_static);
10169 if (OnlyLibstdcxxStatic)
10170 CmdArgs.push_back("-Bstatic");
10171 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10172 if (OnlyLibstdcxxStatic)
10173 CmdArgs.push_back("-Bdynamic");
10174 }
10175
10176 if (!Args.hasArg(options::OPT_nostdlib)) {
10177 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10178 if (Args.hasArg(options::OPT_static))
10179 CmdArgs.push_back("--start-group");
10180
10181 if (Args.hasArg(options::OPT_fstack_protector) ||
10182 Args.hasArg(options::OPT_fstack_protector_strong) ||
10183 Args.hasArg(options::OPT_fstack_protector_all)) {
10184 CmdArgs.push_back("-lssp_nonshared");
10185 CmdArgs.push_back("-lssp");
10186 }
10187 if (Args.hasArg(options::OPT_fopenmp))
10188 CmdArgs.push_back("-lgomp");
10189
10190 AddLibGCC(Args, CmdArgs);
10191
10192 if (Args.hasArg(options::OPT_pg))
10193 CmdArgs.push_back("-lgmon");
10194
Yaron Kerenadce68e2015-07-06 18:52:19 +000010195 if (Args.hasArg(options::OPT_pthread))
10196 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010197
10198 // add system libraries
10199 if (Args.hasArg(options::OPT_mwindows)) {
10200 CmdArgs.push_back("-lgdi32");
10201 CmdArgs.push_back("-lcomdlg32");
10202 }
10203 CmdArgs.push_back("-ladvapi32");
10204 CmdArgs.push_back("-lshell32");
10205 CmdArgs.push_back("-luser32");
10206 CmdArgs.push_back("-lkernel32");
10207
10208 if (Args.hasArg(options::OPT_static))
10209 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010210 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010211 AddLibGCC(Args, CmdArgs);
10212 }
10213
10214 if (!Args.hasArg(options::OPT_nostartfiles)) {
10215 // Add crtfastmath.o if available and fast math is enabled.
10216 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10217
10218 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10219 }
10220 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010221 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010222 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010223}
10224
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010225/// XCore Tools
10226// We pass assemble and link construction to the xcc tool.
10227
Douglas Katzman95354292015-06-23 20:42:09 +000010228void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10229 const InputInfo &Output,
10230 const InputInfoList &Inputs,
10231 const ArgList &Args,
10232 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010233 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010234 ArgStringList CmdArgs;
10235
10236 CmdArgs.push_back("-o");
10237 CmdArgs.push_back(Output.getFilename());
10238
10239 CmdArgs.push_back("-c");
10240
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010241 if (Args.hasArg(options::OPT_v))
10242 CmdArgs.push_back("-v");
10243
Robert Lytton894d25c2014-05-02 09:33:25 +000010244 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10245 if (!A->getOption().matches(options::OPT_g0))
10246 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010247
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010248 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10249 false))
10250 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010251
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010252 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010253
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010254 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010255 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010256
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010257 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010258 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010259}
10260
Douglas Katzman95354292015-06-23 20:42:09 +000010261void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10262 const InputInfo &Output,
10263 const InputInfoList &Inputs,
10264 const ArgList &Args,
10265 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010266 ArgStringList CmdArgs;
10267
10268 if (Output.isFilename()) {
10269 CmdArgs.push_back("-o");
10270 CmdArgs.push_back(Output.getFilename());
10271 } else {
10272 assert(Output.isNothing() && "Invalid output.");
10273 }
10274
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010275 if (Args.hasArg(options::OPT_v))
10276 CmdArgs.push_back("-v");
10277
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010278 // Pass -fexceptions through to the linker if it was present.
10279 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10280 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010281 CmdArgs.push_back("-fexceptions");
10282
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010283 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10284
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010285 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010286 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010287}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010288
Douglas Katzman95354292015-06-23 20:42:09 +000010289void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10290 const InputInfo &Output,
10291 const InputInfoList &Inputs,
10292 const ArgList &Args,
10293 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010294 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010295 const auto &TC =
10296 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10297 ArgStringList CmdArgs;
10298 const char *Exec;
10299
10300 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010301 default:
10302 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010303 case llvm::Triple::arm:
10304 case llvm::Triple::thumb:
10305 break;
10306 case llvm::Triple::x86:
10307 CmdArgs.push_back("--32");
10308 break;
10309 case llvm::Triple::x86_64:
10310 CmdArgs.push_back("--64");
10311 break;
10312 }
10313
10314 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10315
10316 CmdArgs.push_back("-o");
10317 CmdArgs.push_back(Output.getFilename());
10318
10319 for (const auto &Input : Inputs)
10320 CmdArgs.push_back(Input.getFilename());
10321
10322 const std::string Assembler = TC.GetProgramPath("as");
10323 Exec = Args.MakeArgString(Assembler);
10324
Justin Bognerd3371d82015-07-17 03:35:54 +000010325 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010326}
10327
Douglas Katzman95354292015-06-23 20:42:09 +000010328void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10329 const InputInfo &Output,
10330 const InputInfoList &Inputs,
10331 const ArgList &Args,
10332 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010333 const auto &TC =
10334 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10335 const llvm::Triple &T = TC.getTriple();
10336 const Driver &D = TC.getDriver();
10337 SmallString<128> EntryPoint;
10338 ArgStringList CmdArgs;
10339 const char *Exec;
10340
10341 // Silence warning for "clang -g foo.o -o foo"
10342 Args.ClaimAllArgs(options::OPT_g_Group);
10343 // and "clang -emit-llvm foo.o -o foo"
10344 Args.ClaimAllArgs(options::OPT_emit_llvm);
10345 // and for "clang -w foo.o -o foo"
10346 Args.ClaimAllArgs(options::OPT_w);
10347 // Other warning options are already handled somewhere else.
10348
10349 if (!D.SysRoot.empty())
10350 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10351
10352 if (Args.hasArg(options::OPT_pie))
10353 CmdArgs.push_back("-pie");
10354 if (Args.hasArg(options::OPT_rdynamic))
10355 CmdArgs.push_back("-export-dynamic");
10356 if (Args.hasArg(options::OPT_s))
10357 CmdArgs.push_back("--strip-all");
10358
10359 CmdArgs.push_back("-m");
10360 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010361 default:
10362 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010363 case llvm::Triple::arm:
10364 case llvm::Triple::thumb:
10365 // FIXME: this is incorrect for WinCE
10366 CmdArgs.push_back("thumb2pe");
10367 break;
10368 case llvm::Triple::x86:
10369 CmdArgs.push_back("i386pe");
10370 EntryPoint.append("_");
10371 break;
10372 case llvm::Triple::x86_64:
10373 CmdArgs.push_back("i386pep");
10374 break;
10375 }
10376
10377 if (Args.hasArg(options::OPT_shared)) {
10378 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010379 default:
10380 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010381 case llvm::Triple::arm:
10382 case llvm::Triple::thumb:
10383 case llvm::Triple::x86_64:
10384 EntryPoint.append("_DllMainCRTStartup");
10385 break;
10386 case llvm::Triple::x86:
10387 EntryPoint.append("_DllMainCRTStartup@12");
10388 break;
10389 }
10390
10391 CmdArgs.push_back("-shared");
10392 CmdArgs.push_back("-Bdynamic");
10393
10394 CmdArgs.push_back("--enable-auto-image-base");
10395
10396 CmdArgs.push_back("--entry");
10397 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10398 } else {
10399 EntryPoint.append("mainCRTStartup");
10400
10401 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10402 : "-Bdynamic");
10403
Douglas Katzman78b37b02015-11-17 20:28:07 +000010404 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010405 CmdArgs.push_back("--entry");
10406 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10407 }
10408
10409 // FIXME: handle subsystem
10410 }
10411
10412 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010413 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010414
10415 CmdArgs.push_back("-o");
10416 CmdArgs.push_back(Output.getFilename());
10417
10418 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10419 SmallString<261> ImpLib(Output.getFilename());
10420 llvm::sys::path::replace_extension(ImpLib, ".lib");
10421
10422 CmdArgs.push_back("--out-implib");
10423 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10424 }
10425
Douglas Katzman78b37b02015-11-17 20:28:07 +000010426 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010427 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10428 const char *CRTBegin;
10429
10430 CRTBegin =
10431 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10432 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10433 }
10434
10435 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010436 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010437 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10438
10439 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10440 !Args.hasArg(options::OPT_nodefaultlibs)) {
10441 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10442 !Args.hasArg(options::OPT_static);
10443 if (StaticCXX)
10444 CmdArgs.push_back("-Bstatic");
10445 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10446 if (StaticCXX)
10447 CmdArgs.push_back("-Bdynamic");
10448 }
10449
10450 if (!Args.hasArg(options::OPT_nostdlib)) {
10451 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10452 // TODO handle /MT[d] /MD[d]
10453 CmdArgs.push_back("-lmsvcrt");
10454 AddRunTimeLibs(TC, D, CmdArgs, Args);
10455 }
10456 }
10457
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010458 if (TC.getSanitizerArgs().needsAsanRt()) {
10459 // TODO handle /MT[d] /MD[d]
10460 if (Args.hasArg(options::OPT_shared)) {
10461 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10462 } else {
10463 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10464 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10465 // Make sure the dynamic runtime thunk is not optimized out at link time
10466 // to ensure proper SEH handling.
10467 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10468 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10469 ? "___asan_seh_interceptor"
10470 : "__asan_seh_interceptor"));
10471 }
10472 }
10473
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010474 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010475
Justin Bognerd3371d82015-07-17 03:35:54 +000010476 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010477}
Douglas Katzman84a75642015-06-19 14:55:19 +000010478
Douglas Katzman95354292015-06-23 20:42:09 +000010479void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10480 const InputInfo &Output,
10481 const InputInfoList &Inputs,
10482 const ArgList &Args,
10483 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010484 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010485 assert(Inputs.size() == 1);
10486 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010487 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10488 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010489
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010490 if (JA.getKind() == Action::PreprocessJobClass) {
10491 Args.ClaimAllArgs();
10492 CmdArgs.push_back("-E");
10493 } else {
10494 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10495 CmdArgs.push_back("-S");
10496 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10497 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010498 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010499
Douglas Katzmanf6071112015-08-03 14:34:22 +000010500 // Append all -I, -iquote, -isystem paths, defines/undefines,
10501 // 'f' flags, optimize flags, and warning options.
10502 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010503 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010504 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010505 options::OPT_f_Group, options::OPT_f_clang_Group,
10506 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010507 options::OPT_O_Group, options::OPT_W_Group,
10508 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010509
10510 // If we're producing a dependency file, and assembly is the final action,
10511 // then the name of the target in the dependency file should be the '.o'
10512 // file, not the '.s' file produced by this step. For example, instead of
10513 // /tmp/mumble.s: mumble.c .../someheader.h
10514 // the filename on the lefthand side should be "mumble.o"
10515 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10516 C.getActions().size() == 1 &&
10517 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10518 Arg *A = Args.getLastArg(options::OPT_o);
10519 if (A) {
10520 CmdArgs.push_back("-MT");
10521 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10522 }
10523 }
10524
Douglas Katzman84a75642015-06-19 14:55:19 +000010525 CmdArgs.push_back(II.getFilename());
10526 CmdArgs.push_back("-o");
10527 CmdArgs.push_back(Output.getFilename());
10528
10529 std::string Exec =
10530 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010531 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10532 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010533}
10534
Douglas Katzman95354292015-06-23 20:42:09 +000010535void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10536 const InputInfo &Output,
10537 const InputInfoList &Inputs,
10538 const ArgList &Args,
10539 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010540 ArgStringList CmdArgs;
10541
10542 assert(Inputs.size() == 1);
10543 const InputInfo &II = Inputs[0];
10544 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10545 assert(Output.getType() == types::TY_Object);
10546
10547 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010548 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10549 if (CPUArg)
10550 CmdArgs.push_back(
10551 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010552 CmdArgs.push_back("-noSPrefixing");
10553 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010554 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10555 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10556 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010557 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010558 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010559 }
10560 CmdArgs.push_back("-elf"); // Output format.
10561 CmdArgs.push_back(II.getFilename());
10562 CmdArgs.push_back(
10563 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10564
10565 std::string Exec =
10566 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010567 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10568 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010569}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010570
10571void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10572 const InputInfo &Output,
10573 const InputInfoList &Inputs,
10574 const ArgList &Args,
10575 const char *LinkingOutput) const {
10576 const auto &TC =
10577 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10578 const llvm::Triple &T = TC.getTriple();
10579 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010580 bool UseStartfiles =
10581 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010582 bool UseDefaultLibs =
10583 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010584
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010585 if (T.getArch() == llvm::Triple::sparc)
10586 CmdArgs.push_back("-EB");
10587 else // SHAVE assumes little-endian, and sparcel is expressly so.
10588 CmdArgs.push_back("-EL");
10589
10590 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10591 // but we never pass through a --sysroot option and various other bits.
10592 // For example, there are no sanitizers (yet) nor gold linker.
10593
10594 // Eat some arguments that may be present but have no effect.
10595 Args.ClaimAllArgs(options::OPT_g_Group);
10596 Args.ClaimAllArgs(options::OPT_w);
10597 Args.ClaimAllArgs(options::OPT_static_libgcc);
10598
10599 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10600 CmdArgs.push_back("-s");
10601
10602 CmdArgs.push_back("-o");
10603 CmdArgs.push_back(Output.getFilename());
10604
10605 if (UseStartfiles) {
10606 // If you want startfiles, it means you want the builtin crti and crtbegin,
10607 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010608 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10609 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010610 }
10611
10612 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10613 options::OPT_e, options::OPT_s, options::OPT_t,
10614 options::OPT_Z_Flag, options::OPT_r});
10615
Douglas Katzman674a3122015-11-18 16:24:46 +000010616 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010617
10618 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10619
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010620 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010621 if (C.getDriver().CCCIsCXX())
10622 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010623 if (T.getOS() == llvm::Triple::RTEMS) {
10624 CmdArgs.push_back("--start-group");
10625 CmdArgs.push_back("-lc");
10626 // You must provide your own "-L" option to enable finding these.
10627 CmdArgs.push_back("-lrtemscpu");
10628 CmdArgs.push_back("-lrtemsbsp");
10629 CmdArgs.push_back("--end-group");
10630 } else {
10631 CmdArgs.push_back("-lc");
10632 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010633 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010634 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010635 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010636 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10637 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010638 }
10639
10640 std::string Exec =
10641 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10642 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10643 CmdArgs, Inputs));
10644}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010645
10646void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10647 const InputInfo &Output,
10648 const InputInfoList &Inputs,
10649 const ArgList &Args,
10650 const char *LinkingOutput) const {
10651 claimNoWarnArgs(Args);
10652 ArgStringList CmdArgs;
10653
10654 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10655
10656 CmdArgs.push_back("-o");
10657 CmdArgs.push_back(Output.getFilename());
10658
10659 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10660 const InputInfo &Input = Inputs[0];
10661 assert(Input.isFilename() && "Invalid input.");
10662 CmdArgs.push_back(Input.getFilename());
10663
10664 const char *Exec =
10665 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10666 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10667}
10668
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010669static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10670 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10671 if (SanArgs.needsUbsanRt()) {
10672 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10673 }
10674 if (SanArgs.needsAsanRt()) {
10675 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10676 }
10677}
10678
10679static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10680 const JobAction &JA, const InputInfo &Output,
10681 const InputInfoList &Inputs,
10682 const ArgList &Args,
10683 const char *LinkingOutput) {
10684 const toolchains::FreeBSD &ToolChain =
10685 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10686 const Driver &D = ToolChain.getDriver();
10687 ArgStringList CmdArgs;
10688
10689 // Silence warning for "clang -g foo.o -o foo"
10690 Args.ClaimAllArgs(options::OPT_g_Group);
10691 // and "clang -emit-llvm foo.o -o foo"
10692 Args.ClaimAllArgs(options::OPT_emit_llvm);
10693 // and for "clang -w foo.o -o foo". Other warning options are already
10694 // handled somewhere else.
10695 Args.ClaimAllArgs(options::OPT_w);
10696
10697 if (!D.SysRoot.empty())
10698 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10699
10700 if (Args.hasArg(options::OPT_pie))
10701 CmdArgs.push_back("-pie");
10702
10703 if (Args.hasArg(options::OPT_rdynamic))
10704 CmdArgs.push_back("-export-dynamic");
10705 if (Args.hasArg(options::OPT_shared))
10706 CmdArgs.push_back("--oformat=so");
10707
10708 if (Output.isFilename()) {
10709 CmdArgs.push_back("-o");
10710 CmdArgs.push_back(Output.getFilename());
10711 } else {
10712 assert(Output.isNothing() && "Invalid output.");
10713 }
10714
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010715 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10716
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010717 Args.AddAllArgs(CmdArgs, options::OPT_L);
10718 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10719 Args.AddAllArgs(CmdArgs, options::OPT_e);
10720 Args.AddAllArgs(CmdArgs, options::OPT_s);
10721 Args.AddAllArgs(CmdArgs, options::OPT_t);
10722 Args.AddAllArgs(CmdArgs, options::OPT_r);
10723
10724 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10725 CmdArgs.push_back("--no-demangle");
10726
10727 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10728
10729 if (Args.hasArg(options::OPT_pthread)) {
10730 CmdArgs.push_back("-lpthread");
10731 }
10732
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010733 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10734
10735 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10736}
10737
10738static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10739 const JobAction &JA, const InputInfo &Output,
10740 const InputInfoList &Inputs,
10741 const ArgList &Args,
10742 const char *LinkingOutput) {
10743 const toolchains::FreeBSD &ToolChain =
10744 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10745 const Driver &D = ToolChain.getDriver();
10746 ArgStringList CmdArgs;
10747
10748 // Silence warning for "clang -g foo.o -o foo"
10749 Args.ClaimAllArgs(options::OPT_g_Group);
10750 // and "clang -emit-llvm foo.o -o foo"
10751 Args.ClaimAllArgs(options::OPT_emit_llvm);
10752 // and for "clang -w foo.o -o foo". Other warning options are already
10753 // handled somewhere else.
10754 Args.ClaimAllArgs(options::OPT_w);
10755
10756 if (!D.SysRoot.empty())
10757 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10758
10759 if (Args.hasArg(options::OPT_pie))
10760 CmdArgs.push_back("-pie");
10761
10762 if (Args.hasArg(options::OPT_static)) {
10763 CmdArgs.push_back("-Bstatic");
10764 } else {
10765 if (Args.hasArg(options::OPT_rdynamic))
10766 CmdArgs.push_back("-export-dynamic");
10767 CmdArgs.push_back("--eh-frame-hdr");
10768 if (Args.hasArg(options::OPT_shared)) {
10769 CmdArgs.push_back("-Bshareable");
10770 } else {
10771 CmdArgs.push_back("-dynamic-linker");
10772 CmdArgs.push_back("/libexec/ld-elf.so.1");
10773 }
10774 CmdArgs.push_back("--enable-new-dtags");
10775 }
10776
10777 if (Output.isFilename()) {
10778 CmdArgs.push_back("-o");
10779 CmdArgs.push_back(Output.getFilename());
10780 } else {
10781 assert(Output.isNothing() && "Invalid output.");
10782 }
10783
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010784 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10785
Douglas Katzman78b37b02015-11-17 20:28:07 +000010786 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010787 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010788 if (!Args.hasArg(options::OPT_shared)) {
10789 if (Args.hasArg(options::OPT_pg))
10790 crt1 = "gcrt1.o";
10791 else if (Args.hasArg(options::OPT_pie))
10792 crt1 = "Scrt1.o";
10793 else
10794 crt1 = "crt1.o";
10795 }
10796 if (crt1)
10797 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10798
10799 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10800
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010801 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010802 if (Args.hasArg(options::OPT_static))
10803 crtbegin = "crtbeginT.o";
10804 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10805 crtbegin = "crtbeginS.o";
10806 else
10807 crtbegin = "crtbegin.o";
10808
10809 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10810 }
10811
10812 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010813 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010814 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10815 Args.AddAllArgs(CmdArgs, options::OPT_e);
10816 Args.AddAllArgs(CmdArgs, options::OPT_s);
10817 Args.AddAllArgs(CmdArgs, options::OPT_t);
10818 Args.AddAllArgs(CmdArgs, options::OPT_r);
10819
10820 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10821 CmdArgs.push_back("--no-demangle");
10822
10823 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10824
Douglas Katzman78b37b02015-11-17 20:28:07 +000010825 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010826 // For PS4, we always want to pass libm, libstdc++ and libkernel
10827 // libraries for both C and C++ compilations.
10828 CmdArgs.push_back("-lkernel");
10829 if (D.CCCIsCXX()) {
10830 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10831 if (Args.hasArg(options::OPT_pg))
10832 CmdArgs.push_back("-lm_p");
10833 else
10834 CmdArgs.push_back("-lm");
10835 }
10836 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10837 // the default system libraries. Just mimic this for now.
10838 if (Args.hasArg(options::OPT_pg))
10839 CmdArgs.push_back("-lgcc_p");
10840 else
10841 CmdArgs.push_back("-lcompiler_rt");
10842 if (Args.hasArg(options::OPT_static)) {
10843 CmdArgs.push_back("-lstdc++");
10844 } else if (Args.hasArg(options::OPT_pg)) {
10845 CmdArgs.push_back("-lgcc_eh_p");
10846 } else {
10847 CmdArgs.push_back("--as-needed");
10848 CmdArgs.push_back("-lstdc++");
10849 CmdArgs.push_back("--no-as-needed");
10850 }
10851
10852 if (Args.hasArg(options::OPT_pthread)) {
10853 if (Args.hasArg(options::OPT_pg))
10854 CmdArgs.push_back("-lpthread_p");
10855 else
10856 CmdArgs.push_back("-lpthread");
10857 }
10858
10859 if (Args.hasArg(options::OPT_pg)) {
10860 if (Args.hasArg(options::OPT_shared))
10861 CmdArgs.push_back("-lc");
10862 else {
10863 if (Args.hasArg(options::OPT_static)) {
10864 CmdArgs.push_back("--start-group");
10865 CmdArgs.push_back("-lc_p");
10866 CmdArgs.push_back("-lpthread_p");
10867 CmdArgs.push_back("--end-group");
10868 } else {
10869 CmdArgs.push_back("-lc_p");
10870 }
10871 }
10872 CmdArgs.push_back("-lgcc_p");
10873 } else {
10874 if (Args.hasArg(options::OPT_static)) {
10875 CmdArgs.push_back("--start-group");
10876 CmdArgs.push_back("-lc");
10877 CmdArgs.push_back("-lpthread");
10878 CmdArgs.push_back("--end-group");
10879 } else {
10880 CmdArgs.push_back("-lc");
10881 }
10882 CmdArgs.push_back("-lcompiler_rt");
10883 }
10884
10885 if (Args.hasArg(options::OPT_static)) {
10886 CmdArgs.push_back("-lstdc++");
10887 } else if (Args.hasArg(options::OPT_pg)) {
10888 CmdArgs.push_back("-lgcc_eh_p");
10889 } else {
10890 CmdArgs.push_back("--as-needed");
10891 CmdArgs.push_back("-lstdc++");
10892 CmdArgs.push_back("--no-as-needed");
10893 }
10894 }
10895
Douglas Katzman78b37b02015-11-17 20:28:07 +000010896 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010897 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10898 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10899 else
10900 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10901 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10902 }
10903
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010904 const char *Exec =
10905#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010906 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010907#else
10908 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10909#endif
10910
10911 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10912}
10913
10914void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10915 const InputInfo &Output,
10916 const InputInfoList &Inputs,
10917 const ArgList &Args,
10918 const char *LinkingOutput) const {
10919 const toolchains::FreeBSD &ToolChain =
10920 static_cast<const toolchains::FreeBSD &>(getToolChain());
10921 const Driver &D = ToolChain.getDriver();
10922 bool PS4Linker;
10923 StringRef LinkerOptName;
10924 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10925 LinkerOptName = A->getValue();
10926 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10927 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10928 }
10929
10930 if (LinkerOptName == "gold")
10931 PS4Linker = false;
10932 else if (LinkerOptName == "ps4")
10933 PS4Linker = true;
10934 else
10935 PS4Linker = !Args.hasArg(options::OPT_shared);
10936
10937 if (PS4Linker)
10938 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10939 else
10940 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10941}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010942
10943void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10944 const InputInfo &Output,
10945 const InputInfoList &Inputs,
10946 const ArgList &Args,
10947 const char *LinkingOutput) const {
10948 const auto &TC =
10949 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010950 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010951
10952 std::vector<std::string> gpu_archs =
10953 Args.getAllArgValues(options::OPT_march_EQ);
10954 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10955 const std::string& gpu_arch = gpu_archs[0];
10956
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010957 ArgStringList CmdArgs;
10958 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010959 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10960 // ptxas does not accept -g option if optimization is enabled, so
10961 // we ignore the compiler's -O* options if we want debug info.
10962 CmdArgs.push_back("-g");
10963 CmdArgs.push_back("--dont-merge-basicblocks");
10964 CmdArgs.push_back("--return-at-end");
10965 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10966 // Map the -O we received to -O{0,1,2,3}.
10967 //
10968 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10969 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010970
Justin Lebar2836dcd2016-01-19 19:52:21 +000010971 // -O3 seems like the least-bad option when -Osomething is specified to
10972 // clang but it isn't handled below.
10973 StringRef OOpt = "3";
10974 if (A->getOption().matches(options::OPT_O4) ||
10975 A->getOption().matches(options::OPT_Ofast))
10976 OOpt = "3";
10977 else if (A->getOption().matches(options::OPT_O0))
10978 OOpt = "0";
10979 else if (A->getOption().matches(options::OPT_O)) {
10980 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10981 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10982 .Case("1", "1")
10983 .Case("2", "2")
10984 .Case("3", "3")
10985 .Case("s", "2")
10986 .Case("z", "2")
10987 .Default("2");
10988 }
10989 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10990 } else {
10991 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10992 // to no optimizations, but ptxas's default is -O3.
10993 CmdArgs.push_back("-O0");
10994 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010995
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010996 CmdArgs.push_back("--gpu-name");
10997 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10998 CmdArgs.push_back("--output-file");
10999 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11000 for (const auto& II : Inputs)
11001 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11002
11003 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11004 CmdArgs.push_back(Args.MakeArgString(A));
11005
11006 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11007 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11008}
11009
11010// All inputs to this linker must be from CudaDeviceActions, as we need to look
11011// at the Inputs' Actions in order to figure out which GPU architecture they
11012// correspond to.
11013void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11014 const InputInfo &Output,
11015 const InputInfoList &Inputs,
11016 const ArgList &Args,
11017 const char *LinkingOutput) const {
11018 const auto &TC =
11019 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011020 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011021
11022 ArgStringList CmdArgs;
11023 CmdArgs.push_back("--cuda");
11024 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11025 CmdArgs.push_back(Args.MakeArgString("--create"));
11026 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11027
11028 for (const auto& II : Inputs) {
11029 auto* A = cast<const CudaDeviceAction>(II.getAction());
11030 // We need to pass an Arch of the form "sm_XX" for cubin files and
11031 // "compute_XX" for ptx.
11032 const char *Arch = (II.getType() == types::TY_PP_Asm)
11033 ? A->getComputeArchName()
11034 : A->getGpuArchName();
11035 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11036 Arch + ",file=" + II.getFilename()));
11037 }
11038
11039 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11040 CmdArgs.push_back(Args.MakeArgString(A));
11041
11042 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11043 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11044}