blob: 9939ce1e31557cf71c6f64407bbe786f82fc9620 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
419 if (getToolChain().getDriver().IsCLMode()) {
Junmo Parke19d6792016-03-17 06:41:27 +0000420 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000421 // include is compiled into foo.h, and everything after goes into
422 // the .obj file. /Yufoo.h means that all includes prior to and including
423 // foo.h are completely skipped and replaced with a use of the pch file
424 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
425 // just mean that the last one wins.) If /Yc and /Yu are both present
426 // and refer to the same file, /Yc wins.
427 // Note that OPT__SLASH_FI gets mapped to OPT_include.
428 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
429 // cl.exe seems to support both flags with different values, but that
430 // seems strange (which flag does /Fp now refer to?), so don't implement
431 // that until someone needs that.
432 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
433 if (PchIndex != -1) {
434 if (isa<PrecompileJobAction>(JA)) {
435 // When building the pch, skip all includes after the pch.
436 assert(YcIndex != -1 && PchIndex == YcIndex);
437 if (AI >= YcIndex)
438 continue;
439 } else {
440 // When using the pch, skip all includes prior to the pch.
441 if (AI < PchIndex)
442 continue;
443 if (AI == PchIndex) {
444 A->claim();
445 CmdArgs.push_back("-include-pch");
446 CmdArgs.push_back(
447 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
448 continue;
449 }
450 }
451 }
452 } else if (A->getOption().matches(options::OPT_include)) {
453 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000454 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
455 RenderedImplicitInclude = true;
456
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000457 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000458 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000459
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000460 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000461 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000462 SmallString<128> P(A->getValue());
463 // We want the files to have a name like foo.h.pch. Add a dummy extension
464 // so that replace_extension does the right thing.
465 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000466 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000467 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000468 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000469 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000470 }
471
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000473 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000474 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000476 }
477
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000479 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000480 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000481 FoundPCH = UsePCH;
482 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000483 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000484 }
485
486 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000487 if (IsFirstImplicitInclude) {
488 A->claim();
489 if (UsePCH)
490 CmdArgs.push_back("-include-pch");
491 else
492 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000493 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000494 continue;
495 } else {
496 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000497 D.Diag(diag::warn_drv_pch_not_first_include) << P
498 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000499 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000500 }
501 }
502
503 // Not translated, render as usual.
504 A->claim();
505 A->render(Args, CmdArgs);
506 }
507
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000508 Args.AddAllArgs(CmdArgs,
509 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
510 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000511
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000512 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000513
514 // FIXME: There is a very unfortunate problem here, some troubled
515 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
516 // really support that we would have to parse and then translate
517 // those options. :(
518 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
519 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000520
521 // -I- is a deprecated GCC feature, reject it.
522 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000523 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000524
525 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
526 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000527 StringRef sysroot = C.getSysRoot();
528 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000529 if (!Args.hasArg(options::OPT_isysroot)) {
530 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000531 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 }
533 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000534
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000535 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000536 // FIXME: We should probably sink the logic for handling these from the
537 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // CPATH - included following the user specified includes (but prior to
539 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000540 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000542 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000543 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000544 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000545 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000546 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000547 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000548 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000549
Artem Belevichfa11ab52015-11-17 22:28:46 +0000550 // Optional AuxToolChain indicates that we need to include headers
551 // for more than one target. If that's the case, add include paths
552 // from AuxToolChain right after include paths of the same kind for
553 // the current target.
554
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000555 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000556 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000557 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000558 if (AuxToolChain)
559 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
560 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000561
562 // Add system include arguments.
563 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000564 if (AuxToolChain)
565 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
566
567 // Add CUDA include arguments, if needed.
568 if (types::isCuda(Inputs[0].getType()))
569 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000570}
571
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000572// FIXME: Move to target hook.
573static bool isSignedCharDefault(const llvm::Triple &Triple) {
574 switch (Triple.getArch()) {
575 default:
576 return true;
577
Tim Northover9bb857a2013-01-31 12:13:10 +0000578 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000579 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000580 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000581 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000582 case llvm::Triple::thumb:
583 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000584 if (Triple.isOSDarwin() || Triple.isOSWindows())
585 return true;
586 return false;
587
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000588 case llvm::Triple::ppc:
589 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000590 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 return true;
592 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000593
David Majnemerdcecd932015-05-23 19:23:55 +0000594 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000595 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000596 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000597 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000598 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000599 }
600}
601
Robert Lytton0e076492013-08-13 09:43:10 +0000602static bool isNoCommonDefault(const llvm::Triple &Triple) {
603 switch (Triple.getArch()) {
604 default:
605 return false;
606
607 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000608 case llvm::Triple::wasm32:
609 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000610 return true;
611 }
612}
613
Renato Goline17c5802015-07-27 23:44:42 +0000614// ARM tools start.
615
616// Get SubArch (vN).
617static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
618 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000619 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000620}
621
622// True if M-profile.
623static bool isARMMProfile(const llvm::Triple &Triple) {
624 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000625 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000626 return Profile == llvm::ARM::PK_M;
627}
628
629// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000630static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
631 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000632 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
633 CPU = A->getValue();
634 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
635 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000636 if (!FromAs)
637 return;
638
639 for (const Arg *A :
640 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
641 StringRef Value = A->getValue();
642 if (Value.startswith("-mcpu="))
643 CPU = Value.substr(6);
644 if (Value.startswith("-march="))
645 Arch = Value.substr(7);
646 }
Renato Goline17c5802015-07-27 23:44:42 +0000647}
648
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000649// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000650// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000651static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000652 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000653 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000654 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
655 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000656 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
657}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000658
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000659// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000660static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000661 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000663 unsigned FPUID = llvm::ARM::parseFPU(FPU);
664 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000665 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
666}
667
Bradley Smithbbf5a002015-11-18 16:33:48 +0000668// Decode ARM features from string like +[no]featureA+[no]featureB+...
669static bool DecodeARMFeatures(const Driver &D, StringRef text,
670 std::vector<const char *> &Features) {
671 SmallVector<StringRef, 8> Split;
672 text.split(Split, StringRef("+"), -1, false);
673
674 for (StringRef Feature : Split) {
675 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
676 if (FeatureName)
677 Features.push_back(FeatureName);
678 else
679 return false;
680 }
681 return true;
682}
683
Renato Golin7c542b42015-07-27 23:44:45 +0000684// Check if -march is valid by checking if it can be canonicalised and parsed.
685// getARMArch is used here instead of just checking the -march value in order
686// to handle -march=native correctly.
687static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000688 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000689 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000690 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000691 std::pair<StringRef, StringRef> Split = ArchName.split("+");
692
Renato Goline17c5802015-07-27 23:44:42 +0000693 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
695 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000696 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000697}
698
Renato Golin7c542b42015-07-27 23:44:45 +0000699// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
700static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
701 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000702 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000703 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000704 std::pair<StringRef, StringRef> Split = CPUName.split("+");
705
Renato Goline17c5802015-07-27 23:44:42 +0000706 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
708 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000709 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000710}
711
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000712static bool useAAPCSForMachO(const llvm::Triple &T) {
713 // The backend is hardwired to assume AAPCS for M-class processors, ensure
714 // the frontend matches that.
715 return T.getEnvironment() == llvm::Triple::EABI ||
716 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
717}
718
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000719// Select the float ABI as determined by -msoft-float, -mhard-float, and
720// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000721arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
722 const Driver &D = TC.getDriver();
723 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000724 auto SubArch = getARMSubArchVersionNumber(Triple);
725 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 if (Arg *A =
727 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
728 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000729 if (A->getOption().matches(options::OPT_msoft_float)) {
730 ABI = FloatABI::Soft;
731 } else if (A->getOption().matches(options::OPT_mhard_float)) {
732 ABI = FloatABI::Hard;
733 } else {
734 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
735 .Case("soft", FloatABI::Soft)
736 .Case("softfp", FloatABI::SoftFP)
737 .Case("hard", FloatABI::Hard)
738 .Default(FloatABI::Invalid);
739 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000740 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000742 }
743 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000744
745 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
746 // "apcs-gnu".
747 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000748 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000749 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
750 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 }
753
754 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000755 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000756 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000757 case llvm::Triple::Darwin:
758 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000759 case llvm::Triple::IOS:
760 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000763 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 break;
765 }
Tim Northover756447a2015-10-30 16:30:36 +0000766 case llvm::Triple::WatchOS:
767 ABI = FloatABI::Hard;
768 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000769
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000770 // FIXME: this is invalid for WindowsCE
771 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000772 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 break;
774
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000775 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000776 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000777 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000778 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000779 break;
780 default:
781 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000782 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000783 break;
784 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000785 break;
786
Daniel Dunbar78485922009-09-10 23:00:09 +0000787 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000788 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000789 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000790 case llvm::Triple::EABIHF:
791 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000793 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000794 case llvm::Triple::EABI:
795 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000796 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 case llvm::Triple::Android:
799 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000800 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000801 default:
802 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000803 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000804 if (Triple.getOS() != llvm::Triple::UnknownOS ||
805 !Triple.isOSBinFormatMachO())
806 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000807 break;
808 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000809 }
810 }
811
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000812 assert(ABI != FloatABI::Invalid && "must select an ABI");
813 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814}
815
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000816static void getARMTargetFeatures(const ToolChain &TC,
817 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000818 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000819 std::vector<const char *> &Features,
820 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000821 const Driver &D = TC.getDriver();
822
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000823 bool KernelOrKext =
824 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000825 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000826 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
827 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
828
Nico Weber6e0ebae2015-04-29 21:16:40 +0000829 if (!ForAS) {
830 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
831 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
832 // stripped out by the ARM target. We should probably pass this a new
833 // -target-option, which is handled by the -cc1/-cc1as invocation.
834 //
835 // FIXME2: For consistency, it would be ideal if we set up the target
836 // machine state the same when using the frontend or the assembler. We don't
837 // currently do that for the assembler, we pass the options directly to the
838 // backend and never even instantiate the frontend TargetInfo. If we did,
839 // and used its handleTargetFeatures hook, then we could ensure the
840 // assembler and the frontend behave the same.
841
842 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000843 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000844 Features.push_back("+soft-float");
845
846 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000847 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000848 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000849 } else {
850 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
851 // to the assembler correctly.
852 for (const Arg *A :
853 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
854 StringRef Value = A->getValue();
855 if (Value.startswith("-mfpu=")) {
856 WaFPU = A;
857 } else if (Value.startswith("-mcpu=")) {
858 WaCPU = A;
859 } else if (Value.startswith("-mhwdiv=")) {
860 WaHDiv = A;
861 } else if (Value.startswith("-march=")) {
862 WaArch = A;
863 }
864 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000865 }
866
Renato Golin7c542b42015-07-27 23:44:45 +0000867 // Check -march. ClangAs gives preference to -Wa,-march=.
868 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000869 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000870 if (WaArch) {
871 if (ArchArg)
872 D.Diag(clang::diag::warn_drv_unused_argument)
873 << ArchArg->getAsString(Args);
874 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000875 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000876 // FIXME: Set Arch.
877 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
878 } else if (ArchArg) {
879 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000880 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000881 }
882
Renato Golin7c542b42015-07-27 23:44:45 +0000883 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
884 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000885 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000886 if (WaCPU) {
887 if (CPUArg)
888 D.Diag(clang::diag::warn_drv_unused_argument)
889 << CPUArg->getAsString(Args);
890 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000891 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000892 } else if (CPUArg) {
893 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000895 }
John Brawna95c1a82015-05-08 12:52:18 +0000896
Renato Golin23459c62015-07-30 16:40:17 +0000897 // Add CPU features for generic CPUs
898 if (CPUName == "native") {
899 llvm::StringMap<bool> HostFeatures;
900 if (llvm::sys::getHostCPUFeatures(HostFeatures))
901 for (auto &F : HostFeatures)
902 Features.push_back(
903 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
904 }
905
906 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
907 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
908 if (WaFPU) {
909 if (FPUArg)
910 D.Diag(clang::diag::warn_drv_unused_argument)
911 << FPUArg->getAsString(Args);
912 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
913 Features);
914 } else if (FPUArg) {
915 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
916 }
917
918 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
919 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
920 if (WaHDiv) {
921 if (HDivArg)
922 D.Diag(clang::diag::warn_drv_unused_argument)
923 << HDivArg->getAsString(Args);
924 getARMHWDivFeatures(D, WaHDiv, Args,
925 StringRef(WaHDiv->getValue()).substr(8), Features);
926 } else if (HDivArg)
927 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
928
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000929 // Setting -msoft-float effectively disables NEON because of the GCC
930 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000931 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000933 // Also need to explicitly disable features which imply NEON.
934 Features.push_back("-crypto");
935 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000936
Eric Christopher269c2a22015-04-04 03:34:43 +0000937 // En/disable crc code generation.
938 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000939 if (A->getOption().matches(options::OPT_mcrc))
940 Features.push_back("+crc");
941 else
942 Features.push_back("-crc");
943 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000944
Akira Hatanakac2694822015-07-07 08:28:42 +0000945 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
946 // neither options are specified, see if we are compiling for kernel/kext and
947 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000948 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
949 options::OPT_mno_long_calls)) {
950 if (A->getOption().matches(options::OPT_mlong_calls))
951 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000952 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
953 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000954 Features.push_back("+long-calls");
955 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000956
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000957 // Kernel code has more strict alignment requirements.
958 if (KernelOrKext)
959 Features.push_back("+strict-align");
960 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
961 options::OPT_munaligned_access)) {
962 if (A->getOption().matches(options::OPT_munaligned_access)) {
963 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
964 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
965 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000966 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
967 // access either.
968 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
969 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000970 } else
971 Features.push_back("+strict-align");
972 } else {
973 // Assume pre-ARMv6 doesn't support unaligned accesses.
974 //
975 // ARMv6 may or may not support unaligned accesses depending on the
976 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
977 // Darwin and NetBSD targets support unaligned accesses, and others don't.
978 //
979 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
980 // which raises an alignment fault on unaligned accesses. Linux
981 // defaults this bit to 0 and handles it as a system-wide (not
982 // per-process) setting. It is therefore safe to assume that ARMv7+
983 // Linux targets support unaligned accesses. The same goes for NaCl.
984 //
985 // The above behavior is consistent with GCC.
986 int VersionNum = getARMSubArchVersionNumber(Triple);
987 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000988 if (VersionNum < 6 ||
989 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000990 Features.push_back("+strict-align");
991 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
992 if (VersionNum < 7)
993 Features.push_back("+strict-align");
994 } else
995 Features.push_back("+strict-align");
996 }
997
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000998 // llvm does not support reserving registers in general. There is support
999 // for reserving r9 on ARM though (defined as a platform-specific register
1000 // in ARM EABI).
1001 if (Args.hasArg(options::OPT_ffixed_r9))
1002 Features.push_back("+reserve-r9");
1003
Dimitry Andric08107392016-01-06 07:42:18 +00001004 // The kext linker doesn't know how to deal with movw/movt.
1005 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001006 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001007}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001008
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001009void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1010 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001012 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001013 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001014 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001015 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001016 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001017 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001018 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001019 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001020 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001021 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001022 } else {
1023 ABIName = "apcs-gnu";
1024 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001025 } else if (Triple.isOSWindows()) {
1026 // FIXME: this is invalid for WindowsCE
1027 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001028 } else {
1029 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001030 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001031 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001032 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001033 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001034 ABIName = "aapcs-linux";
1035 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001036 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001037 case llvm::Triple::EABI:
1038 ABIName = "aapcs";
1039 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001040 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001041 if (Triple.getOS() == llvm::Triple::NetBSD)
1042 ABIName = "apcs-gnu";
1043 else
1044 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001045 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001046 }
1047 }
1048 CmdArgs.push_back("-target-abi");
1049 CmdArgs.push_back(ABIName);
1050
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001051 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001052 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001053 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001054 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001055 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001056 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001057 CmdArgs.push_back("-mfloat-abi");
1058 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001059 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001060 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001061 CmdArgs.push_back("-mfloat-abi");
1062 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 } else {
1064 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001065 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001066 CmdArgs.push_back("-mfloat-abi");
1067 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001069
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001070 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-arm-global-merge=false");
1076 else
1077 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001078 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001079
Bob Wilson9c8af452013-04-11 18:53:25 +00001080 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001081 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001082 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001083}
Renato Goline17c5802015-07-27 23:44:42 +00001084// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001085
Tim Northover573cbee2014-05-24 12:52:07 +00001086/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1087/// targeting.
1088static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001089 Arg *A;
1090 std::string CPU;
1091 // If we have -mtune or -mcpu, use that.
1092 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001093 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001094 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001095 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001096 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001097 }
1098
Kevin Qin110db6f2014-07-18 07:03:22 +00001099 // Handle CPU name is 'native'.
1100 if (CPU == "native")
1101 return llvm::sys::getHostCPUName();
1102 else if (CPU.size())
1103 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001104
James Molloy9b1586b2014-04-17 12:51:17 +00001105 // Make sure we pick "cyclone" if -arch is used.
1106 // FIXME: Should this be picked by checking the target triple instead?
1107 if (Args.getLastArg(options::OPT_arch))
1108 return "cyclone";
1109
1110 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001111}
1112
Tim Northover573cbee2014-05-24 12:52:07 +00001113void Clang::AddAArch64TargetArgs(const ArgList &Args,
1114 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001115 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1116 llvm::Triple Triple(TripleStr);
1117
1118 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1119 Args.hasArg(options::OPT_mkernel) ||
1120 Args.hasArg(options::OPT_fapple_kext))
1121 CmdArgs.push_back("-disable-red-zone");
1122
1123 if (!Args.hasFlag(options::OPT_mimplicit_float,
1124 options::OPT_mno_implicit_float, true))
1125 CmdArgs.push_back("-no-implicit-float");
1126
Craig Topper92fc2df2014-05-17 16:56:41 +00001127 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001128 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1129 ABIName = A->getValue();
1130 else if (Triple.isOSDarwin())
1131 ABIName = "darwinpcs";
1132 else
1133 ABIName = "aapcs";
1134
1135 CmdArgs.push_back("-target-abi");
1136 CmdArgs.push_back(ABIName);
1137
Bradley Smith9ff64332014-10-13 10:16:06 +00001138 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1139 options::OPT_mno_fix_cortex_a53_835769)) {
1140 CmdArgs.push_back("-backend-option");
1141 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1142 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1143 else
1144 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001145 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001146 // Enabled A53 errata (835769) workaround by default on android
1147 CmdArgs.push_back("-backend-option");
1148 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001149 }
1150
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001151 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1153 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001154 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001156 CmdArgs.push_back("-aarch64-global-merge=false");
1157 else
1158 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001159 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001160}
1161
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001162// Get CPU and ABI names. They are not independent
1163// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001164void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1165 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001166 const char *DefMips32CPU = "mips32r2";
1167 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001168
Daniel Sanders2bf13662014-07-10 14:40:57 +00001169 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1170 // default for mips64(el)?-img-linux-gnu.
1171 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1172 Triple.getEnvironment() == llvm::Triple::GNU) {
1173 DefMips32CPU = "mips32r6";
1174 DefMips64CPU = "mips64r6";
1175 }
Renato Golin7c542b42015-07-27 23:44:45 +00001176
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001177 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001178 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001179 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001180
Brad Smithba26f582015-01-06 02:53:17 +00001181 // MIPS3 is the default for mips64*-unknown-openbsd.
1182 if (Triple.getOS() == llvm::Triple::OpenBSD)
1183 DefMips64CPU = "mips3";
1184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001185 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001186 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001187
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001188 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001189 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001190 // Convert a GNU style Mips ABI name to the name
1191 // accepted by LLVM Mips backend.
1192 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 .Case("32", "o32")
1194 .Case("64", "n64")
1195 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001197
1198 // Setup default CPU and ABI names.
1199 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001200 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001201 default:
1202 llvm_unreachable("Unexpected triple arch name");
1203 case llvm::Triple::mips:
1204 case llvm::Triple::mipsel:
1205 CPUName = DefMips32CPU;
1206 break;
1207 case llvm::Triple::mips64:
1208 case llvm::Triple::mips64el:
1209 CPUName = DefMips64CPU;
1210 break;
1211 }
1212 }
1213
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001214 if (ABIName.empty()) {
1215 // Deduce ABI name from the target triple.
1216 if (Triple.getArch() == llvm::Triple::mips ||
1217 Triple.getArch() == llvm::Triple::mipsel)
1218 ABIName = "o32";
1219 else
1220 ABIName = "n64";
1221 }
1222
1223 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001224 // Deduce CPU name from ABI name.
1225 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 .Cases("o32", "eabi", DefMips32CPU)
1227 .Cases("n32", "n64", DefMips64CPU)
1228 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001229 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001230
1231 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001232}
1233
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001234std::string mips::getMipsABILibSuffix(const ArgList &Args,
1235 const llvm::Triple &Triple) {
1236 StringRef CPUName, ABIName;
1237 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1238 return llvm::StringSwitch<std::string>(ABIName)
1239 .Case("o32", "")
1240 .Case("n32", "32")
1241 .Case("n64", "64");
1242}
1243
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001244// Convert ABI name to the GNU tools acceptable variant.
1245static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1246 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001247 .Case("o32", "32")
1248 .Case("n64", "64")
1249 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001250}
1251
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001252// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1253// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001254static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1255 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001256 if (Arg *A =
1257 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1258 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001259 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001260 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001261 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001263 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001264 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1265 .Case("soft", mips::FloatABI::Soft)
1266 .Case("hard", mips::FloatABI::Hard)
1267 .Default(mips::FloatABI::Invalid);
1268 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001269 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 }
1272 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001273 }
1274
1275 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001276 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001277 // Assume "hard", because it's a default value used by gcc.
1278 // When we start to recognize specific target MIPS processors,
1279 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001280 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001283 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1284 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001285}
1286
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001287static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001288 std::vector<const char *> &Features,
1289 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290 StringRef FeatureName) {
1291 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001292 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001293 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001294 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001295 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001296 }
1297}
1298
Daniel Sanders379d44b2014-07-16 11:52:23 +00001299static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1300 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001302 StringRef CPUName;
1303 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001304 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305 ABIName = getGnuCompatibleMipsABIName(ABIName);
1306
Daniel Sandersfeb61302014-08-08 15:47:17 +00001307 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1308 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001309
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1311 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001312 // FIXME: Note, this is a hack. We need to pass the selected float
1313 // mode to the MipsTargetInfoBase to define appropriate macros there.
1314 // Now it is the only method.
1315 Features.push_back("+soft-float");
1316 }
1317
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001318 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001319 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001320 if (Val == "2008") {
1321 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1322 Features.push_back("+nan2008");
1323 else {
1324 Features.push_back("-nan2008");
1325 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1326 }
1327 } else if (Val == "legacy") {
1328 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1329 Features.push_back("-nan2008");
1330 else {
1331 Features.push_back("+nan2008");
1332 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1333 }
1334 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001335 D.Diag(diag::err_drv_unsupported_option_argument)
1336 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001337 }
1338
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001339 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1340 options::OPT_mdouble_float, "single-float");
1341 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1342 "mips16");
1343 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1344 options::OPT_mno_micromips, "micromips");
1345 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1346 "dsp");
1347 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1348 "dspr2");
1349 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1350 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001351
1352 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1353 // pass -mfpxx
1354 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1355 options::OPT_mfp64)) {
1356 if (A->getOption().matches(options::OPT_mfp32))
1357 Features.push_back(Args.MakeArgString("-fp64"));
1358 else if (A->getOption().matches(options::OPT_mfpxx)) {
1359 Features.push_back(Args.MakeArgString("+fpxx"));
1360 Features.push_back(Args.MakeArgString("+nooddspreg"));
1361 } else
1362 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001363 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001364 Features.push_back(Args.MakeArgString("+fpxx"));
1365 Features.push_back(Args.MakeArgString("+nooddspreg"));
1366 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001367
Daniel Sanders28e5d392014-07-10 10:39:51 +00001368 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1369 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001370}
1371
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001372void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001373 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001374 const Driver &D = getToolChain().getDriver();
1375 StringRef CPUName;
1376 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001377 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001378 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001379
1380 CmdArgs.push_back("-target-abi");
1381 CmdArgs.push_back(ABIName.data());
1382
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001383 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1384 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001385 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001386 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001387 CmdArgs.push_back("-mfloat-abi");
1388 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001389 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001390 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001392 CmdArgs.push_back("-mfloat-abi");
1393 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001395
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001396 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1397 if (A->getOption().matches(options::OPT_mxgot)) {
1398 CmdArgs.push_back("-mllvm");
1399 CmdArgs.push_back("-mxgot");
1400 }
1401 }
1402
Simon Atanasyanc580b322013-05-11 06:33:44 +00001403 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1404 options::OPT_mno_ldc1_sdc1)) {
1405 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mno-ldc1-sdc1");
1408 }
1409 }
1410
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1412 options::OPT_mno_check_zero_division)) {
1413 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-check-zero-division");
1416 }
1417 }
1418
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001419 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001420 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001421 CmdArgs.push_back("-mllvm");
1422 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1423 A->claim();
1424 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001425}
1426
Hal Finkel8eb59282012-06-11 22:35:19 +00001427/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1428static std::string getPPCTargetCPU(const ArgList &Args) {
1429 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001430 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001431
1432 if (CPUName == "native") {
1433 std::string CPU = llvm::sys::getHostCPUName();
1434 if (!CPU.empty() && CPU != "generic")
1435 return CPU;
1436 else
1437 return "";
1438 }
1439
1440 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001441 .Case("common", "generic")
1442 .Case("440", "440")
1443 .Case("440fp", "440")
1444 .Case("450", "450")
1445 .Case("601", "601")
1446 .Case("602", "602")
1447 .Case("603", "603")
1448 .Case("603e", "603e")
1449 .Case("603ev", "603ev")
1450 .Case("604", "604")
1451 .Case("604e", "604e")
1452 .Case("620", "620")
1453 .Case("630", "pwr3")
1454 .Case("G3", "g3")
1455 .Case("7400", "7400")
1456 .Case("G4", "g4")
1457 .Case("7450", "7450")
1458 .Case("G4+", "g4+")
1459 .Case("750", "750")
1460 .Case("970", "970")
1461 .Case("G5", "g5")
1462 .Case("a2", "a2")
1463 .Case("a2q", "a2q")
1464 .Case("e500mc", "e500mc")
1465 .Case("e5500", "e5500")
1466 .Case("power3", "pwr3")
1467 .Case("power4", "pwr4")
1468 .Case("power5", "pwr5")
1469 .Case("power5x", "pwr5x")
1470 .Case("power6", "pwr6")
1471 .Case("power6x", "pwr6x")
1472 .Case("power7", "pwr7")
1473 .Case("power8", "pwr8")
1474 .Case("pwr3", "pwr3")
1475 .Case("pwr4", "pwr4")
1476 .Case("pwr5", "pwr5")
1477 .Case("pwr5x", "pwr5x")
1478 .Case("pwr6", "pwr6")
1479 .Case("pwr6x", "pwr6x")
1480 .Case("pwr7", "pwr7")
1481 .Case("pwr8", "pwr8")
1482 .Case("powerpc", "ppc")
1483 .Case("powerpc64", "ppc64")
1484 .Case("powerpc64le", "ppc64le")
1485 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001486 }
1487
1488 return "";
1489}
1490
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001491static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1492 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001493 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001494 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001495
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001496 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1497 if (FloatABI == ppc::FloatABI::Soft &&
1498 !(Triple.getArch() == llvm::Triple::ppc64 ||
1499 Triple.getArch() == llvm::Triple::ppc64le))
1500 Features.push_back("+soft-float");
1501 else if (FloatABI == ppc::FloatABI::Soft &&
1502 (Triple.getArch() == llvm::Triple::ppc64 ||
1503 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001504 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001505 << "soft float is not supported for ppc64";
1506
Eric Christopher643bb6a2013-10-16 20:40:08 +00001507 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001508 AddTargetFeature(Args, Features, options::OPT_faltivec,
1509 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001510}
1511
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001512ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1513 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1514 if (Arg *A =
1515 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1516 options::OPT_mfloat_abi_EQ)) {
1517 if (A->getOption().matches(options::OPT_msoft_float))
1518 ABI = ppc::FloatABI::Soft;
1519 else if (A->getOption().matches(options::OPT_mhard_float))
1520 ABI = ppc::FloatABI::Hard;
1521 else {
1522 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1523 .Case("soft", ppc::FloatABI::Soft)
1524 .Case("hard", ppc::FloatABI::Hard)
1525 .Default(ppc::FloatABI::Invalid);
1526 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1527 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1528 ABI = ppc::FloatABI::Hard;
1529 }
1530 }
1531 }
1532
1533 // If unspecified, choose the default based on the platform.
1534 if (ABI == ppc::FloatABI::Invalid) {
1535 ABI = ppc::FloatABI::Hard;
1536 }
1537
1538 return ABI;
1539}
1540
Ulrich Weigand8afad612014-07-28 13:17:52 +00001541void Clang::AddPPCTargetArgs(const ArgList &Args,
1542 ArgStringList &CmdArgs) const {
1543 // Select the ABI to use.
1544 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001545 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001547 case llvm::Triple::ppc64: {
1548 // When targeting a processor that supports QPX, or if QPX is
1549 // specifically enabled, default to using the ABI that supports QPX (so
1550 // long as it is not specifically disabled).
1551 bool HasQPX = false;
1552 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1553 HasQPX = A->getValue() == StringRef("a2q");
1554 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1555 if (HasQPX) {
1556 ABIName = "elfv1-qpx";
1557 break;
1558 }
1559
Ulrich Weigand8afad612014-07-28 13:17:52 +00001560 ABIName = "elfv1";
1561 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001562 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 case llvm::Triple::ppc64le:
1564 ABIName = "elfv2";
1565 break;
1566 default:
1567 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001568 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001569
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001570 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1571 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1572 // the option if given as we don't have backend support for any targets
1573 // that don't use the altivec abi.
1574 if (StringRef(A->getValue()) != "altivec")
1575 ABIName = A->getValue();
1576
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001577 ppc::FloatABI FloatABI =
1578 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1579
1580 if (FloatABI == ppc::FloatABI::Soft) {
1581 // Floating point operations and argument passing are soft.
1582 CmdArgs.push_back("-msoft-float");
1583 CmdArgs.push_back("-mfloat-abi");
1584 CmdArgs.push_back("soft");
1585 } else {
1586 // Floating point operations and argument passing are hard.
1587 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1588 CmdArgs.push_back("-mfloat-abi");
1589 CmdArgs.push_back("hard");
1590 }
1591
Ulrich Weigand8afad612014-07-28 13:17:52 +00001592 if (ABIName) {
1593 CmdArgs.push_back("-target-abi");
1594 CmdArgs.push_back(ABIName);
1595 }
1596}
1597
1598bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1599 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1600 return A && (A->getValue() == StringRef(Value));
1601}
1602
Tom Stellard6674c702013-04-01 20:56:53 +00001603/// Get the (LLVM) name of the R600 gpu we are targeting.
1604static std::string getR600TargetGPU(const ArgList &Args) {
1605 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001606 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001607 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001608 .Cases("rv630", "rv635", "r600")
1609 .Cases("rv610", "rv620", "rs780", "rs880")
1610 .Case("rv740", "rv770")
1611 .Case("palm", "cedar")
1612 .Cases("sumo", "sumo2", "sumo")
1613 .Case("hemlock", "cypress")
1614 .Case("aruba", "cayman")
1615 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001616 }
1617 return "";
1618}
1619
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001620void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001622 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001623 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001624
James Y Knightb2406522015-06-15 20:51:24 +00001625 bool SoftFloatABI = false;
1626 if (Arg *A =
1627 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001628 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001629 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630 }
1631
James Y Knightb2406522015-06-15 20:51:24 +00001632 // Only the hard-float ABI on Sparc is standardized, and it is the
1633 // default. GCC also supports a nonstandard soft-float ABI mode, and
1634 // perhaps LLVM should implement that, too. However, since llvm
1635 // currently does not support Sparc soft-float, at all, display an
1636 // error if it's requested.
1637 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001638 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1639 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001640 }
1641}
1642
Richard Sandiford4652d892013-07-19 16:51:51 +00001643static const char *getSystemZTargetCPU(const ArgList &Args) {
1644 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1645 return A->getValue();
1646 return "z10";
1647}
1648
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001649static void getSystemZTargetFeatures(const ArgList &Args,
1650 std::vector<const char *> &Features) {
1651 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001652 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001653 if (A->getOption().matches(options::OPT_mhtm))
1654 Features.push_back("+transactional-execution");
1655 else
1656 Features.push_back("-transactional-execution");
1657 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001658 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001660 if (A->getOption().matches(options::OPT_mvx))
1661 Features.push_back("+vector");
1662 else
1663 Features.push_back("-vector");
1664 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001665}
1666
Chandler Carruth953fb082013-01-13 11:46:33 +00001667static const char *getX86TargetCPU(const ArgList &Args,
1668 const llvm::Triple &Triple) {
1669 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001670 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001671 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001672 return "core-avx2";
1673
Chandler Carruth953fb082013-01-13 11:46:33 +00001674 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001675 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001676
1677 // FIXME: Reject attempts to use -march=native unless the target matches
1678 // the host.
1679 //
1680 // FIXME: We should also incorporate the detected target features for use
1681 // with -native.
1682 std::string CPU = llvm::sys::getHostCPUName();
1683 if (!CPU.empty() && CPU != "generic")
1684 return Args.MakeArgString(CPU);
1685 }
1686
Reid Kleckner3123eff2015-06-30 16:32:04 +00001687 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1688 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1689 StringRef Arch = A->getValue();
1690 const char *CPU;
1691 if (Triple.getArch() == llvm::Triple::x86) {
1692 CPU = llvm::StringSwitch<const char *>(Arch)
1693 .Case("IA32", "i386")
1694 .Case("SSE", "pentium3")
1695 .Case("SSE2", "pentium4")
1696 .Case("AVX", "sandybridge")
1697 .Case("AVX2", "haswell")
1698 .Default(nullptr);
1699 } else {
1700 CPU = llvm::StringSwitch<const char *>(Arch)
1701 .Case("AVX", "sandybridge")
1702 .Case("AVX2", "haswell")
1703 .Default(nullptr);
1704 }
1705 if (CPU)
1706 return CPU;
1707 }
1708
Chandler Carruth953fb082013-01-13 11:46:33 +00001709 // Select the default CPU if none was given (or detection failed).
1710
1711 if (Triple.getArch() != llvm::Triple::x86_64 &&
1712 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001713 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001714
1715 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1716
1717 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001718 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001719 if (Triple.getArchName() == "x86_64h")
1720 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001721 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001722 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001723
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001724 // Set up default CPU name for PS4 compilers.
1725 if (Triple.isPS4CPU())
1726 return "btver2";
1727
Alexey Bataev286d1b92014-01-31 04:07:13 +00001728 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001729 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001730 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001731
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001732 // Everything else goes to x86-64 in 64-bit mode.
1733 if (Is64Bit)
1734 return "x86-64";
1735
1736 switch (Triple.getOS()) {
1737 case llvm::Triple::FreeBSD:
1738 case llvm::Triple::NetBSD:
1739 case llvm::Triple::OpenBSD:
1740 return "i486";
1741 case llvm::Triple::Haiku:
1742 return "i586";
1743 case llvm::Triple::Bitrig:
1744 return "i686";
1745 default:
1746 // Fallback to p4.
1747 return "pentium4";
1748 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001749}
1750
Dan Gohmanc2853072015-09-03 22:51:53 +00001751/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1752static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1753 // If we have -mcpu=, use that.
1754 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1755 StringRef CPU = A->getValue();
1756
1757#ifdef __wasm__
1758 // Handle "native" by examining the host. "native" isn't meaningful when
1759 // cross compiling, so only support this when the host is also WebAssembly.
1760 if (CPU == "native")
1761 return llvm::sys::getHostCPUName();
1762#endif
1763
1764 return CPU;
1765 }
1766
1767 return "generic";
1768}
1769
Renato Golin7c542b42015-07-27 23:44:45 +00001770static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1771 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001772 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773 default:
1774 return "";
1775
Amara Emerson703da2e2013-10-31 09:32:33 +00001776 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001777 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001778 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001779
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001780 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001781 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001782 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001783 case llvm::Triple::thumbeb: {
1784 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001785 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001786 return arm::getARMTargetCPU(MCPU, MArch, T);
1787 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 case llvm::Triple::mips:
1789 case llvm::Triple::mipsel:
1790 case llvm::Triple::mips64:
1791 case llvm::Triple::mips64el: {
1792 StringRef CPUName;
1793 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001794 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 return CPUName;
1796 }
1797
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001798 case llvm::Triple::nvptx:
1799 case llvm::Triple::nvptx64:
1800 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1801 return A->getValue();
1802 return "";
1803
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001804 case llvm::Triple::ppc:
1805 case llvm::Triple::ppc64:
1806 case llvm::Triple::ppc64le: {
1807 std::string TargetCPUName = getPPCTargetCPU(Args);
1808 // LLVM may default to generating code for the native CPU,
1809 // but, like gcc, we default to a more generic option for
1810 // each architecture. (except on Darwin)
1811 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1812 if (T.getArch() == llvm::Triple::ppc64)
1813 TargetCPUName = "ppc64";
1814 else if (T.getArch() == llvm::Triple::ppc64le)
1815 TargetCPUName = "ppc64le";
1816 else
1817 TargetCPUName = "ppc";
1818 }
1819 return TargetCPUName;
1820 }
1821
1822 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001823 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001824 case llvm::Triple::sparcv9:
1825 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001826 return A->getValue();
1827 return "";
1828
1829 case llvm::Triple::x86:
1830 case llvm::Triple::x86_64:
1831 return getX86TargetCPU(Args, T);
1832
1833 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001834 return "hexagon" +
1835 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001836
1837 case llvm::Triple::systemz:
1838 return getSystemZTargetCPU(Args);
1839
1840 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001841 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001842 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001843
1844 case llvm::Triple::wasm32:
1845 case llvm::Triple::wasm64:
1846 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001847 }
1848}
1849
Alp Tokerce365ca2013-12-02 12:43:03 +00001850static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001851 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001852 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1853 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1854 // forward.
1855 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001856 std::string Plugin =
1857 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001858 CmdArgs.push_back(Args.MakeArgString(Plugin));
1859
1860 // Try to pass driver level flags relevant to LTO code generation down to
1861 // the plugin.
1862
1863 // Handle flags for selecting CPU variants.
1864 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1865 if (!CPU.empty())
1866 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001867
James Molloyf97fdae2015-12-21 10:44:36 +00001868 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1869 StringRef OOpt;
1870 if (A->getOption().matches(options::OPT_O4) ||
1871 A->getOption().matches(options::OPT_Ofast))
1872 OOpt = "3";
1873 else if (A->getOption().matches(options::OPT_O))
1874 OOpt = A->getValue();
1875 else if (A->getOption().matches(options::OPT_O0))
1876 OOpt = "0";
1877 if (!OOpt.empty())
1878 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1879 }
1880
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001881 if (IsThinLTO)
1882 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001883
1884 // If an explicit debugger tuning argument appeared, pass it along.
1885 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1886 options::OPT_ggdbN_Group)) {
1887 if (A->getOption().matches(options::OPT_glldb))
1888 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1889 else if (A->getOption().matches(options::OPT_gsce))
1890 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1891 else
1892 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1893 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001894}
1895
Sanjay Patel2987c292015-06-11 14:53:41 +00001896/// This is a helper function for validating the optional refinement step
1897/// parameter in reciprocal argument strings. Return false if there is an error
1898/// parsing the refinement step. Otherwise, return true and set the Position
1899/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001900static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001902 const char RefinementStepToken = ':';
1903 Position = In.find(RefinementStepToken);
1904 if (Position != StringRef::npos) {
1905 StringRef Option = A.getOption().getName();
1906 StringRef RefStep = In.substr(Position + 1);
1907 // Allow exactly one numeric character for the additional refinement
1908 // step parameter. This is reasonable for all currently-supported
1909 // operations and architectures because we would expect that a larger value
1910 // of refinement steps would cause the estimate "optimization" to
1911 // under-perform the native operation. Also, if the estimate does not
1912 // converge quickly, it probably will not ever converge, so further
1913 // refinement steps will not produce a better answer.
1914 if (RefStep.size() != 1) {
1915 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1916 return false;
1917 }
1918 char RefStepChar = RefStep[0];
1919 if (RefStepChar < '0' || RefStepChar > '9') {
1920 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1921 return false;
1922 }
1923 }
1924 return true;
1925}
1926
1927/// The -mrecip flag requires processing of many optional parameters.
1928static void ParseMRecip(const Driver &D, const ArgList &Args,
1929 ArgStringList &OutStrings) {
1930 StringRef DisabledPrefixIn = "!";
1931 StringRef DisabledPrefixOut = "!";
1932 StringRef EnabledPrefixOut = "";
1933 StringRef Out = "-mrecip=";
1934
1935 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1936 if (!A)
1937 return;
1938
1939 unsigned NumOptions = A->getNumValues();
1940 if (NumOptions == 0) {
1941 // No option is the same as "all".
1942 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1943 return;
1944 }
1945
1946 // Pass through "all", "none", or "default" with an optional refinement step.
1947 if (NumOptions == 1) {
1948 StringRef Val = A->getValue(0);
1949 size_t RefStepLoc;
1950 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1951 return;
1952 StringRef ValBase = Val.slice(0, RefStepLoc);
1953 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1954 OutStrings.push_back(Args.MakeArgString(Out + Val));
1955 return;
1956 }
1957 }
1958
1959 // Each reciprocal type may be enabled or disabled individually.
1960 // Check each input value for validity, concatenate them all back together,
1961 // and pass through.
1962
1963 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001964 OptionStrings.insert(std::make_pair("divd", false));
1965 OptionStrings.insert(std::make_pair("divf", false));
1966 OptionStrings.insert(std::make_pair("vec-divd", false));
1967 OptionStrings.insert(std::make_pair("vec-divf", false));
1968 OptionStrings.insert(std::make_pair("sqrtd", false));
1969 OptionStrings.insert(std::make_pair("sqrtf", false));
1970 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1971 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001972
1973 for (unsigned i = 0; i != NumOptions; ++i) {
1974 StringRef Val = A->getValue(i);
1975
1976 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1977 // Ignore the disablement token for string matching.
1978 if (IsDisabled)
1979 Val = Val.substr(1);
1980
1981 size_t RefStep;
1982 if (!getRefinementStep(Val, D, *A, RefStep))
1983 return;
1984
1985 StringRef ValBase = Val.slice(0, RefStep);
1986 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1987 if (OptionIter == OptionStrings.end()) {
1988 // Try again specifying float suffix.
1989 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1990 if (OptionIter == OptionStrings.end()) {
1991 // The input name did not match any known option string.
1992 D.Diag(diag::err_drv_unknown_argument) << Val;
1993 return;
1994 }
1995 // The option was specified without a float or double suffix.
1996 // Make sure that the double entry was not already specified.
1997 // The float entry will be checked below.
1998 if (OptionStrings[ValBase.str() + 'd']) {
1999 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2000 return;
2001 }
2002 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002003
Sanjay Patel2987c292015-06-11 14:53:41 +00002004 if (OptionIter->second == true) {
2005 // Duplicate option specified.
2006 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2007 return;
2008 }
2009
2010 // Mark the matched option as found. Do not allow duplicate specifiers.
2011 OptionIter->second = true;
2012
2013 // If the precision was not specified, also mark the double entry as found.
2014 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2015 OptionStrings[ValBase.str() + 'd'] = true;
2016
2017 // Build the output string.
2018 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2019 Out = Args.MakeArgString(Out + Prefix + Val);
2020 if (i != NumOptions - 1)
2021 Out = Args.MakeArgString(Out + ",");
2022 }
2023
2024 OutStrings.push_back(Args.MakeArgString(Out));
2025}
2026
Eric Christopherc54920a2015-03-23 19:26:05 +00002027static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002028 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002029 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002030 // If -march=native, autodetect the feature list.
2031 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2032 if (StringRef(A->getValue()) == "native") {
2033 llvm::StringMap<bool> HostFeatures;
2034 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2035 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 Features.push_back(
2037 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002038 }
2039 }
2040
Jim Grosbach82eee262013-11-16 00:53:35 +00002041 if (Triple.getArchName() == "x86_64h") {
2042 // x86_64h implies quite a few of the more modern subtarget features
2043 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2044 Features.push_back("-rdrnd");
2045 Features.push_back("-aes");
2046 Features.push_back("-pclmul");
2047 Features.push_back("-rtm");
2048 Features.push_back("-hle");
2049 Features.push_back("-fsgsbase");
2050 }
2051
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002052 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002053 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002054 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002055 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002056 Features.push_back("+sse4.2");
2057 Features.push_back("+popcnt");
2058 } else
2059 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002060 }
2061
Eric Christopherc54920a2015-03-23 19:26:05 +00002062 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002063 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2064 StringRef Arch = A->getValue();
2065 bool ArchUsed = false;
2066 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002067 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002068 if (Arch == "AVX" || Arch == "AVX2") {
2069 ArchUsed = true;
2070 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2071 }
2072 }
2073 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002074 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002075 if (Arch == "IA32") {
2076 ArchUsed = true;
2077 } else if (Arch == "SSE" || Arch == "SSE2") {
2078 ArchUsed = true;
2079 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2080 }
2081 }
2082 if (!ArchUsed)
2083 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2084 }
2085
Jim Grosbach82eee262013-11-16 00:53:35 +00002086 // Now add any that the user explicitly requested on the command line,
2087 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002088 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002089}
2090
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002091void Clang::AddX86TargetArgs(const ArgList &Args,
2092 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002093 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002094 Args.hasArg(options::OPT_mkernel) ||
2095 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002096 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002097
Bob Wilson2616e2e2013-02-10 16:01:41 +00002098 // Default to avoid implicit floating-point for kernel/kext code, but allow
2099 // that to be overridden with -mno-soft-float.
2100 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2101 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002102 if (Arg *A = Args.getLastArg(
2103 options::OPT_msoft_float, options::OPT_mno_soft_float,
2104 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002105 const Option &O = A->getOption();
2106 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2107 O.matches(options::OPT_msoft_float));
2108 }
2109 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002110 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002111
2112 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2113 StringRef Value = A->getValue();
2114 if (Value == "intel" || Value == "att") {
2115 CmdArgs.push_back("-mllvm");
2116 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2117 } else {
2118 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2119 << A->getOption().getName() << Value;
2120 }
2121 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002122}
2123
Tony Linthicum76329bf2011-12-12 21:14:55 +00002124void Clang::AddHexagonTargetArgs(const ArgList &Args,
2125 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002126 CmdArgs.push_back("-mqdsp6-compat");
2127 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002128
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002129 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2130 std::string N = llvm::utostr(G.getValue());
2131 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002132 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002133 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002134 }
2135
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002136 if (!Args.hasArg(options::OPT_fno_short_enums))
2137 CmdArgs.push_back("-fshort-enums");
2138 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139 CmdArgs.push_back("-mllvm");
2140 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002141 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002142 CmdArgs.push_back("-mllvm");
2143 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002144}
2145
Dan Gohmane3d71e12016-01-07 01:00:21 +00002146void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2147 ArgStringList &CmdArgs) const {
2148 // Default to "hidden" visibility.
2149 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2150 options::OPT_fvisibility_ms_compat)) {
2151 CmdArgs.push_back("-fvisibility");
2152 CmdArgs.push_back("hidden");
2153 }
2154}
2155
Kevin Qin110db6f2014-07-18 07:03:22 +00002156// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002157static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002158 std::vector<const char *> &Features) {
2159 SmallVector<StringRef, 8> Split;
2160 text.split(Split, StringRef("+"), -1, false);
2161
Benjamin Kramer72e64312015-09-24 14:48:49 +00002162 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002163 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002164 .Case("fp", "+fp-armv8")
2165 .Case("simd", "+neon")
2166 .Case("crc", "+crc")
2167 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002168 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002169 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002170 .Case("nofp", "-fp-armv8")
2171 .Case("nosimd", "-neon")
2172 .Case("nocrc", "-crc")
2173 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002174 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002175 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 .Default(nullptr);
2177 if (result)
2178 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002179 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002180 D.Diag(diag::err_drv_no_neon_modifier);
2181 else
2182 return false;
2183 }
2184 return true;
2185}
2186
2187// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2188// decode CPU and feature.
2189static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2190 std::vector<const char *> &Features) {
2191 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2192 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002193 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002194 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2195 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002196 Features.push_back("+neon");
2197 Features.push_back("+crc");
2198 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002199 } else if (CPU == "cyclone") {
2200 Features.push_back("+neon");
2201 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002202 } else if (CPU == "generic") {
2203 Features.push_back("+neon");
2204 } else {
2205 return false;
2206 }
2207
2208 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2209 return false;
2210
2211 return true;
2212}
2213
2214static bool
2215getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2216 const ArgList &Args,
2217 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002218 std::string MarchLowerCase = March.lower();
2219 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002221 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002222 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002224 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002225 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2226 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002227 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002228 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002229 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002230
2231 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2232 return false;
2233
2234 return true;
2235}
2236
2237static bool
2238getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2239 const ArgList &Args,
2240 std::vector<const char *> &Features) {
2241 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002242 std::string McpuLowerCase = Mcpu.lower();
2243 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002244 return false;
2245
2246 return true;
2247}
2248
2249static bool
2250getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2251 const ArgList &Args,
2252 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002253 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002254 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002255 if (MtuneLowerCase == "native")
2256 MtuneLowerCase = llvm::sys::getHostCPUName();
2257 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002258 Features.push_back("+zcm");
2259 Features.push_back("+zcz");
2260 }
2261 return true;
2262}
2263
2264static bool
2265getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2266 const ArgList &Args,
2267 std::vector<const char *> &Features) {
2268 StringRef CPU;
2269 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002270 std::string McpuLowerCase = Mcpu.lower();
2271 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002272 return false;
2273
2274 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2275}
2276
Justin Bognerf9052562015-11-13 23:07:31 +00002277static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002278 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002279 Arg *A;
2280 bool success = true;
2281 // Enable NEON by default.
2282 Features.push_back("+neon");
2283 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2284 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2285 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2286 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002287 else if (Args.hasArg(options::OPT_arch))
2288 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2289 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002290
2291 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2292 success =
2293 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2294 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2295 success =
2296 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002297 else if (Args.hasArg(options::OPT_arch))
2298 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2299 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002300
2301 if (!success)
2302 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002303
2304 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2305 Features.push_back("-fp-armv8");
2306 Features.push_back("-crypto");
2307 Features.push_back("-neon");
2308 }
Bradley Smith418c5932014-05-02 15:17:51 +00002309
2310 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002311 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002312 if (A->getOption().matches(options::OPT_mcrc))
2313 Features.push_back("+crc");
2314 else
2315 Features.push_back("-crc");
2316 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002317
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002318 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2319 options::OPT_munaligned_access))
2320 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2321 Features.push_back("+strict-align");
2322
Justin Bognerf9052562015-11-13 23:07:31 +00002323 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002324 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325}
2326
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002327static void getHexagonTargetFeatures(const ArgList &Args,
2328 std::vector<const char *> &Features) {
2329 bool HasHVX = false, HasHVXD = false;
2330
Eric Christopher49062a52015-12-22 03:12:34 +00002331 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2332 // doing dependent option handling here rather than in initFeatureMap or a
2333 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002334 for (auto &A : Args) {
2335 auto &Opt = A->getOption();
2336 if (Opt.matches(options::OPT_mhexagon_hvx))
2337 HasHVX = true;
2338 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2339 HasHVXD = HasHVX = false;
2340 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2341 HasHVXD = HasHVX = true;
2342 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2343 HasHVXD = false;
2344 else
2345 continue;
2346 A->claim();
2347 }
2348
2349 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2350 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2351}
2352
Dan Gohmanc2853072015-09-03 22:51:53 +00002353static void getWebAssemblyTargetFeatures(const ArgList &Args,
2354 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002355 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002356}
2357
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002358static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002359 const ArgList &Args, ArgStringList &CmdArgs,
2360 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002361 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002362 std::vector<const char *> Features;
2363 switch (Triple.getArch()) {
2364 default:
2365 break;
2366 case llvm::Triple::mips:
2367 case llvm::Triple::mipsel:
2368 case llvm::Triple::mips64:
2369 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002370 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002371 break;
2372
2373 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002374 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002375 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002376 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002377 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002378 break;
2379
2380 case llvm::Triple::ppc:
2381 case llvm::Triple::ppc64:
2382 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002383 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002384 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002385 case llvm::Triple::systemz:
2386 getSystemZTargetFeatures(Args, Features);
2387 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002388 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002389 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002390 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002391 break;
2392 case llvm::Triple::x86:
2393 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002394 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002395 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002396 case llvm::Triple::hexagon:
2397 getHexagonTargetFeatures(Args, Features);
2398 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002399 case llvm::Triple::wasm32:
2400 case llvm::Triple::wasm64:
2401 getWebAssemblyTargetFeatures(Args, Features);
2402 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002403 }
Rafael Espindola43964802013-08-21 17:34:32 +00002404
2405 // Find the last of each feature.
2406 llvm::StringMap<unsigned> LastOpt;
2407 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2408 const char *Name = Features[I];
2409 assert(Name[0] == '-' || Name[0] == '+');
2410 LastOpt[Name + 1] = I;
2411 }
2412
2413 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2414 // If this feature was overridden, ignore it.
2415 const char *Name = Features[I];
2416 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2417 assert(LastI != LastOpt.end());
2418 unsigned Last = LastI->second;
2419 if (Last != I)
2420 continue;
2421
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002422 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002423 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002424 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002425}
2426
David Majnemerae394812014-12-09 00:12:30 +00002427static bool
2428shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2429 const llvm::Triple &Triple) {
2430 // We use the zero-cost exception tables for Objective-C if the non-fragile
2431 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2432 // later.
2433 if (runtime.isNonFragile())
2434 return true;
2435
2436 if (!Triple.isMacOSX())
2437 return false;
2438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002439 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002440 (Triple.getArch() == llvm::Triple::x86_64 ||
2441 Triple.getArch() == llvm::Triple::arm));
2442}
2443
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002444/// Adds exception related arguments to the driver command arguments. There's a
2445/// master flag, -fexceptions and also language specific flags to enable/disable
2446/// C++ and Objective-C exceptions. This makes it possible to for example
2447/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002448static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002449 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002450 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002451 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002452 const Driver &D = TC.getDriver();
2453 const llvm::Triple &Triple = TC.getTriple();
2454
Chad Rosier4fab82c2012-03-26 22:04:46 +00002455 if (KernelOrKext) {
2456 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2457 // arguments now to avoid warnings about unused arguments.
2458 Args.ClaimAllArgs(options::OPT_fexceptions);
2459 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2460 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2461 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2462 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2463 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002464 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002465 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002466
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002467 // See if the user explicitly enabled exceptions.
2468 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2469 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002470
David Majnemerae394812014-12-09 00:12:30 +00002471 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2472 // is not necessarily sensible, but follows GCC.
2473 if (types::isObjC(InputType) &&
2474 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002476 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002477
David Majnemerae394812014-12-09 00:12:30 +00002478 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002479 }
2480
2481 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002482 // Disable C++ EH by default on XCore and PS4.
2483 bool CXXExceptionsEnabled =
2484 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002485 Arg *ExceptionArg = Args.getLastArg(
2486 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2487 options::OPT_fexceptions, options::OPT_fno_exceptions);
2488 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002489 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002490 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2491 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002492
2493 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002494 if (Triple.isPS4CPU()) {
2495 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2496 assert(ExceptionArg &&
2497 "On the PS4 exceptions should only be enabled if passing "
2498 "an argument");
2499 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2500 const Arg *RTTIArg = TC.getRTTIArg();
2501 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2502 D.Diag(diag::err_drv_argument_not_allowed_with)
2503 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2504 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2505 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2506 } else
2507 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2508
Anders Carlssone96ab552011-02-28 02:27:16 +00002509 CmdArgs.push_back("-fcxx-exceptions");
2510
David Majnemer8de68642014-12-05 08:11:58 +00002511 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002512 }
2513 }
2514
David Majnemer8de68642014-12-05 08:11:58 +00002515 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002516 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002517}
2518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002519static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002520 bool Default = true;
2521 if (TC.getTriple().isOSDarwin()) {
2522 // The native darwin assembler doesn't support the linker_option directives,
2523 // so we disable them if we think the .s file will be passed to it.
2524 Default = TC.useIntegratedAs();
2525 }
2526 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2527 Default);
2528}
2529
Ted Kremenek62093662013-03-12 17:02:12 +00002530static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2531 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002532 bool UseDwarfDirectory =
2533 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2534 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002535 return !UseDwarfDirectory;
2536}
2537
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002538/// \brief Check whether the given input tree contains any compilation actions.
2539static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002540 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002541 return true;
2542
Nico Weber5a459f82016-02-23 19:30:43 +00002543 for (const auto &AI : A->inputs())
2544 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002545 return true;
2546
2547 return false;
2548}
2549
2550/// \brief Check if -relax-all should be passed to the internal assembler.
2551/// This is done by default when compiling non-assembler source with -O0.
2552static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2553 bool RelaxDefault = true;
2554
2555 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2556 RelaxDefault = A->getOption().matches(options::OPT_O0);
2557
2558 if (RelaxDefault) {
2559 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002560 for (const auto &Act : C.getActions()) {
2561 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002562 RelaxDefault = true;
2563 break;
2564 }
2565 }
2566 }
2567
2568 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002569 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002570}
2571
Paul Robinson0334a042015-12-19 19:41:48 +00002572// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2573// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002574static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002575 assert(A.getOption().matches(options::OPT_gN_Group) &&
2576 "Not a -g option that specifies a debug-info level");
2577 if (A.getOption().matches(options::OPT_g0) ||
2578 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002579 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002580 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2581 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002582 return codegenoptions::DebugLineTablesOnly;
2583 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002584}
2585
Douglas Katzman3459ce22015-10-08 04:24:12 +00002586// Extract the integer N from a string spelled "-dwarf-N", returning 0
2587// on mismatch. The StringRef input (rather than an Arg) allows
2588// for use by the "-Xassembler" option parser.
2589static unsigned DwarfVersionNum(StringRef ArgValue) {
2590 return llvm::StringSwitch<unsigned>(ArgValue)
2591 .Case("-gdwarf-2", 2)
2592 .Case("-gdwarf-3", 3)
2593 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002594 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002595 .Default(0);
2596}
2597
2598static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002599 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002600 unsigned DwarfVersion,
2601 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002602 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002603 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002604 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2605 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002606 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002607 CmdArgs.push_back("-debug-info-kind=limited");
2608 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002609 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002610 CmdArgs.push_back("-debug-info-kind=standalone");
2611 break;
2612 default:
2613 break;
2614 }
2615 if (DwarfVersion > 0)
2616 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002617 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002618 switch (DebuggerTuning) {
2619 case llvm::DebuggerKind::GDB:
2620 CmdArgs.push_back("-debugger-tuning=gdb");
2621 break;
2622 case llvm::DebuggerKind::LLDB:
2623 CmdArgs.push_back("-debugger-tuning=lldb");
2624 break;
2625 case llvm::DebuggerKind::SCE:
2626 CmdArgs.push_back("-debugger-tuning=sce");
2627 break;
2628 default:
2629 break;
2630 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002631}
2632
David Blaikie9260ed62013-07-25 21:19:01 +00002633static void CollectArgsForIntegratedAssembler(Compilation &C,
2634 const ArgList &Args,
2635 ArgStringList &CmdArgs,
2636 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637 if (UseRelaxAll(C, Args))
2638 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002639
David Majnemer2b9349d2015-12-21 22:09:34 +00002640 // Only default to -mincremental-linker-compatible if we think we are
2641 // targeting the MSVC linker.
2642 bool DefaultIncrementalLinkerCompatible =
2643 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2644 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2645 options::OPT_mno_incremental_linker_compatible,
2646 DefaultIncrementalLinkerCompatible))
2647 CmdArgs.push_back("-mincremental-linker-compatible");
2648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002649 // When passing -I arguments to the assembler we sometimes need to
2650 // unconditionally take the next argument. For example, when parsing
2651 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2652 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2653 // arg after parsing the '-I' arg.
2654 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 // When using an integrated assembler, translate -Wa, and -Xassembler
2657 // options.
2658 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002659 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002660 for (const Arg *A :
2661 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2662 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002663
Benjamin Kramer72e64312015-09-24 14:48:49 +00002664 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002665 if (TakeNextArg) {
2666 CmdArgs.push_back(Value.data());
2667 TakeNextArg = false;
2668 continue;
2669 }
David Blaikie9260ed62013-07-25 21:19:01 +00002670
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002671 switch (C.getDefaultToolChain().getArch()) {
2672 default:
2673 break;
2674 case llvm::Triple::mips:
2675 case llvm::Triple::mipsel:
2676 case llvm::Triple::mips64:
2677 case llvm::Triple::mips64el:
2678 if (Value == "--trap") {
2679 CmdArgs.push_back("-target-feature");
2680 CmdArgs.push_back("+use-tcc-in-div");
2681 continue;
2682 }
2683 if (Value == "--break") {
2684 CmdArgs.push_back("-target-feature");
2685 CmdArgs.push_back("-use-tcc-in-div");
2686 continue;
2687 }
2688 if (Value.startswith("-msoft-float")) {
2689 CmdArgs.push_back("-target-feature");
2690 CmdArgs.push_back("+soft-float");
2691 continue;
2692 }
2693 if (Value.startswith("-mhard-float")) {
2694 CmdArgs.push_back("-target-feature");
2695 CmdArgs.push_back("-soft-float");
2696 continue;
2697 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002698
2699 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2700 .Case("-mips1", "+mips1")
2701 .Case("-mips2", "+mips2")
2702 .Case("-mips3", "+mips3")
2703 .Case("-mips4", "+mips4")
2704 .Case("-mips5", "+mips5")
2705 .Case("-mips32", "+mips32")
2706 .Case("-mips32r2", "+mips32r2")
2707 .Case("-mips32r3", "+mips32r3")
2708 .Case("-mips32r5", "+mips32r5")
2709 .Case("-mips32r6", "+mips32r6")
2710 .Case("-mips64", "+mips64")
2711 .Case("-mips64r2", "+mips64r2")
2712 .Case("-mips64r3", "+mips64r3")
2713 .Case("-mips64r5", "+mips64r5")
2714 .Case("-mips64r6", "+mips64r6")
2715 .Default(nullptr);
2716 if (MipsTargetFeature)
2717 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002718 }
2719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002720 if (Value == "-force_cpusubtype_ALL") {
2721 // Do nothing, this is the default and we don't support anything else.
2722 } else if (Value == "-L") {
2723 CmdArgs.push_back("-msave-temp-labels");
2724 } else if (Value == "--fatal-warnings") {
2725 CmdArgs.push_back("-massembler-fatal-warnings");
2726 } else if (Value == "--noexecstack") {
2727 CmdArgs.push_back("-mnoexecstack");
2728 } else if (Value == "-compress-debug-sections" ||
2729 Value == "--compress-debug-sections") {
2730 CompressDebugSections = true;
2731 } else if (Value == "-nocompress-debug-sections" ||
2732 Value == "--nocompress-debug-sections") {
2733 CompressDebugSections = false;
2734 } else if (Value.startswith("-I")) {
2735 CmdArgs.push_back(Value.data());
2736 // We need to consume the next argument if the current arg is a plain
2737 // -I. The next arg will be the include directory.
2738 if (Value == "-I")
2739 TakeNextArg = true;
2740 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002741 // "-gdwarf-N" options are not cc1as options.
2742 unsigned DwarfVersion = DwarfVersionNum(Value);
2743 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2744 CmdArgs.push_back(Value.data());
2745 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002746 RenderDebugEnablingArgs(Args, CmdArgs,
2747 codegenoptions::LimitedDebugInfo,
2748 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002749 }
Renato Golin7c542b42015-07-27 23:44:45 +00002750 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2751 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2752 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 } else {
2754 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002755 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002756 }
2757 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002758 }
2759 if (CompressDebugSections) {
2760 if (llvm::zlib::isAvailable())
2761 CmdArgs.push_back("-compress-debug-sections");
2762 else
2763 D.Diag(diag::warn_debug_compression_unavailable);
2764 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002765 if (MipsTargetFeature != nullptr) {
2766 CmdArgs.push_back("-target-feature");
2767 CmdArgs.push_back(MipsTargetFeature);
2768 }
David Blaikie9260ed62013-07-25 21:19:01 +00002769}
2770
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002771// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002772// FIXME: Make sure we can also emit shared objects if they're requested
2773// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002774static void addClangRT(const ToolChain &TC, const ArgList &Args,
2775 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002776 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002777}
2778
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002779namespace {
2780enum OpenMPRuntimeKind {
2781 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2782 /// without knowing what runtime to target.
2783 OMPRT_Unknown,
2784
2785 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2786 /// the default for Clang.
2787 OMPRT_OMP,
2788
2789 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2790 /// this runtime but can swallow the pragmas, and find and link against the
2791 /// runtime library itself.
2792 OMPRT_GOMP,
2793
Chandler Carruthc6625c62015-05-28 21:10:31 +00002794 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002795 /// OpenMP runtime. We support this mode for users with existing dependencies
2796 /// on this runtime library name.
2797 OMPRT_IOMP5
2798};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002799}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002800
2801/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002802static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2803 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002804 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2805
2806 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2807 if (A)
2808 RuntimeName = A->getValue();
2809
2810 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002811 .Case("libomp", OMPRT_OMP)
2812 .Case("libgomp", OMPRT_GOMP)
2813 .Case("libiomp5", OMPRT_IOMP5)
2814 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002815
2816 if (RT == OMPRT_Unknown) {
2817 if (A)
2818 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002820 else
2821 // FIXME: We could use a nicer diagnostic here.
2822 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2823 }
2824
2825 return RT;
2826}
2827
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002828static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2829 const ArgList &Args) {
2830 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2831 options::OPT_fno_openmp, false))
2832 return;
2833
2834 switch (getOpenMPRuntime(TC, Args)) {
2835 case OMPRT_OMP:
2836 CmdArgs.push_back("-lomp");
2837 break;
2838 case OMPRT_GOMP:
2839 CmdArgs.push_back("-lgomp");
2840 break;
2841 case OMPRT_IOMP5:
2842 CmdArgs.push_back("-liomp5");
2843 break;
2844 case OMPRT_Unknown:
2845 // Already diagnosed.
2846 break;
2847 }
2848}
2849
Alexey Samsonov52550342014-09-15 19:58:40 +00002850static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2851 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002852 bool IsShared, bool IsWhole) {
2853 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002854 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002855 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002856 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002857 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002858}
2859
Alexey Samsonov52550342014-09-15 19:58:40 +00002860// Tries to use a file with the list of dynamic symbols that need to be exported
2861// from the runtime library. Returns true if the file was found.
2862static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2863 ArgStringList &CmdArgs,
2864 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002865 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002866 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2867 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002868 return true;
2869 }
2870 return false;
2871}
2872
2873static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2874 ArgStringList &CmdArgs) {
2875 // Force linking against the system libraries sanitizers depends on
2876 // (see PR15823 why this is necessary).
2877 CmdArgs.push_back("--no-as-needed");
2878 CmdArgs.push_back("-lpthread");
2879 CmdArgs.push_back("-lrt");
2880 CmdArgs.push_back("-lm");
2881 // There's no libdl on FreeBSD.
2882 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2883 CmdArgs.push_back("-ldl");
2884}
2885
2886static void
2887collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2888 SmallVectorImpl<StringRef> &SharedRuntimes,
2889 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002890 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2891 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2892 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002893 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2894 // Collect shared runtimes.
2895 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2896 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002897 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002898 // The stats_client library is also statically linked into DSOs.
2899 if (SanArgs.needsStatsRt())
2900 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002901
Alexey Samsonov52550342014-09-15 19:58:40 +00002902 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002903 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002904 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002905 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002906 }
2907 if (SanArgs.needsAsanRt()) {
2908 if (SanArgs.needsSharedAsanRt()) {
2909 HelperStaticRuntimes.push_back("asan-preinit");
2910 } else {
2911 StaticRuntimes.push_back("asan");
2912 if (SanArgs.linkCXXRuntimes())
2913 StaticRuntimes.push_back("asan_cxx");
2914 }
2915 }
2916 if (SanArgs.needsDfsanRt())
2917 StaticRuntimes.push_back("dfsan");
2918 if (SanArgs.needsLsanRt())
2919 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002920 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002921 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002922 if (SanArgs.linkCXXRuntimes())
2923 StaticRuntimes.push_back("msan_cxx");
2924 }
2925 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002926 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002927 if (SanArgs.linkCXXRuntimes())
2928 StaticRuntimes.push_back("tsan_cxx");
2929 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002930 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002931 StaticRuntimes.push_back("ubsan_standalone");
2932 if (SanArgs.linkCXXRuntimes())
2933 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002934 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002935 if (SanArgs.needsSafeStackRt())
2936 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002937 if (SanArgs.needsCfiRt())
2938 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002939 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002940 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002941 if (SanArgs.linkCXXRuntimes())
2942 StaticRuntimes.push_back("ubsan_standalone_cxx");
2943 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002944 if (SanArgs.needsStatsRt()) {
2945 NonWholeStaticRuntimes.push_back("stats");
2946 RequiredSymbols.push_back("__sanitizer_stats_register");
2947 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002948}
2949
Alexey Samsonov52550342014-09-15 19:58:40 +00002950// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2951// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2952static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002953 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002954 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002955 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002956 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002957 NonWholeStaticRuntimes, HelperStaticRuntimes,
2958 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002959 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002960 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002962 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002963 bool AddExportDynamic = false;
2964 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002965 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002966 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2967 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002968 for (auto RT : NonWholeStaticRuntimes) {
2969 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2970 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2971 }
2972 for (auto S : RequiredSymbols) {
2973 CmdArgs.push_back("-u");
2974 CmdArgs.push_back(Args.MakeArgString(S));
2975 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002976 // If there is a static runtime with no dynamic list, force all the symbols
2977 // to be dynamic to be sure we export sanitizer interface functions.
2978 if (AddExportDynamic)
2979 CmdArgs.push_back("-export-dynamic");
2980 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002981}
2982
Reid Kleckner86ea7702015-02-04 23:45:07 +00002983static bool areOptimizationsEnabled(const ArgList &Args) {
2984 // Find the last -O arg and see if it is non-zero.
2985 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2986 return !A->getOption().matches(options::OPT_O0);
2987 // Defaults to -O0.
2988 return false;
2989}
2990
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002991static bool shouldUseFramePointerForTarget(const ArgList &Args,
2992 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002993 switch (Triple.getArch()) {
2994 case llvm::Triple::xcore:
2995 case llvm::Triple::wasm32:
2996 case llvm::Triple::wasm64:
2997 // XCore never wants frame pointers, regardless of OS.
2998 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002999 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003000 default:
3001 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003002 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003003
3004 if (Triple.isOSLinux()) {
3005 switch (Triple.getArch()) {
3006 // Don't use a frame pointer on linux if optimizing for certain targets.
3007 case llvm::Triple::mips64:
3008 case llvm::Triple::mips64el:
3009 case llvm::Triple::mips:
3010 case llvm::Triple::mipsel:
3011 case llvm::Triple::systemz:
3012 case llvm::Triple::x86:
3013 case llvm::Triple::x86_64:
3014 return !areOptimizationsEnabled(Args);
3015 default:
3016 return true;
3017 }
3018 }
3019
3020 if (Triple.isOSWindows()) {
3021 switch (Triple.getArch()) {
3022 case llvm::Triple::x86:
3023 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003024 case llvm::Triple::x86_64:
3025 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003026 case llvm::Triple::arm:
3027 case llvm::Triple::thumb:
3028 // Windows on ARM builds with FPO disabled to aid fast stack walking
3029 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003030 default:
3031 // All other supported Windows ISAs use xdata unwind information, so frame
3032 // pointers are not generally useful.
3033 return false;
3034 }
3035 }
3036
3037 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003038}
3039
Rafael Espindola224dd632011-12-14 21:02:23 +00003040static bool shouldUseFramePointer(const ArgList &Args,
3041 const llvm::Triple &Triple) {
3042 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3043 options::OPT_fomit_frame_pointer))
3044 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003045 if (Args.hasArg(options::OPT_pg))
3046 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003047
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003048 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003049}
3050
Eric Christopherb7d97e92013-04-03 01:58:53 +00003051static bool shouldUseLeafFramePointer(const ArgList &Args,
3052 const llvm::Triple &Triple) {
3053 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3054 options::OPT_momit_leaf_frame_pointer))
3055 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003056 if (Args.hasArg(options::OPT_pg))
3057 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003058
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003059 if (Triple.isPS4CPU())
3060 return false;
3061
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003062 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003063}
3064
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003065/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003066static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003067 SmallString<128> cwd;
3068 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003069 CmdArgs.push_back("-fdebug-compilation-dir");
3070 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003071 }
3072}
3073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003074static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003075 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3076 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3077 SmallString<128> T(FinalOutput->getValue());
3078 llvm::sys::path::replace_extension(T, "dwo");
3079 return Args.MakeArgString(T);
3080 } else {
3081 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003082 SmallString<128> T(
3083 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003084 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003085 llvm::sys::path::replace_extension(F, "dwo");
3086 T += F;
3087 return Args.MakeArgString(F);
3088 }
3089}
3090
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003091static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3092 const JobAction &JA, const ArgList &Args,
3093 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003094 ArgStringList ExtractArgs;
3095 ExtractArgs.push_back("--extract-dwo");
3096
3097 ArgStringList StripArgs;
3098 StripArgs.push_back("--strip-dwo");
3099
3100 // Grabbing the output of the earlier compile step.
3101 StripArgs.push_back(Output.getFilename());
3102 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003103 ExtractArgs.push_back(OutFile);
3104
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003106 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003107
3108 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003109 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003110
3111 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003112 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003113}
3114
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003115/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003116/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3117static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003118 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003119 if (A->getOption().matches(options::OPT_O4) ||
3120 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003121 return true;
3122
3123 if (A->getOption().matches(options::OPT_O0))
3124 return false;
3125
3126 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3127
Rafael Espindola91780de2013-08-26 14:05:41 +00003128 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003129 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003130 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003131 return true;
3132
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003133 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003134 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003135 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003136
3137 unsigned OptLevel = 0;
3138 if (S.getAsInteger(10, OptLevel))
3139 return false;
3140
3141 return OptLevel > 1;
3142 }
3143
3144 return false;
3145}
3146
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003147/// Add -x lang to \p CmdArgs for \p Input.
3148static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3149 ArgStringList &CmdArgs) {
3150 // When using -verify-pch, we don't want to provide the type
3151 // 'precompiled-header' if it was inferred from the file extension
3152 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3153 return;
3154
3155 CmdArgs.push_back("-x");
3156 if (Args.hasArg(options::OPT_rewrite_objc))
3157 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3158 else
3159 CmdArgs.push_back(types::getTypeName(Input.getType()));
3160}
3161
David Majnemerc371ff02015-03-22 08:39:22 +00003162static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003163 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003164 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003165
3166 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003167 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003168
3169 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003171 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003172 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003173}
3174
Rafael Espindola577637a2015-01-03 00:06:04 +00003175// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003176// options that build systems might add but are unused when assembling or only
3177// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003178static void claimNoWarnArgs(const ArgList &Args) {
3179 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003180 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003181 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003182 Args.ClaimAllArgs(options::OPT_flto);
3183 Args.ClaimAllArgs(options::OPT_fno_lto);
3184}
3185
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003186static void appendUserToPath(SmallVectorImpl<char> &Result) {
3187#ifdef LLVM_ON_UNIX
3188 const char *Username = getenv("LOGNAME");
3189#else
3190 const char *Username = getenv("USERNAME");
3191#endif
3192 if (Username) {
3193 // Validate that LoginName can be used in a path, and get its length.
3194 size_t Len = 0;
3195 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003196 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003197 Username = nullptr;
3198 break;
3199 }
3200 }
3201
3202 if (Username && Len > 0) {
3203 Result.append(Username, Username + Len);
3204 return;
3205 }
3206 }
3207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003208// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003209#ifdef LLVM_ON_UNIX
3210 std::string UID = llvm::utostr(getuid());
3211#else
3212 // FIXME: Windows seems to have an 'SID' that might work.
3213 std::string UID = "9999";
3214#endif
3215 Result.append(UID.begin(), UID.end());
3216}
3217
David Majnemere11d3732015-06-08 00:22:46 +00003218VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3219 const llvm::Triple &Triple,
3220 const llvm::opt::ArgList &Args,
3221 bool IsWindowsMSVC) {
3222 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3223 IsWindowsMSVC) ||
3224 Args.hasArg(options::OPT_fmsc_version) ||
3225 Args.hasArg(options::OPT_fms_compatibility_version)) {
3226 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3227 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003228 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003229
3230 if (MSCVersion && MSCompatibilityVersion) {
3231 if (D)
3232 D->Diag(diag::err_drv_argument_not_allowed_with)
3233 << MSCVersion->getAsString(Args)
3234 << MSCompatibilityVersion->getAsString(Args);
3235 return VersionTuple();
3236 }
3237
3238 if (MSCompatibilityVersion) {
3239 VersionTuple MSVT;
3240 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3241 D->Diag(diag::err_drv_invalid_value)
3242 << MSCompatibilityVersion->getAsString(Args)
3243 << MSCompatibilityVersion->getValue();
3244 return MSVT;
3245 }
3246
3247 if (MSCVersion) {
3248 unsigned Version = 0;
3249 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3250 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3251 << MSCVersion->getValue();
3252 return getMSCompatibilityVersion(Version);
3253 }
3254
3255 unsigned Major, Minor, Micro;
3256 Triple.getEnvironmentVersion(Major, Minor, Micro);
3257 if (Major || Minor || Micro)
3258 return VersionTuple(Major, Minor, Micro);
3259
3260 return VersionTuple(18);
3261 }
3262 return VersionTuple();
3263}
3264
Diego Novilloa0545962015-07-10 18:00:07 +00003265static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3266 const InputInfo &Output, const ArgList &Args,
3267 ArgStringList &CmdArgs) {
3268 auto *ProfileGenerateArg = Args.getLastArg(
3269 options::OPT_fprofile_instr_generate,
3270 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003271 options::OPT_fprofile_generate_EQ,
3272 options::OPT_fno_profile_instr_generate);
3273 if (ProfileGenerateArg &&
3274 ProfileGenerateArg->getOption().matches(
3275 options::OPT_fno_profile_instr_generate))
3276 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003277
3278 auto *ProfileUseArg = Args.getLastArg(
3279 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003280 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3281 options::OPT_fno_profile_instr_use);
3282 if (ProfileUseArg &&
3283 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3284 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003285
3286 if (ProfileGenerateArg && ProfileUseArg)
3287 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003288 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003289
Diego Novillo758f3f52015-08-05 21:49:51 +00003290 if (ProfileGenerateArg) {
3291 if (ProfileGenerateArg->getOption().matches(
3292 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003293 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3294 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003295 else if (ProfileGenerateArg->getOption().matches(
3296 options::OPT_fprofile_generate_EQ)) {
3297 SmallString<128> Path(ProfileGenerateArg->getValue());
3298 llvm::sys::path::append(Path, "default.profraw");
3299 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003300 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3301 }
3302 // The default is to use Clang Instrumentation.
3303 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003304 }
Diego Novilloa0545962015-07-10 18:00:07 +00003305
Diego Novillo758f3f52015-08-05 21:49:51 +00003306 if (ProfileUseArg) {
3307 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003308 CmdArgs.push_back(Args.MakeArgString(
3309 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003310 else if ((ProfileUseArg->getOption().matches(
3311 options::OPT_fprofile_use_EQ) ||
3312 ProfileUseArg->getOption().matches(
3313 options::OPT_fprofile_instr_use))) {
3314 SmallString<128> Path(
3315 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3316 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3317 llvm::sys::path::append(Path, "default.profdata");
3318 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003319 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003320 }
Diego Novilloa0545962015-07-10 18:00:07 +00003321 }
3322
3323 if (Args.hasArg(options::OPT_ftest_coverage) ||
3324 Args.hasArg(options::OPT_coverage))
3325 CmdArgs.push_back("-femit-coverage-notes");
3326 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3327 false) ||
3328 Args.hasArg(options::OPT_coverage))
3329 CmdArgs.push_back("-femit-coverage-data");
3330
Diego Novilloc4b94da2015-08-05 23:27:40 +00003331 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3332 options::OPT_fno_coverage_mapping, false) &&
3333 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003334 D.Diag(diag::err_drv_argument_only_allowed_with)
3335 << "-fcoverage-mapping"
3336 << "-fprofile-instr-generate";
3337
Diego Novilloc4b94da2015-08-05 23:27:40 +00003338 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3339 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003340 CmdArgs.push_back("-fcoverage-mapping");
3341
3342 if (C.getArgs().hasArg(options::OPT_c) ||
3343 C.getArgs().hasArg(options::OPT_S)) {
3344 if (Output.isFilename()) {
3345 CmdArgs.push_back("-coverage-file");
3346 SmallString<128> CoverageFilename;
3347 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3348 CoverageFilename = FinalOutput->getValue();
3349 } else {
3350 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3351 }
3352 if (llvm::sys::path::is_relative(CoverageFilename)) {
3353 SmallString<128> Pwd;
3354 if (!llvm::sys::fs::current_path(Pwd)) {
3355 llvm::sys::path::append(Pwd, CoverageFilename);
3356 CoverageFilename.swap(Pwd);
3357 }
3358 }
3359 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3360 }
3361 }
3362}
3363
Paul Robinsond083b9a2015-12-16 17:25:27 +00003364static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3365 ArgStringList &CmdArgs) {
3366 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3367 false) ||
3368 Args.hasFlag(options::OPT_fprofile_generate,
3369 options::OPT_fno_profile_instr_generate, false) ||
3370 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3371 options::OPT_fno_profile_instr_generate, false) ||
3372 Args.hasFlag(options::OPT_fprofile_instr_generate,
3373 options::OPT_fno_profile_instr_generate, false) ||
3374 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3375 options::OPT_fno_profile_instr_generate, false) ||
3376 Args.hasArg(options::OPT_fcreate_profile) ||
3377 Args.hasArg(options::OPT_coverage)))
3378 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3379}
3380
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003381/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3382/// smooshes them together with platform defaults, to decide whether
3383/// this compile should be using PIC mode or not. Returns a tuple of
3384/// (RelocationModel, PICLevel, IsPIE).
3385static std::tuple<llvm::Reloc::Model, unsigned, bool>
3386ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3387 const ArgList &Args) {
3388 // FIXME: why does this code...and so much everywhere else, use both
3389 // ToolChain.getTriple() and Triple?
3390 bool PIE = ToolChain.isPIEDefault();
3391 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003392 // The Darwin/MachO default to use PIC does not apply when using -static.
3393 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3394 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003395 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003396 bool IsPICLevelTwo = PIC;
3397
3398 bool KernelOrKext =
3399 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3400
3401 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003402 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003403 switch (ToolChain.getArch()) {
3404 case llvm::Triple::arm:
3405 case llvm::Triple::armeb:
3406 case llvm::Triple::thumb:
3407 case llvm::Triple::thumbeb:
3408 case llvm::Triple::aarch64:
3409 case llvm::Triple::mips:
3410 case llvm::Triple::mipsel:
3411 case llvm::Triple::mips64:
3412 case llvm::Triple::mips64el:
3413 PIC = true; // "-fpic"
3414 break;
3415
3416 case llvm::Triple::x86:
3417 case llvm::Triple::x86_64:
3418 PIC = true; // "-fPIC"
3419 IsPICLevelTwo = true;
3420 break;
3421
3422 default:
3423 break;
3424 }
3425 }
3426
3427 // OpenBSD-specific defaults for PIE
3428 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3429 switch (ToolChain.getArch()) {
3430 case llvm::Triple::mips64:
3431 case llvm::Triple::mips64el:
3432 case llvm::Triple::sparcel:
3433 case llvm::Triple::x86:
3434 case llvm::Triple::x86_64:
3435 IsPICLevelTwo = false; // "-fpie"
3436 break;
3437
3438 case llvm::Triple::ppc:
3439 case llvm::Triple::sparc:
3440 case llvm::Triple::sparcv9:
3441 IsPICLevelTwo = true; // "-fPIE"
3442 break;
3443
3444 default:
3445 break;
3446 }
3447 }
3448
3449 // The last argument relating to either PIC or PIE wins, and no
3450 // other argument is used. If the last argument is any flavor of the
3451 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3452 // option implicitly enables PIC at the same level.
3453 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3454 options::OPT_fpic, options::OPT_fno_pic,
3455 options::OPT_fPIE, options::OPT_fno_PIE,
3456 options::OPT_fpie, options::OPT_fno_pie);
3457 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3458 // is forced, then neither PIC nor PIE flags will have no effect.
3459 if (!ToolChain.isPICDefaultForced()) {
3460 if (LastPICArg) {
3461 Option O = LastPICArg->getOption();
3462 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3463 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3464 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3465 PIC =
3466 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3467 IsPICLevelTwo =
3468 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3469 } else {
3470 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003471 if (Triple.isPS4CPU()) {
3472 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3473 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3474 if (Model != "kernel") {
3475 PIC = true;
3476 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3477 << LastPICArg->getSpelling();
3478 }
3479 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003480 }
3481 }
3482 }
3483
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003484 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3485 // PIC level would've been set to level 1, force it back to level 2 PIC
3486 // instead.
3487 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003488 IsPICLevelTwo |= ToolChain.isPICDefault();
3489
James Y Knightc4015d32015-08-21 04:14:55 +00003490 // This kernel flags are a trump-card: they will disable PIC/PIE
3491 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003492 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3493 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003494 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003495
3496 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3497 // This is a very special mode. It trumps the other modes, almost no one
3498 // uses it, and it isn't even valid on any OS but Darwin.
3499 if (!ToolChain.getTriple().isOSDarwin())
3500 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3501 << A->getSpelling() << ToolChain.getTriple().str();
3502
3503 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3504
3505 // Only a forced PIC mode can cause the actual compile to have PIC defines
3506 // etc., no flags are sufficient. This behavior was selected to closely
3507 // match that of llvm-gcc and Apple GCC before that.
3508 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3509
3510 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3511 }
3512
3513 if (PIC)
3514 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3515
3516 return std::make_tuple(llvm::Reloc::Static, 0, false);
3517}
3518
3519static const char *RelocationModelName(llvm::Reloc::Model Model) {
3520 switch (Model) {
3521 case llvm::Reloc::Default:
3522 return nullptr;
3523 case llvm::Reloc::Static:
3524 return "static";
3525 case llvm::Reloc::PIC_:
3526 return "pic";
3527 case llvm::Reloc::DynamicNoPIC:
3528 return "dynamic-no-pic";
3529 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003530 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003531}
3532
3533static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3534 ArgStringList &CmdArgs) {
3535 llvm::Reloc::Model RelocationModel;
3536 unsigned PICLevel;
3537 bool IsPIE;
3538 std::tie(RelocationModel, PICLevel, IsPIE) =
3539 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3540
3541 if (RelocationModel != llvm::Reloc::Static)
3542 CmdArgs.push_back("-KPIC");
3543}
3544
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003545void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546 const InputInfo &Output, const InputInfoList &Inputs,
3547 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003548 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3549 const llvm::Triple Triple(TripleStr);
3550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003551 bool KernelOrKext =
3552 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003553 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003554 ArgStringList CmdArgs;
3555
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003556 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003557 bool IsWindowsCygnus =
3558 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003559 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003560 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003561
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003562 // Check number of inputs for sanity. We need at least one input.
3563 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003564 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003565 // CUDA compilation may have multiple inputs (source file + results of
3566 // device-side compilations). All other jobs are expected to have exactly one
3567 // input.
3568 bool IsCuda = types::isCuda(Input.getType());
3569 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003570
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003571 // Invoke ourselves in -cc1 mode.
3572 //
3573 // FIXME: Implement custom jobs for internal actions.
3574 CmdArgs.push_back("-cc1");
3575
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003576 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003577 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003578 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003579
Artem Belevichfa11ab52015-11-17 22:28:46 +00003580 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003581 if (IsCuda) {
3582 // FIXME: We need a (better) way to pass information about
3583 // particular compilation pass we're constructing here. For now we
3584 // can check which toolchain we're using and pick the other one to
3585 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003586 if (&getToolChain() == C.getCudaDeviceToolChain())
3587 AuxToolChain = C.getCudaHostToolChain();
3588 else if (&getToolChain() == C.getCudaHostToolChain())
3589 AuxToolChain = C.getCudaDeviceToolChain();
3590 else
3591 llvm_unreachable("Can't figure out CUDA compilation mode.");
3592 assert(AuxToolChain != nullptr && "No aux toolchain.");
3593 CmdArgs.push_back("-aux-triple");
3594 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003595 CmdArgs.push_back("-fcuda-target-overloads");
3596 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003597 }
3598
James Y Knight2db38f32015-08-15 03:45:25 +00003599 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3600 Triple.getArch() == llvm::Triple::thumb)) {
3601 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003602 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003603 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003604 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003605 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003606 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003607 }
3608
Tim Northover336f1892014-03-29 13:16:12 +00003609 // Push all default warning arguments that are specific to
3610 // the given target. These come before user provided warning options
3611 // are provided.
3612 getToolChain().addClangWarningOptions(CmdArgs);
3613
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003614 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003615 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003616
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003617 if (isa<AnalyzeJobAction>(JA)) {
3618 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3619 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003620 } else if (isa<MigrateJobAction>(JA)) {
3621 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003622 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003623 if (Output.getType() == types::TY_Dependencies)
3624 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003625 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003626 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003627 if (Args.hasArg(options::OPT_rewrite_objc) &&
3628 !Args.hasArg(options::OPT_g_Group))
3629 CmdArgs.push_back("-P");
3630 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003631 } else if (isa<AssembleJobAction>(JA)) {
3632 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003633
David Blaikie9260ed62013-07-25 21:19:01 +00003634 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003635
3636 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003637 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003638 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003639 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003640 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003641
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003642 if (JA.getType() == types::TY_Nothing)
3643 CmdArgs.push_back("-fsyntax-only");
3644 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003645 CmdArgs.push_back("-emit-pch");
3646 else
3647 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003648 } else if (isa<VerifyPCHJobAction>(JA)) {
3649 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003650 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003651 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3652 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003654 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003655 } else if (JA.getType() == types::TY_LLVM_IR ||
3656 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003657 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003658 } else if (JA.getType() == types::TY_LLVM_BC ||
3659 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003660 CmdArgs.push_back("-emit-llvm-bc");
3661 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003662 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003663 } else if (JA.getType() == types::TY_AST) {
3664 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003665 } else if (JA.getType() == types::TY_ModuleFile) {
3666 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003667 } else if (JA.getType() == types::TY_RewrittenObjC) {
3668 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003669 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003670 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3671 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003672 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003673 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003674 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003675 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003676
3677 // Preserve use-list order by default when emitting bitcode, so that
3678 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3679 // same result as running passes here. For LTO, we don't need to preserve
3680 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003681 if (JA.getType() == types::TY_LLVM_BC)
3682 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003683
3684 if (D.isUsingLTO())
3685 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003686 }
3687
Teresa Johnsonaff22322015-12-07 19:21:34 +00003688 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3689 if (!types::isLLVMIR(Input.getType()))
3690 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3691 << "-x ir";
3692 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3693 }
3694
Steven Wu574b0f22016-03-01 01:07:58 +00003695 // Embed-bitcode option.
3696 if (C.getDriver().embedBitcodeEnabled() &&
3697 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3698 // Add flags implied by -fembed-bitcode.
3699 CmdArgs.push_back("-fembed-bitcode");
3700 // Disable all llvm IR level optimizations.
3701 CmdArgs.push_back("-disable-llvm-optzns");
3702 }
3703 if (C.getDriver().embedBitcodeMarkerOnly())
3704 CmdArgs.push_back("-fembed-bitcode-marker");
3705
Justin Bognera88f0122014-06-20 22:59:50 +00003706 // We normally speed up the clang process a bit by skipping destructors at
3707 // exit, but when we're generating diagnostics we can rely on some of the
3708 // cleanup.
3709 if (!C.isForDiagnostics())
3710 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003712// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003713#ifdef NDEBUG
3714 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003715 // Discard LLVM value names in -asserts builds.
3716 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003717#endif
3718
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003719 // Set the main file name, so that debug info works even with
3720 // -save-temps.
3721 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003722 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003723
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003724 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003725 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003726 if (Args.hasArg(options::OPT_static))
3727 CmdArgs.push_back("-static-define");
3728
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003729 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003730 // Enable region store model by default.
3731 CmdArgs.push_back("-analyzer-store=region");
3732
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003733 // Treat blocks as analysis entry points.
3734 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3735
Ted Kremenek49c79792011-03-24 00:28:47 +00003736 CmdArgs.push_back("-analyzer-eagerly-assume");
3737
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003738 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003739 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003740 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003741
Devin Coughlin65c77082016-01-21 20:09:49 +00003742 if (!IsWindowsMSVC) {
3743 CmdArgs.push_back("-analyzer-checker=unix");
3744 } else {
3745 // Enable "unix" checkers that also work on Windows.
3746 CmdArgs.push_back("-analyzer-checker=unix.API");
3747 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3748 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3749 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3750 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3751 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3752 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003753
Sean Evesonb38c32b2016-01-06 10:03:58 +00003754 // Disable some unix checkers for PS4.
3755 if (IsPS4CPU) {
3756 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3757 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3758 }
3759
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003760 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003761 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003763 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003764
Artem Belevichba558952015-05-06 18:20:23 +00003765 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003766 CmdArgs.push_back("-analyzer-checker=cplusplus");
3767
Sean Evesonb38c32b2016-01-06 10:03:58 +00003768 if (!IsPS4CPU) {
3769 CmdArgs.push_back(
3770 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3771 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3772 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3773 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3774 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3776 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003777
3778 // Default nullability checks.
3779 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3780 CmdArgs.push_back(
3781 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003782 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003783
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003784 // Set the output format. The default is plist, for (lame) historical
3785 // reasons.
3786 CmdArgs.push_back("-analyzer-output");
3787 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003788 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003789 else
3790 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003791
Ted Kremenekfe449a22010-03-22 22:32:05 +00003792 // Disable the presentation of standard compiler warnings when
3793 // using --analyze. We only want to show static analyzer diagnostics
3794 // or frontend errors.
3795 CmdArgs.push_back("-w");
3796
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003797 // Add -Xanalyzer arguments when running as analyzer.
3798 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003799 }
3800
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003801 CheckCodeGenerationOptions(D, Args);
3802
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003803 llvm::Reloc::Model RelocationModel;
3804 unsigned PICLevel;
3805 bool IsPIE;
3806 std::tie(RelocationModel, PICLevel, IsPIE) =
3807 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003808
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003809 const char *RMName = RelocationModelName(RelocationModel);
3810 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003811 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003812 CmdArgs.push_back(RMName);
3813 }
3814 if (PICLevel > 0) {
3815 CmdArgs.push_back("-pic-level");
3816 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3817 if (IsPIE) {
3818 CmdArgs.push_back("-pie-level");
3819 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003820 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003821 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003822
Renato Golin4854d802015-11-09 12:40:41 +00003823 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3824 CmdArgs.push_back("-meabi");
3825 CmdArgs.push_back(A->getValue());
3826 }
3827
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003828 CmdArgs.push_back("-mthread-model");
3829 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3830 CmdArgs.push_back(A->getValue());
3831 else
3832 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3833
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003834 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3835
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003836 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3837 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003838 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003839
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003840 // LLVM Code Generator Options.
3841
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003842 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3843 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003844 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3845 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003846 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003847 CmdArgs.push_back(A->getValue());
3848 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003849 }
3850 }
3851
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003852 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3853 StringRef v = A->getValue();
3854 CmdArgs.push_back("-mllvm");
3855 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3856 A->claim();
3857 }
3858
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003859 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3860 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003861 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003862 }
3863
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003864 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3865 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003866 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003867 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003868 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003869 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3870 CmdArgs.push_back("-fpcc-struct-return");
3871 } else {
3872 assert(A->getOption().matches(options::OPT_freg_struct_return));
3873 CmdArgs.push_back("-freg-struct-return");
3874 }
3875 }
3876
Roman Divacky65b88cd2011-03-01 17:40:53 +00003877 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3878 CmdArgs.push_back("-mrtd");
3879
Rafael Espindola224dd632011-12-14 21:02:23 +00003880 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003881 CmdArgs.push_back("-mdisable-fp-elim");
3882 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3883 options::OPT_fno_zero_initialized_in_bss))
3884 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003885
3886 bool OFastEnabled = isOptimizationLevelFast(Args);
3887 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3888 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003889 OptSpecifier StrictAliasingAliasOption =
3890 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003891 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3892 // doesn't do any TBAA.
3893 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003894 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003895 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003896 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003897 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3898 options::OPT_fno_struct_path_tbaa))
3899 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003900 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3901 false))
3902 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003903 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3904 options::OPT_fno_strict_vtable_pointers,
3905 false))
3906 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003907 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3908 options::OPT_fno_optimize_sibling_calls))
3909 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003910
Eric Christopher006208c2013-04-04 06:29:47 +00003911 // Handle segmented stacks.
3912 if (Args.hasArg(options::OPT_fsplit_stack))
3913 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003914
3915 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3916 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003917 OptSpecifier FastMathAliasOption =
3918 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3919
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003920 // Handle various floating point optimization flags, mapping them to the
3921 // appropriate LLVM code generation flags. The pattern for all of these is to
3922 // default off the codegen optimizations, and if any flag enables them and no
3923 // flag disables them after the flag enabling them, enable the codegen
3924 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003925 if (Arg *A = Args.getLastArg(
3926 options::OPT_ffast_math, FastMathAliasOption,
3927 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3928 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3929 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003930 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3931 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003932 A->getOption().getID() != options::OPT_fhonor_infinities)
3933 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003934 if (Arg *A = Args.getLastArg(
3935 options::OPT_ffast_math, FastMathAliasOption,
3936 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3937 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3938 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003939 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3940 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003941 A->getOption().getID() != options::OPT_fhonor_nans)
3942 CmdArgs.push_back("-menable-no-nans");
3943
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003944 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3945 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003946 if (Arg *A =
3947 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3948 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3949 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003950 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3951 // However, turning *off* -ffast_math merely restores the toolchain default
3952 // (which may be false).
3953 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3954 A->getOption().getID() == options::OPT_ffast_math ||
3955 A->getOption().getID() == options::OPT_Ofast)
3956 MathErrno = false;
3957 else if (A->getOption().getID() == options::OPT_fmath_errno)
3958 MathErrno = true;
3959 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003960 if (MathErrno)
3961 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003962
3963 // There are several flags which require disabling very specific
3964 // optimizations. Any of these being disabled forces us to turn off the
3965 // entire set of LLVM optimizations, so collect them through all the flag
3966 // madness.
3967 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003968 if (Arg *A = Args.getLastArg(
3969 options::OPT_ffast_math, FastMathAliasOption,
3970 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3971 options::OPT_fno_unsafe_math_optimizations,
3972 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003973 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3974 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003975 A->getOption().getID() != options::OPT_fno_associative_math)
3976 AssociativeMath = true;
3977 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003978 if (Arg *A = Args.getLastArg(
3979 options::OPT_ffast_math, FastMathAliasOption,
3980 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3981 options::OPT_fno_unsafe_math_optimizations,
3982 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003983 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3984 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003985 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3986 ReciprocalMath = true;
3987 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003988 if (Arg *A = Args.getLastArg(
3989 options::OPT_ffast_math, FastMathAliasOption,
3990 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3991 options::OPT_fno_unsafe_math_optimizations,
3992 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003993 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3994 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003995 A->getOption().getID() != options::OPT_fsigned_zeros)
3996 SignedZeros = false;
3997 bool TrappingMath = true;
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_funsafe_math_optimizations,
4001 options::OPT_fno_unsafe_math_optimizations,
4002 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004003 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4004 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004005 A->getOption().getID() != options::OPT_ftrapping_math)
4006 TrappingMath = false;
4007 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4008 !TrappingMath)
4009 CmdArgs.push_back("-menable-unsafe-fp-math");
4010
Sanjay Patel76c9e092015-01-23 16:40:50 +00004011 if (!SignedZeros)
4012 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004013
Sanjay Patel359b1052015-04-09 15:03:23 +00004014 if (ReciprocalMath)
4015 CmdArgs.push_back("-freciprocal-math");
4016
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004017 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004018 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004019 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004020 options::OPT_ffp_contract)) {
4021 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004022 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004023 if (Val == "fast" || Val == "on" || Val == "off") {
4024 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4025 } else {
4026 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004028 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004029 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4030 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004031 // If fast-math is set then set the fp-contract mode to fast.
4032 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4033 }
4034 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004035
Sanjay Patel2987c292015-06-11 14:53:41 +00004036 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004037
Bob Wilson6a039162012-07-19 03:52:53 +00004038 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4039 // and if we find them, tell the frontend to provide the appropriate
4040 // preprocessor macros. This is distinct from enabling any optimizations as
4041 // these options induce language changes which must survive serialization
4042 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004043 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4044 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004045 if (!A->getOption().matches(options::OPT_fno_fast_math))
4046 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004047 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4048 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004049 if (A->getOption().matches(options::OPT_ffinite_math_only))
4050 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004051
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004052 // Decide whether to use verbose asm. Verbose assembly is the default on
4053 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004054 bool IsIntegratedAssemblerDefault =
4055 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004056 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004057 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004058 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004059 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004060
Rafael Espindolab8a12932015-05-22 20:44:03 +00004061 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4062 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004063 CmdArgs.push_back("-no-integrated-as");
4064
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004065 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4066 CmdArgs.push_back("-mdebug-pass");
4067 CmdArgs.push_back("Structure");
4068 }
4069 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4070 CmdArgs.push_back("-mdebug-pass");
4071 CmdArgs.push_back("Arguments");
4072 }
4073
Justin Lebar710a35f2016-01-25 22:36:35 +00004074 // Enable -mconstructor-aliases except on darwin, where we have to work around
4075 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4076 // aliases aren't supported.
4077 if (!getToolChain().getTriple().isOSDarwin() &&
4078 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004079 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004080
John McCall7ef5cb32011-03-18 02:56:14 +00004081 // Darwin's kernel doesn't support guard variables; just die if we
4082 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004083 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004084 CmdArgs.push_back("-fforbid-guard-variables");
4085
Akira Hatanaka02028482015-11-12 17:21:22 +00004086 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4087 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004088 CmdArgs.push_back("-mms-bitfields");
4089 }
John McCall8517abc2010-02-19 02:45:38 +00004090
Daniel Dunbar306945d2009-09-16 06:17:29 +00004091 // This is a coarse approximation of what llvm-gcc actually does, both
4092 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4093 // complicated ways.
4094 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004095 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4096 options::OPT_fno_asynchronous_unwind_tables,
4097 (getToolChain().IsUnwindTablesDefault() ||
4098 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4099 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004100 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4101 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004102 CmdArgs.push_back("-munwind-tables");
4103
Chandler Carruth05fb5852012-11-21 23:40:23 +00004104 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004105
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004106 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4107 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004108 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004109 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004110
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004111 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004112 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004113
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004114 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004115 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004116 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004117 }
4118
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004119 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004120 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004121 if (!CPU.empty()) {
4122 CmdArgs.push_back("-target-cpu");
4123 CmdArgs.push_back(Args.MakeArgString(CPU));
4124 }
4125
Rafael Espindolaeb265472013-08-21 21:59:03 +00004126 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4127 CmdArgs.push_back("-mfpmath");
4128 CmdArgs.push_back(A->getValue());
4129 }
4130
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004131 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004132 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004133
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004134 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004135 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004136 default:
4137 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004138
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004139 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004140 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004141 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004142 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004143 // Use the effective triple, which takes into account the deployment target.
4144 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004145 break;
4146
Tim Northover573cbee2014-05-24 12:52:07 +00004147 case llvm::Triple::aarch64:
4148 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004149 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004150 break;
4151
Eric Christopher0b26a612010-03-02 02:41:08 +00004152 case llvm::Triple::mips:
4153 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004154 case llvm::Triple::mips64:
4155 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004156 AddMIPSTargetArgs(Args, CmdArgs);
4157 break;
4158
Ulrich Weigand8afad612014-07-28 13:17:52 +00004159 case llvm::Triple::ppc:
4160 case llvm::Triple::ppc64:
4161 case llvm::Triple::ppc64le:
4162 AddPPCTargetArgs(Args, CmdArgs);
4163 break;
4164
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004165 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004166 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004167 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004168 AddSparcTargetArgs(Args, CmdArgs);
4169 break;
4170
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004171 case llvm::Triple::x86:
4172 case llvm::Triple::x86_64:
4173 AddX86TargetArgs(Args, CmdArgs);
4174 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004175
4176 case llvm::Triple::hexagon:
4177 AddHexagonTargetArgs(Args, CmdArgs);
4178 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004179
4180 case llvm::Triple::wasm32:
4181 case llvm::Triple::wasm64:
4182 AddWebAssemblyTargetArgs(Args, CmdArgs);
4183 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004184 }
4185
Douglas Katzman3459ce22015-10-08 04:24:12 +00004186 // The 'g' groups options involve a somewhat intricate sequence of decisions
4187 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004188 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004189 // * what level of debug info to generate
4190 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004191 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004192 // This avoids having to monkey around further in cc1 other than to disable
4193 // codeview if not running in a Windows environment. Perhaps even that
4194 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004195 unsigned DwarfVersion = 0;
4196 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4197 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004198 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004199 bool EmitCodeView = false;
4200
Hans Wennborg75958c42013-08-08 00:17:41 +00004201 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004202 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004203 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004204 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004205
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004206 // Pass the linker version in use.
4207 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4208 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004209 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004210 }
4211
Eric Christopherb7d97e92013-04-03 01:58:53 +00004212 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004213 CmdArgs.push_back("-momit-leaf-frame-pointer");
4214
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004215 // Explicitly error on some things we know we don't support and can't just
4216 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004217 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4218 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004219 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004220 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004221 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4222 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004223 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004224 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004225 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004226 }
4227
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004228 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004229 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004230 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004231 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004232 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4233 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004234 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004235 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004236 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004237
Chad Rosierbe10f982011-08-02 17:58:04 +00004238 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004239 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004240 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4241 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004242 }
4243
Rafael Espindola08a692a2010-03-07 04:46:18 +00004244 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004245 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004246 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004247 // If the last option explicitly specified a debug-info level, use it.
4248 if (A->getOption().matches(options::OPT_gN_Group)) {
4249 DebugInfoKind = DebugLevelToInfoKind(*A);
4250 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4251 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4252 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004253 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004254 A->getIndex() > SplitDwarfArg->getIndex())
4255 SplitDwarfArg = nullptr;
4256 } else
4257 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004258 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004259 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004260
Paul Robinson0334a042015-12-19 19:41:48 +00004261 // If a debugger tuning argument appeared, remember it.
4262 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4263 options::OPT_ggdbN_Group)) {
4264 if (A->getOption().matches(options::OPT_glldb))
4265 DebuggerTuning = llvm::DebuggerKind::LLDB;
4266 else if (A->getOption().matches(options::OPT_gsce))
4267 DebuggerTuning = llvm::DebuggerKind::SCE;
4268 else
4269 DebuggerTuning = llvm::DebuggerKind::GDB;
4270 }
4271
4272 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004273 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004274 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004275 DwarfVersion = DwarfVersionNum(A->getSpelling());
4276
Reid Kleckner124955a2015-08-05 18:51:13 +00004277 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004278 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4279 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4280 // DwarfVersion remains at 0 if no explicit choice was made.
4281 CmdArgs.push_back("-gcodeview");
4282 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004283 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004284 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4285 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004286
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004287 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4288 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004289
4290 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004291 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004292 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004293 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004294
Eric Christopher138c32b2013-09-13 22:37:55 +00004295 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004296 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004297 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004298 CmdArgs.push_back("-dwarf-ext-refs");
4299 CmdArgs.push_back("-fmodule-format=obj");
4300 }
4301
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004302 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4303 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004304 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004305 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004306 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004307 CmdArgs.push_back("-backend-option");
4308 CmdArgs.push_back("-split-dwarf=Enable");
4309 }
4310
Douglas Katzman3459ce22015-10-08 04:24:12 +00004311 // After we've dealt with all combinations of things that could
4312 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4313 // figure out if we need to "upgrade" it to standalone debug info.
4314 // We parse these two '-f' options whether or not they will be used,
4315 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4316 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4317 options::OPT_fno_standalone_debug,
4318 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004319 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4320 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004321 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4322 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004323
Eric Christopher138c32b2013-09-13 22:37:55 +00004324 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4325 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4326 CmdArgs.push_back("-backend-option");
4327 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4328 }
Eric Christophereec89c22013-06-18 00:03:50 +00004329
Eric Christopher0d403d22014-02-14 01:27:03 +00004330 // -gdwarf-aranges turns on the emission of the aranges section in the
4331 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004332 // Always enabled on the PS4.
4333 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004334 CmdArgs.push_back("-backend-option");
4335 CmdArgs.push_back("-generate-arange-section");
4336 }
4337
David Blaikief36d9ba2014-01-27 18:52:43 +00004338 if (Args.hasFlag(options::OPT_fdebug_types_section,
4339 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004340 CmdArgs.push_back("-backend-option");
4341 CmdArgs.push_back("-generate-type-units");
4342 }
Eric Christophereec89c22013-06-18 00:03:50 +00004343
Dan Gohmana5b804b2016-01-07 00:50:27 +00004344 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4345 // default.
4346 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4347 Triple.getArch() == llvm::Triple::wasm32 ||
4348 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004349
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004350 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004351 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004352 CmdArgs.push_back("-ffunction-sections");
4353 }
4354
Peter Collingbourneceef1452016-02-24 22:03:06 +00004355 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4356 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004357 if (!D.isUsingLTO())
4358 D.Diag(diag::err_drv_argument_only_allowed_with)
4359 << "-fwhole-program-vtables"
4360 << "-flto";
4361 CmdArgs.push_back("-fwhole-program-vtables");
4362
4363 clang::SmallString<64> Path(D.ResourceDir);
4364 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4365 if (llvm::sys::fs::exists(Path)) {
4366 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4367 BlacklistOpt += Path.str();
4368 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4369 }
4370
4371 for (const Arg *A :
4372 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4373 A->claim();
4374 if (!llvm::sys::fs::exists(A->getValue()))
4375 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4376 }
4377
4378 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4379 }
4380
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004381 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4382 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004383 CmdArgs.push_back("-fdata-sections");
4384 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004385
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004386 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004387 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004388 CmdArgs.push_back("-fno-unique-section-names");
4389
Chris Lattner3c77a352010-06-22 00:03:40 +00004390 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4391
Diego Novilloa0545962015-07-10 18:00:07 +00004392 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004393
Paul Robinsond083b9a2015-12-16 17:25:27 +00004394 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4395 if (getToolChain().getTriple().isPS4CPU())
4396 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4397
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004398 // Pass options for controlling the default header search paths.
4399 if (Args.hasArg(options::OPT_nostdinc)) {
4400 CmdArgs.push_back("-nostdsysteminc");
4401 CmdArgs.push_back("-nobuiltininc");
4402 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004403 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004404 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004405 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4406 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4407 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004408
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004409 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004410 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004411 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004412
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004413 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4414
Ted Kremenekf7639e12012-03-06 20:06:33 +00004415 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004416 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004417 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004418 options::OPT_ccc_arcmt_modify,
4419 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004420 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004421 switch (A->getOption().getID()) {
4422 default:
4423 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004424 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004425 CmdArgs.push_back("-arcmt-check");
4426 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004427 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004428 CmdArgs.push_back("-arcmt-modify");
4429 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004430 case options::OPT_ccc_arcmt_migrate:
4431 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004432 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004433 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004434
4435 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4436 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004437 break;
John McCalld70fb982011-06-15 23:25:17 +00004438 }
4439 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004440 } else {
4441 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4442 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4443 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004444 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004445
Ted Kremenekf7639e12012-03-06 20:06:33 +00004446 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4447 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004448 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4449 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004450 }
4451 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004452 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004453
4454 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004455 options::OPT_objcmt_migrate_subscripting,
4456 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004457 // None specified, means enable them all.
4458 CmdArgs.push_back("-objcmt-migrate-literals");
4459 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004460 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004461 } else {
4462 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4463 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004464 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004465 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004466 } else {
4467 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4468 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4469 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4470 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4471 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4472 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004473 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004474 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4475 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4476 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4477 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4478 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4479 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4480 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004481 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004482 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004483 }
4484
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004485 // Add preprocessing options like -I, -D, etc. if we are using the
4486 // preprocessor.
4487 //
4488 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004489 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004490 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4491 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004492
Rafael Espindolaa7431922011-07-21 23:40:37 +00004493 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4494 // that "The compiler can only warn and ignore the option if not recognized".
4495 // When building with ccache, it will pass -D options to clang even on
4496 // preprocessed inputs and configure concludes that -fPIC is not supported.
4497 Args.ClaimAllArgs(options::OPT_D);
4498
Alp Toker7874bdc2013-11-15 20:40:58 +00004499 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004500 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4501 if (A->getOption().matches(options::OPT_O4)) {
4502 CmdArgs.push_back("-O3");
4503 D.Diag(diag::warn_O4_is_O3);
4504 } else {
4505 A->render(Args, CmdArgs);
4506 }
4507 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004508
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004509 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004510 for (const Arg *A :
4511 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4512 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004513 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004514 }
4515
Rafael Espindola577637a2015-01-03 00:06:04 +00004516 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004517
Richard Smith3be1cb22014-08-07 00:24:21 +00004518 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004519 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004520 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4521 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004522 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004523 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004524
4525 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004526 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004527 //
4528 // If a std is supplied, only add -trigraphs if it follows the
4529 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004530 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004531 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4532 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004533 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004534 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004535 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004536 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004537 else
4538 Std->render(Args, CmdArgs);
4539
Nico Weber00721502014-12-23 22:32:37 +00004540 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004541 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004542 options::OPT_ftrigraphs,
4543 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004544 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004545 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004546 } else {
4547 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004548 //
4549 // FIXME: Clang doesn't correctly handle -std= when the input language
4550 // doesn't match. For the time being just ignore this for C++ inputs;
4551 // eventually we want to do all the standard defaulting here instead of
4552 // splitting it between the driver and clang -cc1.
4553 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004554 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4555 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004556 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004557 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004558
Nico Weber00721502014-12-23 22:32:37 +00004559 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4560 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004561 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004562
Richard Smith282b4492013-09-04 22:50:31 +00004563 // GCC's behavior for -Wwrite-strings is a bit strange:
4564 // * In C, this "warning flag" changes the types of string literals from
4565 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4566 // for the discarded qualifier.
4567 // * In C++, this is just a normal warning flag.
4568 //
4569 // Implementing this warning correctly in C is hard, so we follow GCC's
4570 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4571 // a non-const char* in C, rather than using this crude hack.
4572 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004573 // FIXME: This should behave just like a warning flag, and thus should also
4574 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4575 Arg *WriteStrings =
4576 Args.getLastArg(options::OPT_Wwrite_strings,
4577 options::OPT_Wno_write_strings, options::OPT_w);
4578 if (WriteStrings &&
4579 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004580 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004581 }
4582
Chandler Carruth61fbf622011-04-23 09:27:53 +00004583 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004584 // during C++ compilation, which it is by default. GCC keeps this define even
4585 // in the presence of '-w', match this behavior bug-for-bug.
4586 if (types::isCXX(InputType) &&
4587 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4588 true)) {
4589 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004590 }
4591
Chandler Carruthe0391482010-05-22 02:21:53 +00004592 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4593 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4594 if (Asm->getOption().matches(options::OPT_fasm))
4595 CmdArgs.push_back("-fgnu-keywords");
4596 else
4597 CmdArgs.push_back("-fno-gnu-keywords");
4598 }
4599
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004600 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4601 CmdArgs.push_back("-fno-dwarf-directory-asm");
4602
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004603 if (ShouldDisableAutolink(Args, getToolChain()))
4604 CmdArgs.push_back("-fno-autolink");
4605
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004606 // Add in -fdebug-compilation-dir if necessary.
4607 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004608
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004609 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4610 StringRef Map = A->getValue();
4611 if (Map.find('=') == StringRef::npos)
4612 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4613 else
4614 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4615 A->claim();
4616 }
4617
Richard Smith9a568822011-11-21 19:36:32 +00004618 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4619 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004620 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004621 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004622 }
4623
Richard Smith79c927b2013-11-06 19:31:51 +00004624 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4625 CmdArgs.push_back("-foperator-arrow-depth");
4626 CmdArgs.push_back(A->getValue());
4627 }
4628
Richard Smith9a568822011-11-21 19:36:32 +00004629 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4630 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004631 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004632 }
4633
Richard Smitha3d3bd22013-05-08 02:12:03 +00004634 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4635 CmdArgs.push_back("-fconstexpr-steps");
4636 CmdArgs.push_back(A->getValue());
4637 }
4638
Richard Smithb3a14522013-02-22 01:59:51 +00004639 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4640 CmdArgs.push_back("-fbracket-depth");
4641 CmdArgs.push_back(A->getValue());
4642 }
4643
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004644 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4645 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004646 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004647 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004648 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4649 } else
4650 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004651 }
4652
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004653 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004654 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004655
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004656 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4657 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004658 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004659 }
David Chisnall5778fce2009-08-31 16:41:57 +00004660
Chris Lattnere23003d2010-01-09 21:54:33 +00004661 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4662 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004663 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004664 }
4665
Chris Lattnerb35583d2010-04-07 20:49:23 +00004666 CmdArgs.push_back("-ferror-limit");
4667 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004668 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004669 else
4670 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004671
Chandler Carrutha77a7272010-05-06 04:55:18 +00004672 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4673 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004674 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004675 }
4676
4677 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4678 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004679 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004680 }
4681
Richard Smithf6f003a2011-12-16 19:06:07 +00004682 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4683 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004684 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004685 }
4686
Nick Lewycky24653262014-12-16 21:39:02 +00004687 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4688 CmdArgs.push_back("-fspell-checking-limit");
4689 CmdArgs.push_back(A->getValue());
4690 }
4691
Daniel Dunbar2c978472009-11-04 06:24:47 +00004692 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004693 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004694 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004695 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004696 } else {
4697 // If -fmessage-length=N was not specified, determine whether this is a
4698 // terminal and, if so, implicitly define -fmessage-length appropriately.
4699 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004700 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004701 }
4702
John McCallb4a99d32013-02-19 01:57:35 +00004703 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4704 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4705 options::OPT_fvisibility_ms_compat)) {
4706 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4707 CmdArgs.push_back("-fvisibility");
4708 CmdArgs.push_back(A->getValue());
4709 } else {
4710 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4711 CmdArgs.push_back("-fvisibility");
4712 CmdArgs.push_back("hidden");
4713 CmdArgs.push_back("-ftype-visibility");
4714 CmdArgs.push_back("default");
4715 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004716 }
4717
Douglas Gregor08329632010-06-15 17:05:35 +00004718 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004719
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004720 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4721
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004722 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004723 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4724 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004725 CmdArgs.push_back("-ffreestanding");
4726
Daniel Dunbare357d562009-12-03 18:42:11 +00004727 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004728 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004729 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004730 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004731 // Emulated TLS is enabled by default on Android, and can be enabled manually
4732 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004733 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004734 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4735 EmulatedTLSDefault))
4736 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004737 // AltiVec-like language extensions aren't relevant for assembling.
4738 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004739 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004740 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4741 }
Richard Trieu91844232012-06-26 18:18:47 +00004742 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4743 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004744
Alexey Bataevdb390212015-05-20 04:24:19 +00004745 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004746 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4747 options::OPT_fno_openmp, false))
4748 switch (getOpenMPRuntime(getToolChain(), Args)) {
4749 case OMPRT_OMP:
4750 case OMPRT_IOMP5:
4751 // Clang can generate useful OpenMP code for these two runtime libraries.
4752 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004753
4754 // If no option regarding the use of TLS in OpenMP codegeneration is
4755 // given, decide a default based on the target. Otherwise rely on the
4756 // options and pass the right information to the frontend.
4757 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004758 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004759 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004760 break;
4761 default:
4762 // By default, if Clang doesn't know how to generate useful OpenMP code
4763 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4764 // down to the actual compilation.
4765 // FIXME: It would be better to have a mode which *only* omits IR
4766 // generation based on the OpenMP support so that we get consistent
4767 // semantic analysis, etc.
4768 break;
4769 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004770
Peter Collingbourne32701642013-11-01 18:16:25 +00004771 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004772 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004773
Eric Christopher459d2712013-02-19 06:16:53 +00004774 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004775 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4776 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4777 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4778 Arch == llvm::Triple::ppc64le))
4779 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4780 << "ppc/ppc64/ppc64le";
4781 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004782
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004783 // -fzvector is incompatible with -faltivec.
4784 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4785 if (Args.hasArg(options::OPT_faltivec))
4786 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4787 << "-faltivec";
4788
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004789 if (getToolChain().SupportsProfiling())
4790 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004791
4792 // -flax-vector-conversions is default.
4793 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4794 options::OPT_fno_lax_vector_conversions))
4795 CmdArgs.push_back("-fno-lax-vector-conversions");
4796
John Brawna7b4ec02015-08-10 11:11:28 +00004797 if (Args.getLastArg(options::OPT_fapple_kext) ||
4798 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004799 CmdArgs.push_back("-fapple-kext");
4800
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004801 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004802 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004803 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004804 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4805 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004806
4807 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4808 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004809 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004810 }
4811
Bob Wilson14adb362012-02-03 06:27:22 +00004812 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004813
Chandler Carruth6e501032011-03-27 00:04:55 +00004814 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4815 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004816 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004817 if (A->getOption().matches(options::OPT_fwrapv))
4818 CmdArgs.push_back("-fwrapv");
4819 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4820 options::OPT_fno_strict_overflow)) {
4821 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4822 CmdArgs.push_back("-fwrapv");
4823 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004824
4825 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4826 options::OPT_fno_reroll_loops))
4827 if (A->getOption().matches(options::OPT_freroll_loops))
4828 CmdArgs.push_back("-freroll-loops");
4829
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004830 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004831 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4832 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004833
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004834 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4835
Daniel Dunbar4930e332009-11-17 08:07:36 +00004836 // -stack-protector=0 is default.
4837 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004838 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4839 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4840 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4841 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4842 Args.ClaimAllArgs(options::OPT_fstack_protector);
4843 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004844 options::OPT_fstack_protector_all,
4845 options::OPT_fstack_protector_strong,
4846 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004847 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004848 StackProtectorLevel = std::max<unsigned>(
4849 LangOptions::SSPOn,
4850 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004851 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004852 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004853 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004854 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004855 } else {
4856 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004858 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004859 if (StackProtectorLevel) {
4860 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004861 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004862 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004863
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004864 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004865 for (const Arg *A : Args.filtered(options::OPT__param)) {
4866 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004867 if (Str.startswith("ssp-buffer-size=")) {
4868 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004869 CmdArgs.push_back("-stack-protector-buffer-size");
4870 // FIXME: Verify the argument is a valid integer.
4871 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004872 }
Sean Silva14facf32015-06-09 01:57:17 +00004873 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004874 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004875 }
4876
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004877 // Translate -mstackrealign
4878 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004879 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004880 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004881
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004882 if (Args.hasArg(options::OPT_mstack_alignment)) {
4883 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4884 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004885 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004886
Hans Wennborg77dc2362015-01-20 19:45:50 +00004887 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4888 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4889
4890 if (!Size.empty())
4891 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4892 else
4893 CmdArgs.push_back("-mstack-probe-size=0");
4894 }
4895
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004896 switch (getToolChain().getArch()) {
4897 case llvm::Triple::aarch64:
4898 case llvm::Triple::aarch64_be:
4899 case llvm::Triple::arm:
4900 case llvm::Triple::armeb:
4901 case llvm::Triple::thumb:
4902 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004903 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004904 break;
4905
4906 default:
4907 break;
4908 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004909
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004910 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4911 options::OPT_mno_restrict_it)) {
4912 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4913 CmdArgs.push_back("-backend-option");
4914 CmdArgs.push_back("-arm-restrict-it");
4915 } else {
4916 CmdArgs.push_back("-backend-option");
4917 CmdArgs.push_back("-arm-no-restrict-it");
4918 }
James Y Knight2db38f32015-08-15 03:45:25 +00004919 } else if (Triple.isOSWindows() &&
4920 (Triple.getArch() == llvm::Triple::arm ||
4921 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004922 // Windows on ARM expects restricted IT blocks
4923 CmdArgs.push_back("-backend-option");
4924 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004925 }
4926
Daniel Dunbard18049a2009-04-07 21:16:11 +00004927 // Forward -f options with positive and negative forms; we translate
4928 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004929 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4930 StringRef fname = A->getValue();
4931 if (!llvm::sys::fs::exists(fname))
4932 D.Diag(diag::err_drv_no_such_file) << fname;
4933 else
4934 A->render(Args, CmdArgs);
4935 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004936
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004937 // -fbuiltin is default unless -mkernel is used.
4938 bool UseBuiltins =
4939 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4940 !Args.hasArg(options::OPT_mkernel));
4941 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004942 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004943
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004944 // -ffreestanding implies -fno-builtin.
4945 if (Args.hasArg(options::OPT_ffreestanding))
4946 UseBuiltins = false;
4947
4948 // Process the -fno-builtin-* options.
4949 for (const auto &Arg : Args) {
4950 const Option &O = Arg->getOption();
4951 if (!O.matches(options::OPT_fno_builtin_))
4952 continue;
4953
4954 Arg->claim();
4955 // If -fno-builtin is specified, then there's no need to pass the option to
4956 // the frontend.
4957 if (!UseBuiltins)
4958 continue;
4959
4960 StringRef FuncName = Arg->getValue();
4961 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4962 }
4963
Nuno Lopes13c88c72009-12-16 16:59:22 +00004964 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4965 options::OPT_fno_assume_sane_operator_new))
4966 CmdArgs.push_back("-fno-assume-sane-operator-new");
4967
Daniel Dunbar4930e332009-11-17 08:07:36 +00004968 // -fblocks=0 is default.
4969 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004970 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004971 (Args.hasArg(options::OPT_fgnu_runtime) &&
4972 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4973 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004974 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004976 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004977 !getToolChain().hasBlocksRuntime())
4978 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004979 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004980
Richard Smith47972af2015-06-16 00:08:24 +00004981 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004982 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004983 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004984 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004985 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004986 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4987 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004988 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004989 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004990 HaveModules = true;
4991 }
4992 }
4993
Richard Smith47972af2015-06-16 00:08:24 +00004994 // -fmodule-maps enables implicit reading of module map files. By default,
4995 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004996 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4997 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004998 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004999 }
5000
Daniel Jasperac42b752013-10-21 06:34:34 +00005001 // -fmodules-decluse checks that modules used are declared so (off by
5002 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005003 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005004 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005005 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005006 }
5007
Daniel Jasper962b38e2014-04-11 11:47:45 +00005008 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5009 // all #included headers are part of modules.
5010 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005011 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005012 CmdArgs.push_back("-fmodules-strict-decluse");
5013 }
5014
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005015 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5016 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5017 options::OPT_fno_implicit_modules)) {
5018 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005019 } else if (HaveModules) {
5020 // -fmodule-cache-path specifies where our implicitly-built module files
5021 // should be written.
5022 SmallString<128> Path;
5023 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5024 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005025 if (C.isForDiagnostics()) {
5026 // When generating crash reports, we want to emit the modules along with
5027 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005028 Path = Output.getFilename();
5029 llvm::sys::path::replace_extension(Path, ".cache");
5030 llvm::sys::path::append(Path, "modules");
5031 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005032 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005033 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005034 llvm::sys::path::append(Path, "org.llvm.clang.");
5035 appendUserToPath(Path);
5036 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005037 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005038 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005039 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5040 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005041 }
5042
Richard Smith8d83d6d2016-03-21 19:06:06 +00005043 // -fmodule-name specifies the module that is currently being built (or
5044 // used for header checking by -fmodule-maps).
5045 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5046
5047 // -fmodule-map-file can be used to specify files containing module
5048 // definitions.
5049 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5050
5051 // -fmodule-file can be used to specify files containing precompiled modules.
5052 if (HaveModules)
5053 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5054 else
5055 Args.ClaimAllArgs(options::OPT_fmodule_file);
5056
Justin Bognera88f0122014-06-20 22:59:50 +00005057 // When building modules and generating crashdumps, we need to dump a module
5058 // dependency VFS alongside the output.
5059 if (HaveModules && C.isForDiagnostics()) {
5060 SmallString<128> VFSDir(Output.getFilename());
5061 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005062 // Add the cache directory as a temp so the crash diagnostics pick it up.
5063 C.addTempFile(Args.MakeArgString(VFSDir));
5064
Justin Bognera88f0122014-06-20 22:59:50 +00005065 llvm::sys::path::append(VFSDir, "vfs");
5066 CmdArgs.push_back("-module-dependency-dir");
5067 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005068 }
5069
Richard Smith9887d792014-10-17 01:42:53 +00005070 if (HaveModules)
5071 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005072
Douglas Gregor35b04d62013-02-07 19:01:24 +00005073 // Pass through all -fmodules-ignore-macro arguments.
5074 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005075 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5076 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005077
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005078 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5079
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005080 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5081 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5082 D.Diag(diag::err_drv_argument_not_allowed_with)
5083 << A->getAsString(Args) << "-fbuild-session-timestamp";
5084
5085 llvm::sys::fs::file_status Status;
5086 if (llvm::sys::fs::status(A->getValue(), Status))
5087 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005088 CmdArgs.push_back(Args.MakeArgString(
5089 "-fbuild-session-timestamp=" +
5090 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005091 }
5092
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005093 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005094 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5095 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005096 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5097
5098 Args.AddLastArg(CmdArgs,
5099 options::OPT_fmodules_validate_once_per_build_session);
5100 }
5101
Ben Langmuirdcf73862014-03-12 00:06:17 +00005102 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5103
John McCalldfea9982010-04-09 19:12:06 +00005104 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005105 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005106 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005107 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005108
Anders Carlssond470fef2010-11-21 00:09:52 +00005109 // -felide-constructors is the default.
5110 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005111 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005112 CmdArgs.push_back("-fno-elide-constructors");
5113
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005114 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005115
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005116 if (KernelOrKext || (types::isCXX(InputType) &&
5117 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5118 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005119 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005120
Tony Linthicum76329bf2011-12-12 21:14:55 +00005121 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005122 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5123 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005124 CmdArgs.push_back("-fshort-enums");
5125
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005126 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005127 if (Arg *A = Args.getLastArg(
5128 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5129 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5130 if (A->getOption().matches(options::OPT_funsigned_char) ||
5131 A->getOption().matches(options::OPT_fno_signed_char)) {
5132 CmdArgs.push_back("-fno-signed-char");
5133 }
5134 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005135 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005136 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005137
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005138 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005139 if (!Args.hasFlag(
5140 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5141 !IsWindowsCygnus && !IsWindowsGNU &&
5142 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5143 getToolChain().getArch() != llvm::Triple::hexagon &&
5144 getToolChain().getArch() != llvm::Triple::xcore &&
5145 ((getToolChain().getTriple().getVendor() !=
5146 llvm::Triple::MipsTechnologies) ||
5147 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005148 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005149 CmdArgs.push_back("-fno-use-cxa-atexit");
5150
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005151 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005152 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005153 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005154 CmdArgs.push_back("-fms-extensions");
5155
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005156 // -fno-use-line-directives is default.
5157 if (Args.hasFlag(options::OPT_fuse_line_directives,
5158 options::OPT_fno_use_line_directives, false))
5159 CmdArgs.push_back("-fuse-line-directives");
5160
Francois Pichet1b4f1632011-09-17 04:32:15 +00005161 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005162 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005163 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 (IsWindowsMSVC &&
5165 Args.hasFlag(options::OPT_fms_extensions,
5166 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005167 CmdArgs.push_back("-fms-compatibility");
5168
David Majnemerc371ff02015-03-22 08:39:22 +00005169 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005170 VersionTuple MSVT = visualstudio::getMSVCVersion(
5171 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5172 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005173 CmdArgs.push_back(
5174 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005175
David Majnemer8db91762015-05-18 04:49:30 +00005176 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5177 if (ImplyVCPPCXXVer) {
5178 if (IsMSVC2015Compatible)
5179 CmdArgs.push_back("-std=c++14");
5180 else
5181 CmdArgs.push_back("-std=c++11");
5182 }
5183
Eric Christopher5ecce122013-02-18 00:38:31 +00005184 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005185 if (Args.hasFlag(options::OPT_fborland_extensions,
5186 options::OPT_fno_borland_extensions, false))
5187 CmdArgs.push_back("-fborland-extensions");
5188
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005189 // -fno-declspec is default, except for PS4.
5190 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5191 getToolChain().getTriple().isPS4()))
5192 CmdArgs.push_back("-fdeclspec");
5193 else if (Args.hasArg(options::OPT_fno_declspec))
5194 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5195
David Majnemerc371ff02015-03-22 08:39:22 +00005196 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5197 // than 19.
5198 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5199 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005200 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005201 CmdArgs.push_back("-fno-threadsafe-statics");
5202
Francois Pichet02744872011-09-01 16:38:08 +00005203 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5204 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005205 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005206 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005207 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005208
Chandler Carruthe03aa552010-04-17 20:17:31 +00005209 // -fgnu-keywords default varies depending on language; only pass if
5210 // specified.
5211 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005212 options::OPT_fno_gnu_keywords))
5213 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005214
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005215 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005216 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005217 CmdArgs.push_back("-fgnu89-inline");
5218
Chad Rosier9c76d242012-03-15 22:31:42 +00005219 if (Args.hasArg(options::OPT_fno_inline))
5220 CmdArgs.push_back("-fno-inline");
5221
Chad Rosier64d6be92012-03-06 21:17:19 +00005222 if (Args.hasArg(options::OPT_fno_inline_functions))
5223 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005224
John McCall5fb5df92012-06-20 06:18:46 +00005225 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005226
John McCall5fb5df92012-06-20 06:18:46 +00005227 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005228 // legacy is the default. Except for deployment taget of 10.5,
5229 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5230 // gets ignored silently.
5231 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005232 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5233 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005234 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005235 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005236 if (getToolChain().UseObjCMixedDispatch())
5237 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5238 else
5239 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5240 }
5241 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005242
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005243 // When ObjectiveC legacy runtime is in effect on MacOSX,
5244 // turn on the option to do Array/Dictionary subscripting
5245 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005246 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005247 getToolChain().getTriple().isMacOSX() &&
5248 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5249 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005250 objcRuntime.isNeXTFamily())
5251 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005252
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005253 // -fencode-extended-block-signature=1 is default.
5254 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5255 CmdArgs.push_back("-fencode-extended-block-signature");
5256 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005257
John McCall24fc0de2011-07-06 00:26:06 +00005258 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5259 // NOTE: This logic is duplicated in ToolChains.cpp.
5260 bool ARC = isObjCAutoRefCount(Args);
5261 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005262 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005263
John McCall24fc0de2011-07-06 00:26:06 +00005264 CmdArgs.push_back("-fobjc-arc");
5265
Chandler Carruth491db322011-11-04 07:34:47 +00005266 // FIXME: It seems like this entire block, and several around it should be
5267 // wrapped in isObjC, but for now we just use it here as this is where it
5268 // was being used previously.
5269 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5270 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5271 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5272 else
5273 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5274 }
5275
John McCall24fc0de2011-07-06 00:26:06 +00005276 // Allow the user to enable full exceptions code emission.
5277 // We define off for Objective-CC, on for Objective-C++.
5278 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5279 options::OPT_fno_objc_arc_exceptions,
5280 /*default*/ types::isCXX(InputType)))
5281 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005282
John McCall24fc0de2011-07-06 00:26:06 +00005283 }
5284
5285 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5286 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005287 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005288 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005289
John McCall24fc0de2011-07-06 00:26:06 +00005290 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5291 // takes precedence.
5292 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5293 if (!GCArg)
5294 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5295 if (GCArg) {
5296 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005297 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005298 } else if (getToolChain().SupportsObjCGC()) {
5299 GCArg->render(Args, CmdArgs);
5300 } else {
5301 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005302 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005303 }
5304 }
5305
John McCallfbe5ed72015-11-05 19:19:56 +00005306 // Pass down -fobjc-weak or -fno-objc-weak if present.
5307 if (types::isObjC(InputType)) {
5308 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5309 options::OPT_fno_objc_weak);
5310 if (!WeakArg) {
5311 // nothing to do
5312 } else if (GCArg) {
5313 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5314 D.Diag(diag::err_objc_weak_with_gc);
5315 } else if (!objcRuntime.allowsWeak()) {
5316 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5317 D.Diag(diag::err_objc_weak_unsupported);
5318 } else {
5319 WeakArg->render(Args, CmdArgs);
5320 }
5321 }
5322
Bob Wilsonb111ec92015-03-02 19:01:14 +00005323 if (Args.hasFlag(options::OPT_fapplication_extension,
5324 options::OPT_fno_application_extension, false))
5325 CmdArgs.push_back("-fapplication-extension");
5326
Reid Klecknerc542d372014-06-27 17:02:02 +00005327 // Handle GCC-style exception args.
5328 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005329 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5330 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005331
Tim Northovere931f9f2015-10-30 16:30:41 +00005332 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005333 CmdArgs.push_back("-fsjlj-exceptions");
5334
5335 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005336 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5337 options::OPT_fno_assume_sane_operator_new))
5338 CmdArgs.push_back("-fno-assume-sane-operator-new");
5339
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005340 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5341 // most platforms.
5342 if (Args.hasFlag(options::OPT_fsized_deallocation,
5343 options::OPT_fno_sized_deallocation, false))
5344 CmdArgs.push_back("-fsized-deallocation");
5345
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005346 // -fconstant-cfstrings is default, and may be subject to argument translation
5347 // on Darwin.
5348 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5349 options::OPT_fno_constant_cfstrings) ||
5350 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5351 options::OPT_mno_constant_cfstrings))
5352 CmdArgs.push_back("-fno-constant-cfstrings");
5353
John Thompsoned4e2952009-11-05 20:14:16 +00005354 // -fshort-wchar default varies depending on platform; only
5355 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005356 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5357 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005358 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005359
Hans Wennborg28c96312013-07-31 23:39:13 +00005360 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005361 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005362 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005363 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005364
Daniel Dunbar096ed292011-10-05 21:04:55 +00005365 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5366 // -fno-pack-struct doesn't apply to -fpack-struct=.
5367 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005368 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005369 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005370 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005371 } else if (Args.hasFlag(options::OPT_fpack_struct,
5372 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005373 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005374 }
5375
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005376 // Handle -fmax-type-align=N and -fno-type-align
5377 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5378 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5379 if (!SkipMaxTypeAlign) {
5380 std::string MaxTypeAlignStr = "-fmax-type-align=";
5381 MaxTypeAlignStr += A->getValue();
5382 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5383 }
5384 } else if (getToolChain().getTriple().isOSDarwin()) {
5385 if (!SkipMaxTypeAlign) {
5386 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5387 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5388 }
5389 }
5390
John Brawna7b4ec02015-08-10 11:11:28 +00005391 // -fcommon is the default unless compiling kernel code or the target says so
5392 bool NoCommonDefault =
5393 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5394 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5395 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005396 CmdArgs.push_back("-fno-common");
5397
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005398 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005399 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005400 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005401 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005402 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005403 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005404
Daniel Dunbar6358d682010-10-15 22:30:42 +00005405 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005406 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005407 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005408 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005409
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005410 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005411 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5412 StringRef value = inputCharset->getValue();
5413 if (value != "UTF-8")
5414 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5415 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005416 }
5417
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005418 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005419 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5420 StringRef value = execCharset->getValue();
5421 if (value != "UTF-8")
5422 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5423 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005424 }
5425
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005426 // -fcaret-diagnostics is default.
5427 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5428 options::OPT_fno_caret_diagnostics, true))
5429 CmdArgs.push_back("-fno-caret-diagnostics");
5430
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005431 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005432 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005433 options::OPT_fno_diagnostics_fixit_info))
5434 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005435
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005436 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005437 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005438 options::OPT_fno_diagnostics_show_option))
5439 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005440
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005441 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005442 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005443 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005444 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005445 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005446
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005447 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005448 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005449 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005450 }
5451
Chandler Carruthb6766f02011-03-27 01:50:55 +00005452 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005453 options::OPT_fdiagnostics_show_note_include_stack,
5454 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005455 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005456 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005457 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5458 else
5459 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5460 }
5461
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005462 // Color diagnostics are the default, unless the terminal doesn't support
5463 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005464 // Support both clang's -f[no-]color-diagnostics and gcc's
5465 // -f[no-]diagnostics-colors[=never|always|auto].
5466 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005467 for (const auto &Arg : Args) {
5468 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005469 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5470 !O.matches(options::OPT_fdiagnostics_color) &&
5471 !O.matches(options::OPT_fno_color_diagnostics) &&
5472 !O.matches(options::OPT_fno_diagnostics_color) &&
5473 !O.matches(options::OPT_fdiagnostics_color_EQ))
5474 continue;
5475
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005476 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005477 if (O.matches(options::OPT_fcolor_diagnostics) ||
5478 O.matches(options::OPT_fdiagnostics_color)) {
5479 ShowColors = Colors_On;
5480 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5481 O.matches(options::OPT_fno_diagnostics_color)) {
5482 ShowColors = Colors_Off;
5483 } else {
5484 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005485 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005486 if (value == "always")
5487 ShowColors = Colors_On;
5488 else if (value == "never")
5489 ShowColors = Colors_Off;
5490 else if (value == "auto")
5491 ShowColors = Colors_Auto;
5492 else
5493 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005494 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005495 }
5496 }
5497 if (ShowColors == Colors_On ||
5498 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005499 CmdArgs.push_back("-fcolor-diagnostics");
5500
Nico Rieck7857d462013-09-11 00:38:02 +00005501 if (Args.hasArg(options::OPT_fansi_escape_codes))
5502 CmdArgs.push_back("-fansi-escape-codes");
5503
Daniel Dunbardb097022009-06-08 21:13:54 +00005504 if (!Args.hasFlag(options::OPT_fshow_source_location,
5505 options::OPT_fno_show_source_location))
5506 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005507
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005508 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005509 true))
5510 CmdArgs.push_back("-fno-show-column");
5511
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005512 if (!Args.hasFlag(options::OPT_fspell_checking,
5513 options::OPT_fno_spell_checking))
5514 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005515
Chad Rosierc8e56e82012-12-05 21:08:21 +00005516 // -fno-asm-blocks is default.
5517 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5518 false))
5519 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005520
Steven Wucb0d13f2015-01-16 23:05:28 +00005521 // -fgnu-inline-asm is default.
5522 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5523 options::OPT_fno_gnu_inline_asm, true))
5524 CmdArgs.push_back("-fno-gnu-inline-asm");
5525
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005526 // Enable vectorization per default according to the optimization level
5527 // selected. For optimization levels that want vectorization we use the alias
5528 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005529 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005530 OptSpecifier VectorizeAliasOption =
5531 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005532 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005533 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005534 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005535
Chad Rosier136d67d2014-04-28 19:30:57 +00005536 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005537 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005538 OptSpecifier SLPVectAliasOption =
5539 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005540 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005541 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005542 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005543
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005544 // -fno-slp-vectorize-aggressive is default.
5545 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005546 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005547 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005548
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005549 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5550 A->render(Args, CmdArgs);
5551
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005552 // -fdollars-in-identifiers default varies depending on platform and
5553 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005554 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005555 options::OPT_fno_dollars_in_identifiers)) {
5556 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005557 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005558 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005559 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005560 }
5561
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005562 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5563 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005564 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005565 options::OPT_fno_unit_at_a_time)) {
5566 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005567 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005568 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005569
Eli Friedman055c9702011-11-02 01:53:16 +00005570 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5571 options::OPT_fno_apple_pragma_pack, false))
5572 CmdArgs.push_back("-fapple-pragma-pack");
5573
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005574 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005575 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5576 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005577 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005578 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005579 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005581// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5582//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005583// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005584#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005585 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005586 (getToolChain().getArch() == llvm::Triple::arm ||
5587 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005588 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5589 CmdArgs.push_back("-fno-builtin-strcat");
5590 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5591 CmdArgs.push_back("-fno-builtin-strcpy");
5592 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005593#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005594
Justin Bognera88f0122014-06-20 22:59:50 +00005595 // Enable rewrite includes if the user's asked for it or if we're generating
5596 // diagnostics.
5597 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5598 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005599 if (Args.hasFlag(options::OPT_frewrite_includes,
5600 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005601 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005602 CmdArgs.push_back("-frewrite-includes");
5603
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005604 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005605 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005606 options::OPT_traditional_cpp)) {
5607 if (isa<PreprocessJobAction>(JA))
5608 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005609 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005610 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005611 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005612
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005613 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005614 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005615
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005616 // Handle serialized diagnostics.
5617 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5618 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005619 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005620 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005621
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005622 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5623 CmdArgs.push_back("-fretain-comments-from-system-headers");
5624
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005625 // Forward -fcomment-block-commands to -cc1.
5626 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005627 // Forward -fparse-all-comments to -cc1.
5628 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005629
John Brawnad31ace2015-09-23 13:55:40 +00005630 // Turn -fplugin=name.so into -load name.so
5631 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5632 CmdArgs.push_back("-load");
5633 CmdArgs.push_back(A->getValue());
5634 A->claim();
5635 }
5636
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005637 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5638 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005639 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005640 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5641 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005642
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005643 // We translate this by hand to the -cc1 argument, since nightly test uses
5644 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005645 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005646 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005647 } else
Sean Silva14facf32015-06-09 01:57:17 +00005648 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005649 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005650
Bob Wilson23a55f12014-12-21 07:00:00 +00005651 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005652 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5653 // by the frontend.
5654 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5655 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005656
Daniel Dunbard67a3222009-03-30 06:36:42 +00005657 if (Output.getType() == types::TY_Dependencies) {
5658 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005659 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005660 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005661 CmdArgs.push_back(Output.getFilename());
5662 } else {
5663 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005664 }
5665
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005666 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005667
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005668 if (Input.isFilename())
5669 CmdArgs.push_back(Input.getFilename());
5670 else
5671 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005672
Chris Lattnere9d7d782009-11-03 19:50:27 +00005673 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5674
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005675 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005676
5677 // Optionally embed the -cc1 level arguments into the debug info, for build
5678 // analysis.
5679 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005680 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005681 for (const auto &Arg : Args)
5682 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005683
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005684 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005685 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005686 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005687 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005688 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005689 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005690 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005691 }
5692 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005693 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005694 }
5695
Eric Christopherd3804002013-02-22 20:12:52 +00005696 // Add the split debug info name to the command lines here so we
5697 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005698 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005699 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5700 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005701 const char *SplitDwarfOut;
5702 if (SplitDwarf) {
5703 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005704 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005705 CmdArgs.push_back(SplitDwarfOut);
5706 }
5707
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005708 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5709 // Include them with -fcuda-include-gpubinary.
5710 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005711 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005712 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005713 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005714 }
5715
Eric Christopherd3804002013-02-22 20:12:52 +00005716 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005717 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005718 Output.getType() == types::TY_Object &&
5719 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005720 auto CLCommand =
5721 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005722 C.addCommand(llvm::make_unique<FallbackCommand>(
5723 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005724 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5725 isa<PrecompileJobAction>(JA)) {
5726 // In /fallback builds, run the main compilation even if the pch generation
5727 // fails, so that the main compilation's fallback to cl.exe runs.
5728 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5729 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005730 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005731 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005732 }
5733
Eric Christopherf1545832013-02-22 23:50:16 +00005734 // Handle the debug info splitting at object creation time if we're
5735 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005736 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005737 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005738 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005739
Roman Divacky178e01602011-02-10 16:52:03 +00005740 if (Arg *A = Args.getLastArg(options::OPT_pg))
5741 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005742 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5743 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005744
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005745 // Claim some arguments which clang supports automatically.
5746
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005747 // -fpch-preprocess is used with gcc to add a special marker in the output to
5748 // include the PCH file. Clang's PTH solution is completely transparent, so we
5749 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005750 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005751
Daniel Dunbar17731772009-03-23 19:03:36 +00005752 // Claim some arguments which clang doesn't support, but we don't
5753 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005754 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5755 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005756
Rafael Espindolab0092d72013-09-04 19:37:35 +00005757 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005758 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005759}
5760
John McCall5fb5df92012-06-20 06:18:46 +00005761/// Add options related to the Objective-C runtime/ABI.
5762///
5763/// Returns true if the runtime is non-fragile.
5764ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5765 ArgStringList &cmdArgs,
5766 RewriteKind rewriteKind) const {
5767 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005768 Arg *runtimeArg =
5769 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5770 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005771
5772 // Just forward -fobjc-runtime= to the frontend. This supercedes
5773 // options about fragility.
5774 if (runtimeArg &&
5775 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5776 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005777 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005778 if (runtime.tryParse(value)) {
5779 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005780 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005781 }
5782
5783 runtimeArg->render(args, cmdArgs);
5784 return runtime;
5785 }
5786
5787 // Otherwise, we'll need the ABI "version". Version numbers are
5788 // slightly confusing for historical reasons:
5789 // 1 - Traditional "fragile" ABI
5790 // 2 - Non-fragile ABI, version 1
5791 // 3 - Non-fragile ABI, version 2
5792 unsigned objcABIVersion = 1;
5793 // If -fobjc-abi-version= is present, use that to set the version.
5794 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005795 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005796 if (value == "1")
5797 objcABIVersion = 1;
5798 else if (value == "2")
5799 objcABIVersion = 2;
5800 else if (value == "3")
5801 objcABIVersion = 3;
5802 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005803 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005804 } else {
5805 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005806 bool nonFragileABIIsDefault =
5807 (rewriteKind == RK_NonFragile ||
5808 (rewriteKind == RK_None &&
5809 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005810 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5811 options::OPT_fno_objc_nonfragile_abi,
5812 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005813// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005814#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5815 unsigned nonFragileABIVersion = 1;
5816#else
5817 unsigned nonFragileABIVersion = 2;
5818#endif
5819
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005820 if (Arg *abiArg =
5821 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005822 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005823 if (value == "1")
5824 nonFragileABIVersion = 1;
5825 else if (value == "2")
5826 nonFragileABIVersion = 2;
5827 else
5828 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005829 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005830 }
5831
5832 objcABIVersion = 1 + nonFragileABIVersion;
5833 } else {
5834 objcABIVersion = 1;
5835 }
5836 }
5837
5838 // We don't actually care about the ABI version other than whether
5839 // it's non-fragile.
5840 bool isNonFragile = objcABIVersion != 1;
5841
5842 // If we have no runtime argument, ask the toolchain for its default runtime.
5843 // However, the rewriter only really supports the Mac runtime, so assume that.
5844 ObjCRuntime runtime;
5845 if (!runtimeArg) {
5846 switch (rewriteKind) {
5847 case RK_None:
5848 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5849 break;
5850 case RK_Fragile:
5851 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5852 break;
5853 case RK_NonFragile:
5854 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5855 break;
5856 }
5857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005858 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005859 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5860 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005861 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005862 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5863
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005865 } else {
5866 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5867 }
5868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005869 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005870 } else {
5871 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005872 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005873 // non-fragile mode or the GCC runtime in fragile mode.
5874 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005875 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005876 else
5877 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005878 }
5879
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005880 cmdArgs.push_back(
5881 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005882 return runtime;
5883}
5884
Reid Klecknerc542d372014-06-27 17:02:02 +00005885static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5886 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5887 I += HaveDash;
5888 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005889}
Reid Klecknerc542d372014-06-27 17:02:02 +00005890
Benjamin Kramere003ca22015-10-28 13:54:16 +00005891namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005892struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005893 bool Synch = false;
5894 bool Asynch = false;
5895 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005896};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005897} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005898
5899/// /EH controls whether to run destructor cleanups when exceptions are
5900/// thrown. There are three modifiers:
5901/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5902/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5903/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005904/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005905/// The default is /EHs-c-, meaning cleanups are disabled.
5906static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5907 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005909 std::vector<std::string> EHArgs =
5910 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005911 for (auto EHVal : EHArgs) {
5912 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5913 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005914 case 'a':
5915 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005916 if (EH.Asynch)
5917 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005918 continue;
5919 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005920 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005921 continue;
5922 case 's':
5923 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005924 if (EH.Synch)
5925 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005926 continue;
5927 default:
5928 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005929 }
5930 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5931 break;
5932 }
5933 }
David Majnemerb8809092016-02-20 09:23:44 +00005934 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005935 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005936 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005937 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5938 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005939 EH.Synch = true;
5940 EH.NoUnwindC = true;
5941 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005942
Reid Klecknerc542d372014-06-27 17:02:02 +00005943 return EH;
5944}
5945
David Majnemercd5855e2016-02-29 01:40:36 +00005946void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5947 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005948 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005949 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005950 unsigned RTOptionID = options::OPT__SLASH_MT;
5951
Hans Wennborgf1a74252013-09-10 20:18:04 +00005952 if (Args.hasArg(options::OPT__SLASH_LDd))
5953 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5954 // but defining _DEBUG is sticky.
5955 RTOptionID = options::OPT__SLASH_MTd;
5956
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005957 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005958 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005959
David Majnemere2afb472015-07-24 06:49:13 +00005960 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005961 switch (RTOptionID) {
5962 case options::OPT__SLASH_MD:
5963 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005964 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005965 CmdArgs.push_back("-D_MT");
5966 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005967 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005968 break;
5969 case options::OPT__SLASH_MDd:
5970 CmdArgs.push_back("-D_DEBUG");
5971 CmdArgs.push_back("-D_MT");
5972 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005973 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005974 break;
5975 case options::OPT__SLASH_MT:
5976 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005977 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005978 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005979 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005980 break;
5981 case options::OPT__SLASH_MTd:
5982 CmdArgs.push_back("-D_DEBUG");
5983 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005984 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005985 break;
5986 default:
5987 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005988 }
5989
David Majnemere2afb472015-07-24 06:49:13 +00005990 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5991 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5992 } else {
5993 CmdArgs.push_back(FlagForCRT.data());
5994
5995 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5996 // users want. The /Za flag to cl.exe turns this off, but it's not
5997 // implemented in clang.
5998 CmdArgs.push_back("--dependent-lib=oldnames");
5999 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006000
Hans Wennborg8858a032014-07-21 23:42:07 +00006001 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6002 // would produce interleaved output, so ignore /showIncludes in such cases.
6003 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6004 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6005 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006006
David Majnemerf6072342014-07-01 22:24:56 +00006007 // This controls whether or not we emit RTTI data for polymorphic types.
6008 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6009 /*default=*/false))
6010 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006011
Reid Kleckner124955a2015-08-05 18:51:13 +00006012 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006013 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006014 if (*EmitCodeView)
6015 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006016 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006017 CmdArgs.push_back("-gcodeview");
6018
Reid Klecknerc542d372014-06-27 17:02:02 +00006019 const Driver &D = getToolChain().getDriver();
6020 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006021 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006022 if (types::isCXX(InputType))
6023 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006024 CmdArgs.push_back("-fexceptions");
6025 }
David Majnemercd5855e2016-02-29 01:40:36 +00006026 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6027 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006028
Hans Wennborge50cec32014-06-13 20:59:54 +00006029 // /EP should expand to -E -P.
6030 if (Args.hasArg(options::OPT__SLASH_EP)) {
6031 CmdArgs.push_back("-E");
6032 CmdArgs.push_back("-P");
6033 }
6034
David Majnemera5b195a2015-02-14 01:35:12 +00006035 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006036 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6037 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006038 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6039 else
6040 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6041
6042 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6043 VolatileOptionID = A->getOption().getID();
6044
6045 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6046 CmdArgs.push_back("-fms-volatile");
6047
David Majnemer86c318f2014-02-11 21:05:00 +00006048 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6049 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6050 if (MostGeneralArg && BestCaseArg)
6051 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6052 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6053
6054 if (MostGeneralArg) {
6055 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6056 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6057 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6058
6059 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6060 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6061 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6062 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6063 << FirstConflict->getAsString(Args)
6064 << SecondConflict->getAsString(Args);
6065
6066 if (SingleArg)
6067 CmdArgs.push_back("-fms-memptr-rep=single");
6068 else if (MultipleArg)
6069 CmdArgs.push_back("-fms-memptr-rep=multiple");
6070 else
6071 CmdArgs.push_back("-fms-memptr-rep=virtual");
6072 }
6073
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006074 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6075 A->render(Args, CmdArgs);
6076
Hans Wennborg81f74482013-09-10 01:07:07 +00006077 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6078 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006079 if (Args.hasArg(options::OPT__SLASH_fallback))
6080 CmdArgs.push_back("msvc-fallback");
6081 else
6082 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006083 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006084}
6085
Douglas Katzman95354292015-06-23 20:42:09 +00006086visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006087 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006088 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006089 return CLFallback.get();
6090}
6091
Daniel Sanders7f933f42015-01-30 17:35:23 +00006092void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6093 ArgStringList &CmdArgs) const {
6094 StringRef CPUName;
6095 StringRef ABIName;
6096 const llvm::Triple &Triple = getToolChain().getTriple();
6097 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6098
6099 CmdArgs.push_back("-target-abi");
6100 CmdArgs.push_back(ABIName.data());
6101}
6102
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006103void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006104 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006105 const ArgList &Args,
6106 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006107 ArgStringList CmdArgs;
6108
6109 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6110 const InputInfo &Input = Inputs[0];
6111
James Y Knight2db38f32015-08-15 03:45:25 +00006112 std::string TripleStr =
6113 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6114 const llvm::Triple Triple(TripleStr);
6115
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006116 // Don't warn about "clang -w -c foo.s"
6117 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006118 // and "clang -emit-llvm -c foo.s"
6119 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006120
Rafael Espindola577637a2015-01-03 00:06:04 +00006121 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006122
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006123 // Invoke ourselves in -cc1as mode.
6124 //
6125 // FIXME: Implement custom jobs for internal actions.
6126 CmdArgs.push_back("-cc1as");
6127
6128 // Add the "effective" target triple.
6129 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006130 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6131
6132 // Set the output mode, we currently only expect to be used as a real
6133 // assembler.
6134 CmdArgs.push_back("-filetype");
6135 CmdArgs.push_back("obj");
6136
Eric Christopher45f2e712012-12-18 00:31:10 +00006137 // Set the main file name, so that debug info works even with
6138 // -save-temps or preprocessed assembly.
6139 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006140 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006141
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006142 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006143 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006144 if (!CPU.empty()) {
6145 CmdArgs.push_back("-target-cpu");
6146 CmdArgs.push_back(Args.MakeArgString(CPU));
6147 }
6148
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006149 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006150 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006151
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006152 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006153 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006154
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006155 // Pass along any -I options so we get proper .include search paths.
6156 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6157
Eric Christopherfc3ee562012-01-10 00:38:01 +00006158 // Determine the original source input.
6159 const Action *SourceAction = &JA;
6160 while (SourceAction->getKind() != Action::InputClass) {
6161 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6162 SourceAction = SourceAction->getInputs()[0];
6163 }
6164
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006165 // Forward -g and handle debug info related flags, assuming we are dealing
6166 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006167 if (SourceAction->getType() == types::TY_Asm ||
6168 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006169 bool WantDebug = false;
6170 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006171 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006172 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006173 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6174 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006175 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006176 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006177 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006178 if (DwarfVersion == 0)
6179 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006180 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006181 (WantDebug ? codegenoptions::LimitedDebugInfo
6182 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006183 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006184
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006185 // Add the -fdebug-compilation-dir flag if needed.
6186 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006187
6188 // Set the AT_producer to the clang version when using the integrated
6189 // assembler on assembly source files.
6190 CmdArgs.push_back("-dwarf-debug-producer");
6191 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006192
6193 // And pass along -I options
6194 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006195 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006196
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006197 // Handle -fPIC et al -- the relocation-model affects the assembler
6198 // for some targets.
6199 llvm::Reloc::Model RelocationModel;
6200 unsigned PICLevel;
6201 bool IsPIE;
6202 std::tie(RelocationModel, PICLevel, IsPIE) =
6203 ParsePICArgs(getToolChain(), Triple, Args);
6204
6205 const char *RMName = RelocationModelName(RelocationModel);
6206 if (RMName) {
6207 CmdArgs.push_back("-mrelocation-model");
6208 CmdArgs.push_back(RMName);
6209 }
6210
Kevin Enderby292dc082011-12-22 19:31:58 +00006211 // Optionally embed the -cc1as level arguments into the debug info, for build
6212 // analysis.
6213 if (getToolChain().UseDwarfDebugFlags()) {
6214 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006215 for (const auto &Arg : Args)
6216 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006217
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006218 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006219 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6220 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006221 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006222 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006223 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006224 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006225 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006226 }
6227 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006228 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006229 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006230
6231 // FIXME: Add -static support, once we have it.
6232
Daniel Sanders7f933f42015-01-30 17:35:23 +00006233 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006234 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006235 default:
6236 break;
6237
6238 case llvm::Triple::mips:
6239 case llvm::Triple::mipsel:
6240 case llvm::Triple::mips64:
6241 case llvm::Triple::mips64el:
6242 AddMIPSTargetArgs(Args, CmdArgs);
6243 break;
6244 }
6245
David Blaikie372d9502014-01-17 03:17:40 +00006246 // Consume all the warning flags. Usually this would be handled more
6247 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6248 // doesn't handle that so rather than warning about unused flags that are
6249 // actually used, we'll lie by omission instead.
6250 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006251 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006252
David Blaikie9260ed62013-07-25 21:19:01 +00006253 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6254 getToolChain().getDriver());
6255
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006256 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006257
6258 assert(Output.isFilename() && "Unexpected lipo output.");
6259 CmdArgs.push_back("-o");
6260 CmdArgs.push_back(Output.getFilename());
6261
Daniel Dunbarb440f562010-08-02 02:38:21 +00006262 assert(Input.isFilename() && "Invalid input.");
6263 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006264
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006265 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006266 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006267
6268 // Handle the debug info splitting at object creation time if we're
6269 // creating an object.
6270 // TODO: Currently only works on linux with newer objcopy.
6271 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006272 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006273 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006274 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006275}
6276
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006277void GnuTool::anchor() {}
6278
Daniel Dunbara3246a02009-03-18 08:07:30 +00006279void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006280 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006281 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006282 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006283 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006284 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006285
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006286 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006287 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006288 // It is unfortunate that we have to claim here, as this means
6289 // we will basically never report anything interesting for
6290 // platforms using a generic gcc, even if we are just using gcc
6291 // to get to the assembler.
6292 A->claim();
6293
Daniel Dunbar939c1212010-08-03 16:14:14 +00006294 // Don't forward any -g arguments to assembly steps.
6295 if (isa<AssembleJobAction>(JA) &&
6296 A->getOption().matches(options::OPT_g_Group))
6297 continue;
6298
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006299 // Don't forward any -W arguments to assembly and link steps.
6300 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6301 A->getOption().matches(options::OPT_W_Group))
6302 continue;
6303
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006304 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006305 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006306 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006307
Daniel Dunbar4e295052010-01-25 22:35:08 +00006308 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006309
6310 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006311 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006312 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006313 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006314 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006315 }
6316
Daniel Dunbar5716d872009-05-02 21:41:52 +00006317 // Try to force gcc to match the tool chain we want, if we recognize
6318 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006319 //
6320 // FIXME: The triple class should directly provide the information we want
6321 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006322 switch (getToolChain().getArch()) {
6323 default:
6324 break;
6325 case llvm::Triple::x86:
6326 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006327 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006328 break;
6329 case llvm::Triple::x86_64:
6330 case llvm::Triple::ppc64:
6331 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006332 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006333 break;
6334 case llvm::Triple::sparcel:
6335 CmdArgs.push_back("-EL");
6336 break;
6337 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006338
Daniel Dunbarb440f562010-08-02 02:38:21 +00006339 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006340 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006341 CmdArgs.push_back(Output.getFilename());
6342 } else {
6343 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006344 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006345 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006346
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006347 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006348
6349 // Only pass -x if gcc will understand it; otherwise hope gcc
6350 // understands the suffix correctly. The main use case this would go
6351 // wrong in is for linker inputs if they happened to have an odd
6352 // suffix; really the only way to get this to happen is a command
6353 // like '-x foobar a.c' which will treat a.c like a linker input.
6354 //
6355 // FIXME: For the linker case specifically, can we safely convert
6356 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006357 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006358 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006359 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006360 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006361 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006362 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006363 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006364 else if (II.getType() == types::TY_ModuleFile)
6365 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006366 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006367
Daniel Dunbara3246a02009-03-18 08:07:30 +00006368 if (types::canTypeBeUserSpecified(II.getType())) {
6369 CmdArgs.push_back("-x");
6370 CmdArgs.push_back(types::getTypeName(II.getType()));
6371 }
6372
Daniel Dunbarb440f562010-08-02 02:38:21 +00006373 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006374 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006375 else {
6376 const Arg &A = II.getInputArg();
6377
6378 // Reverse translate some rewritten options.
6379 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6380 CmdArgs.push_back("-lstdc++");
6381 continue;
6382 }
6383
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006384 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006385 A.render(Args, CmdArgs);
6386 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006387 }
6388
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006389 const std::string customGCCName = D.getCCCGenericGCCName();
6390 const char *GCCName;
6391 if (!customGCCName.empty())
6392 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006393 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006394 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006395 } else
6396 GCCName = "gcc";
6397
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006398 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006399 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006400}
6401
Douglas Katzman95354292015-06-23 20:42:09 +00006402void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6403 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006404 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006405}
6406
Douglas Katzman95354292015-06-23 20:42:09 +00006407void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6408 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006409 const Driver &D = getToolChain().getDriver();
6410
Eric Christophercc7ff502015-01-29 00:56:17 +00006411 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006412 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006413 case types::TY_LLVM_IR:
6414 case types::TY_LTO_IR:
6415 case types::TY_LLVM_BC:
6416 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006417 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006418 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006419 // We assume we've got an "integrated" assembler in that gcc will produce an
6420 // object file itself.
6421 case types::TY_Object:
6422 CmdArgs.push_back("-c");
6423 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006424 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006425 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006426 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006427 case types::TY_Nothing:
6428 CmdArgs.push_back("-fsyntax-only");
6429 break;
6430 default:
6431 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006432 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006433}
6434
Douglas Katzman95354292015-06-23 20:42:09 +00006435void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6436 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006437 // The types are (hopefully) good enough.
6438}
6439
Tony Linthicum76329bf2011-12-12 21:14:55 +00006440// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006441void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006442 ArgStringList &CmdArgs) const {
6443}
6444
Douglas Katzman95354292015-06-23 20:42:09 +00006445void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6446 const InputInfo &Output,
6447 const InputInfoList &Inputs,
6448 const ArgList &Args,
6449 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006450 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006452 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6453 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454 ArgStringList CmdArgs;
6455
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006456 std::string MArchString = "-march=hexagon";
6457 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006458
6459 RenderExtraToolArgs(JA, CmdArgs);
6460
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006461 std::string AsName = "hexagon-llvm-mc";
6462 std::string MCpuString = "-mcpu=hexagon" +
6463 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6464 CmdArgs.push_back("-filetype=obj");
6465 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6466
Tony Linthicum76329bf2011-12-12 21:14:55 +00006467 if (Output.isFilename()) {
6468 CmdArgs.push_back("-o");
6469 CmdArgs.push_back(Output.getFilename());
6470 } else {
6471 assert(Output.isNothing() && "Unexpected output");
6472 CmdArgs.push_back("-fsyntax-only");
6473 }
6474
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6476 std::string N = llvm::utostr(G.getValue());
6477 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6478 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006479
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006480 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006481
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482 // Only pass -x if gcc will understand it; otherwise hope gcc
6483 // understands the suffix correctly. The main use case this would go
6484 // wrong in is for linker inputs if they happened to have an odd
6485 // suffix; really the only way to get this to happen is a command
6486 // like '-x foobar a.c' which will treat a.c like a linker input.
6487 //
6488 // FIXME: For the linker case specifically, can we safely convert
6489 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006490 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006491 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006492 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006493 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006494 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006495 else if (II.getType() == types::TY_AST)
6496 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006497 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006498 else if (II.getType() == types::TY_ModuleFile)
6499 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006500 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006501
6502 if (II.isFilename())
6503 CmdArgs.push_back(II.getFilename());
6504 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006505 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006506 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006507 II.getInputArg().render(Args, CmdArgs);
6508 }
6509
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006510 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006511 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006512}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006513
Douglas Katzman95354292015-06-23 20:42:09 +00006514void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6515 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006516}
6517
Douglas Katzman54366072015-07-27 16:53:08 +00006518static void
6519constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006521 const InputInfo &Output, const InputInfoList &Inputs,
6522 const ArgList &Args, ArgStringList &CmdArgs,
6523 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006524
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006526
Matthew Curtise689b052012-12-06 15:46:07 +00006527 //----------------------------------------------------------------------------
6528 //
6529 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006530 bool IsStatic = Args.hasArg(options::OPT_static);
6531 bool IsShared = Args.hasArg(options::OPT_shared);
6532 bool IsPIE = Args.hasArg(options::OPT_pie);
6533 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6534 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6535 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6536 bool UseG0 = false;
6537 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006538
Matthew Curtise689b052012-12-06 15:46:07 +00006539 //----------------------------------------------------------------------------
6540 // Silence warnings for various options
6541 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006542 Args.ClaimAllArgs(options::OPT_g_Group);
6543 Args.ClaimAllArgs(options::OPT_emit_llvm);
6544 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6545 // handled somewhere else.
6546 Args.ClaimAllArgs(options::OPT_static_libgcc);
6547
6548 //----------------------------------------------------------------------------
6549 //
6550 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006551 if (Args.hasArg(options::OPT_s))
6552 CmdArgs.push_back("-s");
6553
6554 if (Args.hasArg(options::OPT_r))
6555 CmdArgs.push_back("-r");
6556
6557 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006558 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006560 CmdArgs.push_back("-march=hexagon");
6561 std::string CpuVer =
6562 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6563 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6564 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006565
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006566 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006567 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568 // The following should be the default, but doing as hexagon-gcc does.
6569 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570 }
6571
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006572 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006573 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006574
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006575 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006576 CmdArgs.push_back("-pie");
6577
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006578 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6579 std::string N = llvm::utostr(G.getValue());
6580 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6581 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006582 }
6583
Matthew Curtise689b052012-12-06 15:46:07 +00006584 //----------------------------------------------------------------------------
6585 //
6586 //----------------------------------------------------------------------------
6587 CmdArgs.push_back("-o");
6588 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006589
Matthew Curtise689b052012-12-06 15:46:07 +00006590 //----------------------------------------------------------------------------
6591 // moslib
6592 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006593 std::vector<std::string> OsLibs;
6594 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006595
Sean Silva14facf32015-06-09 01:57:17 +00006596 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6597 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006598 OsLibs.emplace_back(A->getValue());
6599 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006600 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006601 if (OsLibs.empty()) {
6602 OsLibs.push_back("standalone");
6603 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006604 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006605
Matthew Curtise689b052012-12-06 15:46:07 +00006606 //----------------------------------------------------------------------------
6607 // Start Files
6608 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006609 const std::string MCpuSuffix = "/" + CpuVer;
6610 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6611 const std::string RootDir =
6612 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6613 const std::string StartSubDir =
6614 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006615
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006616 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6617 const char *Name) -> std::string {
6618 std::string RelName = SubDir + Name;
6619 std::string P = HTC.GetFilePath(RelName.c_str());
6620 if (llvm::sys::fs::exists(P))
6621 return P;
6622 return RootDir + RelName;
6623 };
6624
6625 if (IncStdLib && IncStartFiles) {
6626 if (!IsShared) {
6627 if (HasStandalone) {
6628 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6629 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006630 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006631 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6632 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006633 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634 std::string Init = UseShared
6635 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6636 : Find(RootDir, StartSubDir, "/init.o");
6637 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006638 }
6639
6640 //----------------------------------------------------------------------------
6641 // Library Search Paths
6642 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006643 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6644 for (const auto &LibPath : LibPaths)
6645 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006646
6647 //----------------------------------------------------------------------------
6648 //
6649 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006650 Args.AddAllArgs(CmdArgs,
6651 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6652 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006653
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006654 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006655
6656 //----------------------------------------------------------------------------
6657 // Libraries
6658 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006659 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006660 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006661 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006662 CmdArgs.push_back("-lm");
6663 }
6664
6665 CmdArgs.push_back("--start-group");
6666
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006667 if (!IsShared) {
6668 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006669 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006670 CmdArgs.push_back("-lc");
6671 }
6672 CmdArgs.push_back("-lgcc");
6673
6674 CmdArgs.push_back("--end-group");
6675 }
6676
6677 //----------------------------------------------------------------------------
6678 // End files
6679 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006680 if (IncStdLib && IncStartFiles) {
6681 std::string Fini = UseShared
6682 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6683 : Find(RootDir, StartSubDir, "/fini.o");
6684 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006685 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006686}
6687
Douglas Katzman95354292015-06-23 20:42:09 +00006688void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6689 const InputInfo &Output,
6690 const InputInfoList &Inputs,
6691 const ArgList &Args,
6692 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006693 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006694
6695 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006696 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006697 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006698
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006699 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006700 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006701 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006702}
6703// Hexagon tools end.
6704
Tom Stellard8fa33092015-07-18 01:49:05 +00006705void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6706 const InputInfo &Output,
6707 const InputInfoList &Inputs,
6708 const ArgList &Args,
6709 const char *LinkingOutput) const {
6710
6711 std::string Linker = getToolChain().GetProgramPath(getShortName());
6712 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006713 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6714 CmdArgs.push_back("-o");
6715 CmdArgs.push_back(Output.getFilename());
6716 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6717 CmdArgs, Inputs));
6718}
6719// AMDGPU tools end.
6720
Dan Gohman52816862015-12-16 23:30:41 +00006721wasm::Linker::Linker(const ToolChain &TC)
6722 : GnuTool("wasm::Linker", "lld", TC) {}
6723
6724bool wasm::Linker::isLinkJob() const {
6725 return true;
6726}
6727
6728bool wasm::Linker::hasIntegratedCPP() const {
6729 return false;
6730}
6731
6732void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6733 const InputInfo &Output,
6734 const InputInfoList &Inputs,
6735 const ArgList &Args,
6736 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006737
6738 const ToolChain &ToolChain = getToolChain();
6739 const Driver &D = ToolChain.getDriver();
6740 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006741 ArgStringList CmdArgs;
6742 CmdArgs.push_back("-flavor");
6743 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006744
6745 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006746 // size is of particular importance. This is significantly facilitated by
6747 // the enabling of -ffunction-sections and -fdata-sections in
6748 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006749 if (areOptimizationsEnabled(Args))
6750 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006751
Dan Gohman57b62c52016-02-22 19:26:15 +00006752 if (Args.hasArg(options::OPT_rdynamic))
6753 CmdArgs.push_back("-export-dynamic");
6754 if (Args.hasArg(options::OPT_s))
6755 CmdArgs.push_back("--strip-all");
6756 if (Args.hasArg(options::OPT_shared))
6757 CmdArgs.push_back("-shared");
6758 if (Args.hasArg(options::OPT_static))
6759 CmdArgs.push_back("-Bstatic");
6760
6761 Args.AddAllArgs(CmdArgs, options::OPT_L);
6762 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6763
6764 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6765 if (Args.hasArg(options::OPT_shared))
6766 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6767 else if (Args.hasArg(options::OPT_pie))
6768 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6769 else
6770 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6771
6772 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6773 }
6774
6775 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6776
6777 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6778 if (D.CCCIsCXX())
6779 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6780
6781 if (Args.hasArg(options::OPT_pthread))
6782 CmdArgs.push_back("-lpthread");
6783
6784 CmdArgs.push_back("-lc");
6785 CmdArgs.push_back("-lcompiler_rt");
6786 }
6787
6788 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6789 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6790
Dan Gohman52816862015-12-16 23:30:41 +00006791 CmdArgs.push_back("-o");
6792 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006793
Dan Gohman52816862015-12-16 23:30:41 +00006794 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6795}
6796
Renato Golin7c542b42015-07-27 23:44:45 +00006797const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006798 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006799 if (!Arch.empty())
6800 MArch = Arch;
6801 else
Bernard Ogden31561762013-12-12 13:27:11 +00006802 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006803 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006804
6805 // Handle -march=native.
6806 if (MArch == "native") {
6807 std::string CPU = llvm::sys::getHostCPUName();
6808 if (CPU != "generic") {
6809 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006810 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006811 // If there is no valid architecture suffix for this CPU we don't know how
6812 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006813 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006814 MArch = "";
6815 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006816 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006817 }
6818 }
6819
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006820 return MArch;
6821}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006822
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006823/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006824StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006825 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006826 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6827 // here means an -march=native that we can't handle, so instead return no CPU.
6828 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006829 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006830
John Brawna95c1a82015-05-08 12:52:18 +00006831 // We need to return an empty string here on invalid MArch values as the
6832 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006833 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006834}
6835
6836/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006837std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006838 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006839 // FIXME: Warn on inconsistent use of -mcpu and -march.
6840 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006841 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006842 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006843 // Handle -mcpu=native.
6844 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006845 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006846 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006847 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006848 }
6849
Renato Goline17c5802015-07-27 23:44:42 +00006850 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006851}
6852
6853/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006854/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006855// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006856StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6857 const llvm::Triple &Triple) {
6858 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006859 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006860 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006861 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006862 if (ArchKind == llvm::ARM::AK_INVALID)
6863 // In case of generic Arch, i.e. "arm",
6864 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006865 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006866 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006867 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6868 // armv7k triple if it's actually been specified via "-arch armv7k".
6869 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006870 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006871 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006872 }
Renato Golin3c007252015-05-28 15:05:53 +00006873 if (ArchKind == llvm::ARM::AK_INVALID)
6874 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006875 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006876}
6877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006878void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006879 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006880 if (Args.hasArg(options::OPT_r))
6881 return;
6882
John Brawn94fd9632015-05-21 12:19:49 +00006883 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6884 // to generate BE-8 executables.
6885 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6886 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006887}
6888
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006889mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006890 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6891 // was first introduced in Release 3. However, other compilers have
6892 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006893 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6894 .Case("mips1", NanLegacy)
6895 .Case("mips2", NanLegacy)
6896 .Case("mips3", NanLegacy)
6897 .Case("mips4", NanLegacy)
6898 .Case("mips5", NanLegacy)
6899 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006900 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006901 .Case("mips32r3", NanLegacy | Nan2008)
6902 .Case("mips32r5", NanLegacy | Nan2008)
6903 .Case("mips32r6", Nan2008)
6904 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006905 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006906 .Case("mips64r3", NanLegacy | Nan2008)
6907 .Case("mips64r5", NanLegacy | Nan2008)
6908 .Case("mips64r6", Nan2008)
6909 .Default(NanLegacy);
6910}
6911
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006912bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6913 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6914 return A && (A->getValue() == StringRef(Value));
6915}
6916
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006917bool mips::isUCLibc(const ArgList &Args) {
6918 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006919 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006920}
6921
Daniel Sanders2bf13662014-07-10 14:40:57 +00006922bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006923 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6924 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006925 .Case("2008", true)
6926 .Case("legacy", false)
6927 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006928
6929 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006930 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006931 .Cases("mips32r6", "mips64r6", true)
6932 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006933
6934 return false;
6935}
6936
Daniel Sanders379d44b2014-07-16 11:52:23 +00006937bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006938 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006939 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006940 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006941 return false;
6942
6943 if (ABIName != "32")
6944 return false;
6945
Toma Tabacu94ea6862015-06-16 13:54:13 +00006946 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6947 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006948 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006949 return false;
6950
Daniel Sanders379d44b2014-07-16 11:52:23 +00006951 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006952 .Cases("mips2", "mips3", "mips4", "mips5", true)
6953 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6954 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6955 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006956}
6957
Toma Tabacu94ea6862015-06-16 13:54:13 +00006958bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6959 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006960 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006961 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6962
6963 // FPXX shouldn't be used if -msingle-float is present.
6964 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6965 options::OPT_mdouble_float))
6966 if (A->getOption().matches(options::OPT_msingle_float))
6967 UseFPXX = false;
6968
6969 return UseFPXX;
6970}
6971
Tim Northover157d9112014-01-16 08:48:16 +00006972llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006973 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6974 // archs which Darwin doesn't use.
6975
6976 // The matching this routine does is fairly pointless, since it is neither the
6977 // complete architecture list, nor a reasonable subset. The problem is that
6978 // historically the driver driver accepts this and also ties its -march=
6979 // handling to the architecture name, so we need to be careful before removing
6980 // support for it.
6981
6982 // This code must be kept in sync with Clang's Darwin specific argument
6983 // translation.
6984
6985 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006986 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6987 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6988 .Case("ppc64", llvm::Triple::ppc64)
6989 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6990 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6991 llvm::Triple::x86)
6992 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6993 // This is derived from the driver driver.
6994 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6995 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6996 .Cases("armv7s", "xscale", llvm::Triple::arm)
6997 .Case("arm64", llvm::Triple::aarch64)
6998 .Case("r600", llvm::Triple::r600)
6999 .Case("amdgcn", llvm::Triple::amdgcn)
7000 .Case("nvptx", llvm::Triple::nvptx)
7001 .Case("nvptx64", llvm::Triple::nvptx64)
7002 .Case("amdil", llvm::Triple::amdil)
7003 .Case("spir", llvm::Triple::spir)
7004 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007005}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007006
Tim Northover157d9112014-01-16 08:48:16 +00007007void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007008 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007009 T.setArch(Arch);
7010
7011 if (Str == "x86_64h")
7012 T.setArchName(Str);
7013 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7014 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007015 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007016 }
7017}
7018
Bob Wilsondecc03e2012-11-23 06:14:39 +00007019const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007020 const InputInfo &Input) {
7021 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007022}
7023
Bob Wilsondecc03e2012-11-23 06:14:39 +00007024const char *Clang::getBaseInputStem(const ArgList &Args,
7025 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007026 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007027
Chris Lattner906bb902011-01-16 08:14:11 +00007028 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007029 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007030
7031 return Str;
7032}
7033
Bob Wilsondecc03e2012-11-23 06:14:39 +00007034const char *Clang::getDependencyFileName(const ArgList &Args,
7035 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007036 // FIXME: Think about this more.
7037 std::string Res;
7038
7039 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007040 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007041 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007042 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007043 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007044 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007045 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007046}
7047
Douglas Katzman95354292015-06-23 20:42:09 +00007048void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7049 const InputInfo &Output,
7050 const InputInfoList &Inputs,
7051 const ArgList &Args,
7052 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007053 const ToolChain &ToolChain = getToolChain();
7054 const Driver &D = ToolChain.getDriver();
7055 ArgStringList CmdArgs;
7056
7057 // Silence warning for "clang -g foo.o -o foo"
7058 Args.ClaimAllArgs(options::OPT_g_Group);
7059 // and "clang -emit-llvm foo.o -o foo"
7060 Args.ClaimAllArgs(options::OPT_emit_llvm);
7061 // and for "clang -w foo.o -o foo". Other warning options are already
7062 // handled somewhere else.
7063 Args.ClaimAllArgs(options::OPT_w);
7064
7065 if (!D.SysRoot.empty())
7066 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7067
7068 // CloudABI only supports static linkage.
7069 CmdArgs.push_back("-Bstatic");
7070 CmdArgs.push_back("--eh-frame-hdr");
7071 CmdArgs.push_back("--gc-sections");
7072
7073 if (Output.isFilename()) {
7074 CmdArgs.push_back("-o");
7075 CmdArgs.push_back(Output.getFilename());
7076 } else {
7077 assert(Output.isNothing() && "Invalid output.");
7078 }
7079
Douglas Katzman78b37b02015-11-17 20:28:07 +00007080 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007081 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7082 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7083 }
7084
7085 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007086 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007087 Args.AddAllArgs(CmdArgs,
7088 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7089 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007090
Teresa Johnson945bc502015-10-15 20:35:53 +00007091 if (D.isUsingLTO())
7092 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007093
7094 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7095
Douglas Katzman78b37b02015-11-17 20:28:07 +00007096 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007097 if (D.CCCIsCXX())
7098 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7099 CmdArgs.push_back("-lc");
7100 CmdArgs.push_back("-lcompiler_rt");
7101 }
7102
Douglas Katzman78b37b02015-11-17 20:28:07 +00007103 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007104 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7105
7106 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007107 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007108}
7109
Douglas Katzman95354292015-06-23 20:42:09 +00007110void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7111 const InputInfo &Output,
7112 const InputInfoList &Inputs,
7113 const ArgList &Args,
7114 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007115 ArgStringList CmdArgs;
7116
7117 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7118 const InputInfo &Input = Inputs[0];
7119
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007120 // Determine the original source input.
7121 const Action *SourceAction = &JA;
7122 while (SourceAction->getKind() != Action::InputClass) {
7123 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7124 SourceAction = SourceAction->getInputs()[0];
7125 }
7126
Eric Christopherf5a8f492015-12-08 00:10:10 +00007127 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007128 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007129 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7130 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007131 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007132 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007133 const llvm::Triple &T(getToolChain().getTriple());
7134 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007135 CmdArgs.push_back("-Q");
7136 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007137
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007138 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007139 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007140 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007141 if (Args.hasArg(options::OPT_gstabs))
7142 CmdArgs.push_back("--gstabs");
7143 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007144 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007145 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007146
Daniel Dunbarbe220842009-03-20 16:06:39 +00007147 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007148 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007149
Daniel Dunbar6d484762010-07-22 01:47:22 +00007150 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007151 if (getToolChain().getArch() == llvm::Triple::x86 ||
7152 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007153 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7154 CmdArgs.push_back("-force_cpusubtype_ALL");
7155
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007156 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007157 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007158 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007159 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007160 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007161 CmdArgs.push_back("-static");
7162
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007163 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007164
7165 assert(Output.isFilename() && "Unexpected lipo output.");
7166 CmdArgs.push_back("-o");
7167 CmdArgs.push_back(Output.getFilename());
7168
Daniel Dunbarb440f562010-08-02 02:38:21 +00007169 assert(Input.isFilename() && "Invalid input.");
7170 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007171
7172 // asm_final spec is empty.
7173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007174 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007175 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007176}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007177
Tim Northover157d9112014-01-16 08:48:16 +00007178void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007179
Tim Northover157d9112014-01-16 08:48:16 +00007180void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7181 ArgStringList &CmdArgs) const {
7182 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007183
Daniel Dunbarc1964212009-03-26 16:23:12 +00007184 // Derived from darwin_arch spec.
7185 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007186 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007187
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007188 // FIXME: Is this needed anymore?
7189 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007190 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007191}
7192
Douglas Katzman95354292015-06-23 20:42:09 +00007193bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007194 // We only need to generate a temp path for LTO if we aren't compiling object
7195 // files. When compiling source files, we run 'dsymutil' after linking. We
7196 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007197 for (const auto &Input : Inputs)
7198 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007199 return true;
7200
7201 return false;
7202}
7203
Douglas Katzman95354292015-06-23 20:42:09 +00007204void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7205 ArgStringList &CmdArgs,
7206 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007207 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007208 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007210 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007211 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7212 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007213 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7214 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007215 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007216 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007217 }
7218
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007219 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007220 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007221 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7222 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007223
Bob Wilson3d27dad2013-08-02 22:25:34 +00007224 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7225 CmdArgs.push_back("-export_dynamic");
7226
Bob Wilsonb111ec92015-03-02 19:01:14 +00007227 // If we are using App Extension restrictions, pass a flag to the linker
7228 // telling it that the compiled code has been audited.
7229 if (Args.hasFlag(options::OPT_fapplication_extension,
7230 options::OPT_fno_application_extension, false))
7231 CmdArgs.push_back("-application_extension");
7232
Teresa Johnson945bc502015-10-15 20:35:53 +00007233 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007234 // If we are using LTO, then automatically create a temporary file path for
7235 // the linker to use, so that it's lifetime will extend past a possible
7236 // dsymutil step.
7237 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7238 const char *TmpPath = C.getArgs().MakeArgString(
7239 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7240 C.addTempFile(TmpPath);
7241 CmdArgs.push_back("-object_path_lto");
7242 CmdArgs.push_back(TmpPath);
7243 }
7244
7245 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7246 // it in clang installed libraries. If not found, the option is not used
7247 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7248 if (Version[0] >= 133) {
7249 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7250 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7251 SmallString<128> LibLTOPath(P);
7252 llvm::sys::path::append(LibLTOPath, "lib");
7253 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7254 if (llvm::sys::fs::exists(LibLTOPath)) {
7255 CmdArgs.push_back("-lto_library");
7256 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7257 } else {
7258 D.Diag(diag::warn_drv_lto_libpath);
7259 }
7260 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007261 }
7262
Daniel Dunbarc1964212009-03-26 16:23:12 +00007263 // Derived from the "link" spec.
7264 Args.AddAllArgs(CmdArgs, options::OPT_static);
7265 if (!Args.hasArg(options::OPT_static))
7266 CmdArgs.push_back("-dynamic");
7267 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7268 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7269 // here. How do we wish to handle such things?
7270 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007271
Daniel Dunbarc1964212009-03-26 16:23:12 +00007272 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007273 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007274 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007275 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007276
7277 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7278 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7279 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7280
7281 Arg *A;
7282 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7283 (A = Args.getLastArg(options::OPT_current__version)) ||
7284 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007285 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7286 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007287
7288 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7289 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7290 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7291 } else {
7292 CmdArgs.push_back("-dylib");
7293
7294 Arg *A;
7295 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7296 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7297 (A = Args.getLastArg(options::OPT_client__name)) ||
7298 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7299 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7300 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007301 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7302 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007303
Daniel Dunbarc1964212009-03-26 16:23:12 +00007304 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7305 "-dylib_compatibility_version");
7306 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7307 "-dylib_current_version");
7308
Tim Northover157d9112014-01-16 08:48:16 +00007309 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007310
7311 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7312 "-dylib_install_name");
7313 }
7314
7315 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7316 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7317 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007318 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007319 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007320 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7321 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7322 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7323 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7324 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7325 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007326 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007327 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7328 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7329 Args.AddAllArgs(CmdArgs, options::OPT_init);
7330
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007331 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007332 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007333
Daniel Dunbarc1964212009-03-26 16:23:12 +00007334 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7335 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7336 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7337 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7338 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007339
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007340 if (const Arg *A =
7341 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7342 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007343 if (A->getOption().matches(options::OPT_fpie) ||
7344 A->getOption().matches(options::OPT_fPIE))
7345 CmdArgs.push_back("-pie");
7346 else
7347 CmdArgs.push_back("-no_pie");
7348 }
Steven Wu574b0f22016-03-01 01:07:58 +00007349 // for embed-bitcode, use -bitcode_bundle in linker command
7350 if (C.getDriver().embedBitcodeEnabled() ||
7351 C.getDriver().embedBitcodeMarkerOnly()) {
7352 // Check if the toolchain supports bitcode build flow.
7353 if (MachOTC.SupportsEmbeddedBitcode())
7354 CmdArgs.push_back("-bitcode_bundle");
7355 else
7356 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7357 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007358
7359 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7360 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7361 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7362 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7363 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7364 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7365 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7366 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7367 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7368 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7369 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7370 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7371 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7372 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7373 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7374 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007375
Daniel Dunbar84384642011-05-02 21:03:47 +00007376 // Give --sysroot= preference, over the Apple specific behavior to also use
7377 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007378 StringRef sysroot = C.getSysRoot();
7379 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007380 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007381 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007382 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7383 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007384 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007385 }
7386
Daniel Dunbarc1964212009-03-26 16:23:12 +00007387 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7388 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7389 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7390 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7391 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007392 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007393 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7394 Args.AddAllArgs(CmdArgs, options::OPT_y);
7395 Args.AddLastArg(CmdArgs, options::OPT_w);
7396 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7397 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7398 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7399 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7400 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7401 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7402 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7403 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7404 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7405 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7406 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7407 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7408}
7409
Douglas Katzman95354292015-06-23 20:42:09 +00007410void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7411 const InputInfo &Output,
7412 const InputInfoList &Inputs,
7413 const ArgList &Args,
7414 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007415 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007416
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007417 // If the number of arguments surpasses the system limits, we will encode the
7418 // input files in a separate file, shortening the command line. To this end,
7419 // build a list of input file names that can be passed via a file with the
7420 // -filelist linker option.
7421 llvm::opt::ArgStringList InputFileList;
7422
Daniel Dunbarc1964212009-03-26 16:23:12 +00007423 // The logic here is derived from gcc's behavior; most of which
7424 // comes from specs (starting with link_command). Consult gcc for
7425 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007426 ArgStringList CmdArgs;
7427
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007428 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7429 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7430 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007431 for (const auto &Arg : Args)
7432 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007433 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007434 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007435 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007436 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007437 return;
7438 }
7439
Daniel Dunbarc1964212009-03-26 16:23:12 +00007440 // I'm not sure why this particular decomposition exists in gcc, but
7441 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007442 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007443
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007444 // It seems that the 'e' option is completely ignored for dynamic executables
7445 // (the default), and with static executables, the last one wins, as expected.
7446 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7447 options::OPT_Z_Flag, options::OPT_u_Group,
7448 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007449
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007450 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7451 // members of static archive libraries which implement Objective-C classes or
7452 // categories.
7453 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7454 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007455
Daniel Dunbarc1964212009-03-26 16:23:12 +00007456 CmdArgs.push_back("-o");
7457 CmdArgs.push_back(Output.getFilename());
7458
Douglas Katzman78b37b02015-11-17 20:28:07 +00007459 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007460 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007461
Peter Collingbournec4122c12015-06-15 21:08:13 +00007462 // SafeStack requires its own runtime libraries
7463 // These libraries should be linked first, to make sure the
7464 // __safestack_init constructor executes before everything else
7465 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7466 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7467 "libclang_rt.safestack_osx.a",
7468 /*AlwaysLink=*/true);
7469 }
7470
Daniel Dunbarc1964212009-03-26 16:23:12 +00007471 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007472
Douglas Gregor9295df02012-05-15 21:00:27 +00007473 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007474 // Build the input file for -filelist (list of linker input files) in case we
7475 // need it later
7476 for (const auto &II : Inputs) {
7477 if (!II.isFilename()) {
7478 // This is a linker input argument.
7479 // We cannot mix input arguments and file names in a -filelist input, thus
7480 // we prematurely stop our list (remaining files shall be passed as
7481 // arguments).
7482 if (InputFileList.size() > 0)
7483 break;
7484
7485 continue;
7486 }
7487
7488 InputFileList.push_back(II.getFilename());
7489 }
7490
Douglas Katzman78b37b02015-11-17 20:28:07 +00007491 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007492 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7493
Douglas Katzman78b37b02015-11-17 20:28:07 +00007494 if (isObjCRuntimeLinked(Args) &&
7495 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007496 // We use arclite library for both ARC and subscripting support.
7497 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7498
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007499 CmdArgs.push_back("-framework");
7500 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007501 // Link libobj.
7502 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007503 }
John McCall31168b02011-06-15 23:02:42 +00007504
Daniel Dunbarc1964212009-03-26 16:23:12 +00007505 if (LinkingOutput) {
7506 CmdArgs.push_back("-arch_multiple");
7507 CmdArgs.push_back("-final_output");
7508 CmdArgs.push_back(LinkingOutput);
7509 }
7510
Daniel Dunbarc1964212009-03-26 16:23:12 +00007511 if (Args.hasArg(options::OPT_fnested_functions))
7512 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007513
Justin Bognerc7701242015-05-12 05:44:36 +00007514 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7515
Douglas Katzman78b37b02015-11-17 20:28:07 +00007516 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007517 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007518 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007519
Daniel Dunbarc1964212009-03-26 16:23:12 +00007520 // link_ssp spec is empty.
7521
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007522 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007523 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007524 }
7525
Douglas Katzman78b37b02015-11-17 20:28:07 +00007526 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007527 // endfile_spec is empty.
7528 }
7529
7530 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7531 Args.AddAllArgs(CmdArgs, options::OPT_F);
7532
Steven Wu3ffb61b2015-02-06 18:08:29 +00007533 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007534 for (const Arg *A : Args.filtered(options::OPT_iframework))
7535 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007536
Douglas Katzman78b37b02015-11-17 20:28:07 +00007537 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007538 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7539 if (A->getValue() == StringRef("Accelerate")) {
7540 CmdArgs.push_back("-framework");
7541 CmdArgs.push_back("Accelerate");
7542 }
7543 }
7544 }
7545
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007546 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007547 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007548 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007549 Cmd->setInputFileList(std::move(InputFileList));
7550 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007551}
7552
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007553void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007554 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007555 const InputInfoList &Inputs,
7556 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007557 const char *LinkingOutput) const {
7558 ArgStringList CmdArgs;
7559
7560 CmdArgs.push_back("-create");
7561 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007562
7563 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007564 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007565
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007566 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007567 assert(II.isFilename() && "Unexpected lipo input.");
7568 CmdArgs.push_back(II.getFilename());
7569 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007570
7571 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007572 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007573}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007574
Daniel Dunbar88299622010-06-04 18:28:36 +00007575void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007576 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007577 const InputInfoList &Inputs,
7578 const ArgList &Args,
7579 const char *LinkingOutput) const {
7580 ArgStringList CmdArgs;
7581
Daniel Dunbareb86b042011-05-09 17:23:16 +00007582 CmdArgs.push_back("-o");
7583 CmdArgs.push_back(Output.getFilename());
7584
Daniel Dunbar88299622010-06-04 18:28:36 +00007585 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7586 const InputInfo &Input = Inputs[0];
7587 assert(Input.isFilename() && "Unexpected dsymutil input.");
7588 CmdArgs.push_back(Input.getFilename());
7589
Daniel Dunbar88299622010-06-04 18:28:36 +00007590 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007591 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007592 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007593}
7594
Eric Christopher551ef452011-08-23 17:56:55 +00007595void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007596 const InputInfo &Output,
7597 const InputInfoList &Inputs,
7598 const ArgList &Args,
7599 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007600 ArgStringList CmdArgs;
7601 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007602 CmdArgs.push_back("--debug-info");
7603 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007604 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007605
7606 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7607 const InputInfo &Input = Inputs[0];
7608 assert(Input.isFilename() && "Unexpected verify input");
7609
7610 // Grabbing the output of the earlier dsymutil run.
7611 CmdArgs.push_back(Input.getFilename());
7612
7613 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007614 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007615 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007616}
7617
Douglas Katzman95354292015-06-23 20:42:09 +00007618void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007619 const InputInfo &Output,
7620 const InputInfoList &Inputs,
7621 const ArgList &Args,
7622 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007623 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007624 ArgStringList CmdArgs;
7625
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007626 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007627
7628 CmdArgs.push_back("-o");
7629 CmdArgs.push_back(Output.getFilename());
7630
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007631 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007632 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007633
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007634 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007635 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007636}
7637
Douglas Katzman95354292015-06-23 20:42:09 +00007638void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7639 const InputInfo &Output,
7640 const InputInfoList &Inputs,
7641 const ArgList &Args,
7642 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007643 ArgStringList CmdArgs;
7644
David Chisnall272a0712012-02-29 15:06:12 +00007645 // Demangle C++ names in errors
7646 CmdArgs.push_back("-C");
7647
Douglas Katzman78b37b02015-11-17 20:28:07 +00007648 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007649 CmdArgs.push_back("-e");
7650 CmdArgs.push_back("_start");
7651 }
7652
7653 if (Args.hasArg(options::OPT_static)) {
7654 CmdArgs.push_back("-Bstatic");
7655 CmdArgs.push_back("-dn");
7656 } else {
7657 CmdArgs.push_back("-Bdynamic");
7658 if (Args.hasArg(options::OPT_shared)) {
7659 CmdArgs.push_back("-shared");
7660 } else {
7661 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007662 CmdArgs.push_back(
7663 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007664 }
7665 }
7666
7667 if (Output.isFilename()) {
7668 CmdArgs.push_back("-o");
7669 CmdArgs.push_back(Output.getFilename());
7670 } else {
7671 assert(Output.isNothing() && "Invalid output.");
7672 }
7673
Douglas Katzman78b37b02015-11-17 20:28:07 +00007674 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007675 if (!Args.hasArg(options::OPT_shared))
7676 CmdArgs.push_back(
7677 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7678
7679 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7680 CmdArgs.push_back(
7681 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7682 CmdArgs.push_back(
7683 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007684 }
7685
Douglas Katzman6059ef92015-11-17 17:41:23 +00007686 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007687
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007688 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7689 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007690
7691 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7692
Douglas Katzman78b37b02015-11-17 20:28:07 +00007693 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007694 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007695 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007696 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007697 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007698 if (!Args.hasArg(options::OPT_shared)) {
7699 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007700 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007701 }
David Chisnallf571cde2012-02-15 13:39:01 +00007702 }
7703
Douglas Katzman78b37b02015-11-17 20:28:07 +00007704 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007705 CmdArgs.push_back(
7706 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007707 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007708 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007709
Xinliang David Li69306c02015-10-22 06:15:31 +00007710 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007712 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007713 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007714}
7715
Douglas Katzman95354292015-06-23 20:42:09 +00007716void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7717 const InputInfo &Output,
7718 const InputInfoList &Inputs,
7719 const ArgList &Args,
7720 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007721 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007722 ArgStringList CmdArgs;
7723
Rafael Espindolacc126272014-02-28 01:55:21 +00007724 switch (getToolChain().getArch()) {
7725 case llvm::Triple::x86:
7726 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7727 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007728 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007729 break;
7730
7731 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007732 CmdArgs.push_back("-mppc");
7733 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007734 break;
7735
7736 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007737 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007738 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007739 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7740 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7741 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007742 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007743 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007744
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007745 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007746 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007747 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7748 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7749 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007750 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007751 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007752
7753 case llvm::Triple::mips64:
7754 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007755 StringRef CPUName;
7756 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007757 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007758
7759 CmdArgs.push_back("-mabi");
7760 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7761
7762 if (getToolChain().getArch() == llvm::Triple::mips64)
7763 CmdArgs.push_back("-EB");
7764 else
7765 CmdArgs.push_back("-EL");
7766
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007767 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007768 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007769 }
7770
Rafael Espindolacc126272014-02-28 01:55:21 +00007771 default:
7772 break;
7773 }
7774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007775 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007776
7777 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007778 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007779
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007780 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007781 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007782
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007783 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007784 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007785}
7786
Douglas Katzman95354292015-06-23 20:42:09 +00007787void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7788 const InputInfo &Output,
7789 const InputInfoList &Inputs,
7790 const ArgList &Args,
7791 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007792 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007793 ArgStringList CmdArgs;
7794
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007795 // Silence warning for "clang -g foo.o -o foo"
7796 Args.ClaimAllArgs(options::OPT_g_Group);
7797 // and "clang -emit-llvm foo.o -o foo"
7798 Args.ClaimAllArgs(options::OPT_emit_llvm);
7799 // and for "clang -w foo.o -o foo". Other warning options are already
7800 // handled somewhere else.
7801 Args.ClaimAllArgs(options::OPT_w);
7802
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007803 if (getToolChain().getArch() == llvm::Triple::mips64)
7804 CmdArgs.push_back("-EB");
7805 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7806 CmdArgs.push_back("-EL");
7807
Douglas Katzman78b37b02015-11-17 20:28:07 +00007808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007809 CmdArgs.push_back("-e");
7810 CmdArgs.push_back("__start");
7811 }
7812
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007813 if (Args.hasArg(options::OPT_static)) {
7814 CmdArgs.push_back("-Bstatic");
7815 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007816 if (Args.hasArg(options::OPT_rdynamic))
7817 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007818 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007819 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007820 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007821 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007822 } else {
7823 CmdArgs.push_back("-dynamic-linker");
7824 CmdArgs.push_back("/usr/libexec/ld.so");
7825 }
7826 }
7827
Rafael Espindola044f7832013-06-05 04:28:55 +00007828 if (Args.hasArg(options::OPT_nopie))
7829 CmdArgs.push_back("-nopie");
7830
Daniel Dunbarb440f562010-08-02 02:38:21 +00007831 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007832 CmdArgs.push_back("-o");
7833 CmdArgs.push_back(Output.getFilename());
7834 } else {
7835 assert(Output.isNothing() && "Invalid output.");
7836 }
7837
Douglas Katzman78b37b02015-11-17 20:28:07 +00007838 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007839 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007840 if (Args.hasArg(options::OPT_pg))
7841 CmdArgs.push_back(
7842 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007843 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007844 CmdArgs.push_back(
7845 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7846 CmdArgs.push_back(
7847 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007848 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007849 CmdArgs.push_back(
7850 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007851 }
7852 }
7853
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007854 std::string Triple = getToolChain().getTripleString();
7855 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007856 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007857 CmdArgs.push_back(
7858 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007859
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007860 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7861 options::OPT_e, options::OPT_s, options::OPT_t,
7862 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007863
Daniel Dunbar54423b22010-09-17 00:24:54 +00007864 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007865
Douglas Katzman78b37b02015-11-17 20:28:07 +00007866 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007867 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007868 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007869 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007870 CmdArgs.push_back("-lm_p");
7871 else
7872 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007873 }
7874
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007875 // FIXME: For some reason GCC passes -lgcc before adding
7876 // the default system libraries. Just mimic this for now.
7877 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007878
Eric Christopher17674ec2012-09-13 06:32:34 +00007879 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007880 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7881 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007882 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007883 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007884 }
7885
Chandler Carruth45661652011-12-17 22:32:42 +00007886 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007887 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007888 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007889 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007890 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007891 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007892
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007893 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007894 }
7895
Douglas Katzman78b37b02015-11-17 20:28:07 +00007896 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007897 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007898 CmdArgs.push_back(
7899 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007900 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 CmdArgs.push_back(
7902 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903 }
7904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007905 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007906 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007907}
Ed Schoutene33194b2009-04-02 19:13:12 +00007908
Douglas Katzman95354292015-06-23 20:42:09 +00007909void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7910 const InputInfo &Output,
7911 const InputInfoList &Inputs,
7912 const ArgList &Args,
7913 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007914 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007915 ArgStringList CmdArgs;
7916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007917 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007918
7919 CmdArgs.push_back("-o");
7920 CmdArgs.push_back(Output.getFilename());
7921
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007922 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007923 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007924
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007925 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007926 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007927}
7928
Douglas Katzman95354292015-06-23 20:42:09 +00007929void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7930 const InputInfo &Output,
7931 const InputInfoList &Inputs,
7932 const ArgList &Args,
7933 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007934 const Driver &D = getToolChain().getDriver();
7935 ArgStringList CmdArgs;
7936
Douglas Katzman78b37b02015-11-17 20:28:07 +00007937 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007938 CmdArgs.push_back("-e");
7939 CmdArgs.push_back("__start");
7940 }
7941
7942 if (Args.hasArg(options::OPT_static)) {
7943 CmdArgs.push_back("-Bstatic");
7944 } else {
7945 if (Args.hasArg(options::OPT_rdynamic))
7946 CmdArgs.push_back("-export-dynamic");
7947 CmdArgs.push_back("--eh-frame-hdr");
7948 CmdArgs.push_back("-Bdynamic");
7949 if (Args.hasArg(options::OPT_shared)) {
7950 CmdArgs.push_back("-shared");
7951 } else {
7952 CmdArgs.push_back("-dynamic-linker");
7953 CmdArgs.push_back("/usr/libexec/ld.so");
7954 }
7955 }
7956
7957 if (Output.isFilename()) {
7958 CmdArgs.push_back("-o");
7959 CmdArgs.push_back(Output.getFilename());
7960 } else {
7961 assert(Output.isNothing() && "Invalid output.");
7962 }
7963
Douglas Katzman78b37b02015-11-17 20:28:07 +00007964 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007965 if (!Args.hasArg(options::OPT_shared)) {
7966 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007967 CmdArgs.push_back(
7968 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007969 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 CmdArgs.push_back(
7971 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7972 CmdArgs.push_back(
7973 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007974 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007975 CmdArgs.push_back(
7976 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007977 }
7978 }
7979
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007980 Args.AddAllArgs(CmdArgs,
7981 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007982
7983 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7984
Douglas Katzman78b37b02015-11-17 20:28:07 +00007985 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007986 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007987 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7988 if (Args.hasArg(options::OPT_pg))
7989 CmdArgs.push_back("-lm_p");
7990 else
7991 CmdArgs.push_back("-lm");
7992 }
7993
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007994 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007995 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007996 CmdArgs.push_back("-lpthread_p");
7997 else
7998 CmdArgs.push_back("-lpthread");
7999 }
8000
Eli Friedman9fa28852012-08-08 23:57:20 +00008001 if (!Args.hasArg(options::OPT_shared)) {
8002 if (Args.hasArg(options::OPT_pg))
8003 CmdArgs.push_back("-lc_p");
8004 else
8005 CmdArgs.push_back("-lc");
8006 }
8007
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008008 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008009 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008010 case llvm::Triple::arm:
8011 MyArch = "arm";
8012 break;
8013 case llvm::Triple::x86:
8014 MyArch = "i386";
8015 break;
8016 case llvm::Triple::x86_64:
8017 MyArch = "amd64";
8018 break;
8019 default:
8020 llvm_unreachable("Unsupported architecture");
8021 }
8022 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008023 }
8024
Douglas Katzman78b37b02015-11-17 20:28:07 +00008025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008026 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008027 CmdArgs.push_back(
8028 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008029 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008030 CmdArgs.push_back(
8031 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008032 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008034 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008035 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008036}
8037
Douglas Katzman95354292015-06-23 20:42:09 +00008038void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8039 const InputInfo &Output,
8040 const InputInfoList &Inputs,
8041 const ArgList &Args,
8042 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008043 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008044 ArgStringList CmdArgs;
8045
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008046 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8047 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008048 switch (getToolChain().getArch()) {
8049 default:
8050 break;
8051 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008052 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008053 break;
8054 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008055 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008056 break;
8057 case llvm::Triple::mips:
8058 case llvm::Triple::mipsel:
8059 case llvm::Triple::mips64:
8060 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008061 StringRef CPUName;
8062 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008063 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008064
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008065 CmdArgs.push_back("-march");
8066 CmdArgs.push_back(CPUName.data());
8067
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008068 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008069 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008070
8071 if (getToolChain().getArch() == llvm::Triple::mips ||
8072 getToolChain().getArch() == llvm::Triple::mips64)
8073 CmdArgs.push_back("-EB");
8074 else
8075 CmdArgs.push_back("-EL");
8076
Dimitry Andric46f338c2015-12-27 10:36:44 +00008077 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8078 StringRef v = A->getValue();
8079 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8080 A->claim();
8081 }
8082
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008083 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008084 break;
8085 }
8086 case llvm::Triple::arm:
8087 case llvm::Triple::armeb:
8088 case llvm::Triple::thumb:
8089 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008090 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008091
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008092 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008093 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008094 else
Renato Golinf4421f72014-02-19 10:44:07 +00008095 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008096
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008097 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008098 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008099 case llvm::Triple::GNUEABI:
8100 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008101 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008102 break;
8103
8104 default:
8105 CmdArgs.push_back("-matpcs");
8106 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008107 break;
8108 }
8109 case llvm::Triple::sparc:
8110 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008111 case llvm::Triple::sparcv9: {
8112 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8113 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008114 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008115 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008116 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008117 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008119 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008120
8121 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008122 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008123
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008124 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008125 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008126
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008127 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008128 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008129}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008130
Douglas Katzman95354292015-06-23 20:42:09 +00008131void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8132 const InputInfo &Output,
8133 const InputInfoList &Inputs,
8134 const ArgList &Args,
8135 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008136 const toolchains::FreeBSD &ToolChain =
8137 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008138 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008139 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008140 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 !Args.hasArg(options::OPT_shared) &&
8142 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008143 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008144
8145 // Silence warning for "clang -g foo.o -o foo"
8146 Args.ClaimAllArgs(options::OPT_g_Group);
8147 // and "clang -emit-llvm foo.o -o foo"
8148 Args.ClaimAllArgs(options::OPT_emit_llvm);
8149 // and for "clang -w foo.o -o foo". Other warning options are already
8150 // handled somewhere else.
8151 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008152
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008153 if (!D.SysRoot.empty())
8154 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8155
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008156 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008157 CmdArgs.push_back("-pie");
8158
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008159 if (Args.hasArg(options::OPT_static)) {
8160 CmdArgs.push_back("-Bstatic");
8161 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008162 if (Args.hasArg(options::OPT_rdynamic))
8163 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008164 CmdArgs.push_back("--eh-frame-hdr");
8165 if (Args.hasArg(options::OPT_shared)) {
8166 CmdArgs.push_back("-Bshareable");
8167 } else {
8168 CmdArgs.push_back("-dynamic-linker");
8169 CmdArgs.push_back("/libexec/ld-elf.so.1");
8170 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008171 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008172 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8173 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8174 CmdArgs.push_back("--hash-style=both");
8175 }
8176 }
8177 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008178 }
8179
8180 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8181 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008182 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008183 CmdArgs.push_back("-m");
8184 CmdArgs.push_back("elf_i386_fbsd");
8185 }
8186
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008187 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008188 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008189 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008190 }
8191
Dimitry Andric904895f2015-12-27 06:47:09 +00008192 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8193 if (ToolChain.getArch() == llvm::Triple::mips ||
8194 ToolChain.getArch() == llvm::Triple::mipsel ||
8195 ToolChain.getArch() == llvm::Triple::mips64 ||
8196 ToolChain.getArch() == llvm::Triple::mips64el) {
8197 StringRef v = A->getValue();
8198 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8199 A->claim();
8200 }
8201 }
8202
Daniel Dunbarb440f562010-08-02 02:38:21 +00008203 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008204 CmdArgs.push_back("-o");
8205 CmdArgs.push_back(Output.getFilename());
8206 } else {
8207 assert(Output.isNothing() && "Invalid output.");
8208 }
8209
Douglas Katzman78b37b02015-11-17 20:28:07 +00008210 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008211 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008212 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008213 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008214 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008215 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008216 crt1 = "Scrt1.o";
8217 else
8218 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008219 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008220 if (crt1)
8221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8222
8223 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8224
Craig Topper92fc2df2014-05-17 16:56:41 +00008225 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008226 if (Args.hasArg(options::OPT_static))
8227 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008228 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008229 crtbegin = "crtbeginS.o";
8230 else
8231 crtbegin = "crtbegin.o";
8232
8233 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008234 }
8235
8236 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008237 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008238 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8239 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008240 Args.AddAllArgs(CmdArgs, options::OPT_s);
8241 Args.AddAllArgs(CmdArgs, options::OPT_t);
8242 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8243 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244
Teresa Johnson945bc502015-10-15 20:35:53 +00008245 if (D.isUsingLTO())
8246 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008247
Alexey Samsonov52550342014-09-15 19:58:40 +00008248 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008249 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008250
Douglas Katzman78b37b02015-11-17 20:28:07 +00008251 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008252 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008253 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008254 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008255 if (Args.hasArg(options::OPT_pg))
8256 CmdArgs.push_back("-lm_p");
8257 else
8258 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008259 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008260 if (NeedsSanitizerDeps)
8261 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008262 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8263 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008264 if (Args.hasArg(options::OPT_pg))
8265 CmdArgs.push_back("-lgcc_p");
8266 else
8267 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008268 if (Args.hasArg(options::OPT_static)) {
8269 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008270 } else if (Args.hasArg(options::OPT_pg)) {
8271 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008272 } else {
8273 CmdArgs.push_back("--as-needed");
8274 CmdArgs.push_back("-lgcc_s");
8275 CmdArgs.push_back("--no-as-needed");
8276 }
8277
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008278 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008279 if (Args.hasArg(options::OPT_pg))
8280 CmdArgs.push_back("-lpthread_p");
8281 else
8282 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008283 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008284
Roman Divacky66f22762011-02-10 16:59:40 +00008285 if (Args.hasArg(options::OPT_pg)) {
8286 if (Args.hasArg(options::OPT_shared))
8287 CmdArgs.push_back("-lc");
8288 else
8289 CmdArgs.push_back("-lc_p");
8290 CmdArgs.push_back("-lgcc_p");
8291 } else {
8292 CmdArgs.push_back("-lc");
8293 CmdArgs.push_back("-lgcc");
8294 }
8295
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008296 if (Args.hasArg(options::OPT_static)) {
8297 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008298 } else if (Args.hasArg(options::OPT_pg)) {
8299 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008300 } else {
8301 CmdArgs.push_back("--as-needed");
8302 CmdArgs.push_back("-lgcc_s");
8303 CmdArgs.push_back("--no-as-needed");
8304 }
8305 }
8306
Douglas Katzman78b37b02015-11-17 20:28:07 +00008307 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008308 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008310 else
8311 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008313 }
8314
Xinliang David Li69306c02015-10-22 06:15:31 +00008315 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008316
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008317 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008318 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008319}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008320
Douglas Katzman95354292015-06-23 20:42:09 +00008321void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008322 const InputInfo &Output,
8323 const InputInfoList &Inputs,
8324 const ArgList &Args,
8325 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008326 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008327 ArgStringList CmdArgs;
8328
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008329 // GNU as needs different flags for creating the correct output format
8330 // on architectures with different ABIs or optional feature sets.
8331 switch (getToolChain().getArch()) {
8332 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008333 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008334 break;
8335 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008336 case llvm::Triple::armeb:
8337 case llvm::Triple::thumb:
8338 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008339 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008340 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8341 std::string Arch =
8342 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008343 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008344 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008345 }
8346
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008347 case llvm::Triple::mips:
8348 case llvm::Triple::mipsel:
8349 case llvm::Triple::mips64:
8350 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008351 StringRef CPUName;
8352 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008353 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008354
8355 CmdArgs.push_back("-march");
8356 CmdArgs.push_back(CPUName.data());
8357
8358 CmdArgs.push_back("-mabi");
8359 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8360
8361 if (getToolChain().getArch() == llvm::Triple::mips ||
8362 getToolChain().getArch() == llvm::Triple::mips64)
8363 CmdArgs.push_back("-EB");
8364 else
8365 CmdArgs.push_back("-EL");
8366
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008367 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008368 break;
8369 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008370
8371 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008372 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008373 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008374 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8375 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008376 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008377 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008378 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008379
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008380 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008381 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008382 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8383 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008384 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008385 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008386 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008387
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008388 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008389 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008390 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008391
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008392 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008393
8394 CmdArgs.push_back("-o");
8395 CmdArgs.push_back(Output.getFilename());
8396
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008397 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008398 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008399
David Chisnallddbd68f2011-09-27 22:03:18 +00008400 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008401 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008402}
8403
Douglas Katzman95354292015-06-23 20:42:09 +00008404void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8405 const InputInfo &Output,
8406 const InputInfoList &Inputs,
8407 const ArgList &Args,
8408 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008409 const Driver &D = getToolChain().getDriver();
8410 ArgStringList CmdArgs;
8411
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008412 if (!D.SysRoot.empty())
8413 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8414
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008415 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008416 if (Args.hasArg(options::OPT_static)) {
8417 CmdArgs.push_back("-Bstatic");
8418 } else {
8419 if (Args.hasArg(options::OPT_rdynamic))
8420 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421 if (Args.hasArg(options::OPT_shared)) {
8422 CmdArgs.push_back("-Bshareable");
8423 } else {
8424 CmdArgs.push_back("-dynamic-linker");
8425 CmdArgs.push_back("/libexec/ld.elf_so");
8426 }
8427 }
8428
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008429 // Many NetBSD architectures support more than one ABI.
8430 // Determine the correct emulation for ld.
8431 switch (getToolChain().getArch()) {
8432 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008433 CmdArgs.push_back("-m");
8434 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008435 break;
8436 case llvm::Triple::arm:
8437 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008438 CmdArgs.push_back("-m");
8439 switch (getToolChain().getTriple().getEnvironment()) {
8440 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008441 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008442 CmdArgs.push_back("armelf_nbsd_eabi");
8443 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008444 case llvm::Triple::EABIHF:
8445 case llvm::Triple::GNUEABIHF:
8446 CmdArgs.push_back("armelf_nbsd_eabihf");
8447 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008448 default:
8449 CmdArgs.push_back("armelf_nbsd");
8450 break;
8451 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008452 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008453 case llvm::Triple::armeb:
8454 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008455 arm::appendEBLinkFlags(
8456 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008457 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008458 CmdArgs.push_back("-m");
8459 switch (getToolChain().getTriple().getEnvironment()) {
8460 case llvm::Triple::EABI:
8461 case llvm::Triple::GNUEABI:
8462 CmdArgs.push_back("armelfb_nbsd_eabi");
8463 break;
8464 case llvm::Triple::EABIHF:
8465 case llvm::Triple::GNUEABIHF:
8466 CmdArgs.push_back("armelfb_nbsd_eabihf");
8467 break;
8468 default:
8469 CmdArgs.push_back("armelfb_nbsd");
8470 break;
8471 }
8472 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008473 case llvm::Triple::mips64:
8474 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008475 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008476 CmdArgs.push_back("-m");
8477 if (getToolChain().getArch() == llvm::Triple::mips64)
8478 CmdArgs.push_back("elf32btsmip");
8479 else
8480 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008481 } else if (mips::hasMipsAbiArg(Args, "64")) {
8482 CmdArgs.push_back("-m");
8483 if (getToolChain().getArch() == llvm::Triple::mips64)
8484 CmdArgs.push_back("elf64btsmip");
8485 else
8486 CmdArgs.push_back("elf64ltsmip");
8487 }
8488 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008489 case llvm::Triple::ppc:
8490 CmdArgs.push_back("-m");
8491 CmdArgs.push_back("elf32ppc_nbsd");
8492 break;
8493
8494 case llvm::Triple::ppc64:
8495 case llvm::Triple::ppc64le:
8496 CmdArgs.push_back("-m");
8497 CmdArgs.push_back("elf64ppc");
8498 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008499
8500 case llvm::Triple::sparc:
8501 CmdArgs.push_back("-m");
8502 CmdArgs.push_back("elf32_sparc");
8503 break;
8504
8505 case llvm::Triple::sparcv9:
8506 CmdArgs.push_back("-m");
8507 CmdArgs.push_back("elf64_sparc");
8508 break;
8509
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008510 default:
8511 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008512 }
8513
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008514 if (Output.isFilename()) {
8515 CmdArgs.push_back("-o");
8516 CmdArgs.push_back(Output.getFilename());
8517 } else {
8518 assert(Output.isNothing() && "Invalid output.");
8519 }
8520
Douglas Katzman78b37b02015-11-17 20:28:07 +00008521 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008522 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008523 CmdArgs.push_back(
8524 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8525 CmdArgs.push_back(
8526 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8527 CmdArgs.push_back(
8528 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008529 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008530 CmdArgs.push_back(
8531 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8532 CmdArgs.push_back(
8533 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008534 }
8535 }
8536
8537 Args.AddAllArgs(CmdArgs, options::OPT_L);
8538 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8539 Args.AddAllArgs(CmdArgs, options::OPT_e);
8540 Args.AddAllArgs(CmdArgs, options::OPT_s);
8541 Args.AddAllArgs(CmdArgs, options::OPT_t);
8542 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8543 Args.AddAllArgs(CmdArgs, options::OPT_r);
8544
8545 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8546
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008547 unsigned Major, Minor, Micro;
8548 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8549 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008550 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008551 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008552 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008553 case llvm::Triple::arm:
8554 case llvm::Triple::armeb:
8555 case llvm::Triple::thumb:
8556 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008557 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008558 case llvm::Triple::ppc64:
8559 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008560 case llvm::Triple::sparc:
8561 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008562 case llvm::Triple::x86:
8563 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008564 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008565 break;
8566 default:
8567 break;
8568 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008569 }
8570
Douglas Katzman78b37b02015-11-17 20:28:07 +00008571 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008572 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008573 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008574 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8575 CmdArgs.push_back("-lm");
8576 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008577 if (Args.hasArg(options::OPT_pthread))
8578 CmdArgs.push_back("-lpthread");
8579 CmdArgs.push_back("-lc");
8580
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008581 if (useLibgcc) {
8582 if (Args.hasArg(options::OPT_static)) {
8583 // libgcc_eh depends on libc, so resolve as much as possible,
8584 // pull in any new requirements from libc and then get the rest
8585 // of libgcc.
8586 CmdArgs.push_back("-lgcc_eh");
8587 CmdArgs.push_back("-lc");
8588 CmdArgs.push_back("-lgcc");
8589 } else {
8590 CmdArgs.push_back("-lgcc");
8591 CmdArgs.push_back("--as-needed");
8592 CmdArgs.push_back("-lgcc_s");
8593 CmdArgs.push_back("--no-as-needed");
8594 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008595 }
8596 }
8597
Douglas Katzman78b37b02015-11-17 20:28:07 +00008598 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008599 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008600 CmdArgs.push_back(
8601 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008602 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008603 CmdArgs.push_back(
8604 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8605 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008606 }
8607
Xinliang David Li69306c02015-10-22 06:15:31 +00008608 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008609
Logan Chieneb9162f2014-06-26 14:23:45 +00008610 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008611 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008612}
8613
Douglas Katzman95354292015-06-23 20:42:09 +00008614void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8615 const InputInfo &Output,
8616 const InputInfoList &Inputs,
8617 const ArgList &Args,
8618 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008619 claimNoWarnArgs(Args);
8620
James Y Knight2db38f32015-08-15 03:45:25 +00008621 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8622 llvm::Triple Triple = llvm::Triple(TripleStr);
8623
Rafael Espindola92b00932010-08-10 00:25:48 +00008624 ArgStringList CmdArgs;
8625
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008626 llvm::Reloc::Model RelocationModel;
8627 unsigned PICLevel;
8628 bool IsPIE;
8629 std::tie(RelocationModel, PICLevel, IsPIE) =
8630 ParsePICArgs(getToolChain(), Triple, Args);
8631
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008632 switch (getToolChain().getArch()) {
8633 default:
8634 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008635 // Add --32/--64 to make sure we get the format we want.
8636 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008637 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008638 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008639 break;
8640 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008641 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8642 CmdArgs.push_back("--x32");
8643 else
8644 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008645 break;
8646 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008647 CmdArgs.push_back("-a32");
8648 CmdArgs.push_back("-mppc");
8649 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008650 break;
8651 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008652 CmdArgs.push_back("-a64");
8653 CmdArgs.push_back("-mppc64");
8654 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008655 break;
8656 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008657 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008658 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008659 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008660 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008661 break;
8662 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008663 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008664 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008665 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8666 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8667 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008668 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008669 }
8670 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008671 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008672 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8673 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8674 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008675 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008676 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008677 case llvm::Triple::arm:
8678 case llvm::Triple::armeb:
8679 case llvm::Triple::thumb:
8680 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008681 const llvm::Triple &Triple2 = getToolChain().getTriple();
8682 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008683 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008684 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008685 break;
8686 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008687 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008688 break;
8689 default:
8690 break;
8691 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008692
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008693 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008694 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8695 case arm::FloatABI::Soft:
8696 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8697 break;
8698 case arm::FloatABI::SoftFP:
8699 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8700 break;
8701 case arm::FloatABI::Hard:
8702 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8703 break;
8704 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008705
8706 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008707
8708 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008709 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008710 // march from being picked in the absence of a cpu flag.
8711 Arg *A;
8712 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008713 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008714 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008715 else
8716 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008717 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008718 break;
8719 }
8720 case llvm::Triple::mips:
8721 case llvm::Triple::mipsel:
8722 case llvm::Triple::mips64:
8723 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008724 StringRef CPUName;
8725 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008726 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008727 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008728
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008729 CmdArgs.push_back("-march");
8730 CmdArgs.push_back(CPUName.data());
8731
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008732 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008733 CmdArgs.push_back(ABIName.data());
8734
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008735 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8736 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008737 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008738 CmdArgs.push_back("-mno-shared");
8739
Daniel Sanders379d44b2014-07-16 11:52:23 +00008740 // LLVM doesn't support -mplt yet and acts as if it is always given.
8741 // However, -mplt has no effect with the N64 ABI.
8742 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008743
8744 if (getToolChain().getArch() == llvm::Triple::mips ||
8745 getToolChain().getArch() == llvm::Triple::mips64)
8746 CmdArgs.push_back("-EB");
8747 else
8748 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008749
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008750 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8751 if (StringRef(A->getValue()) == "2008")
8752 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8753 }
8754
Daniel Sanders379d44b2014-07-16 11:52:23 +00008755 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8756 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8757 options::OPT_mfp64)) {
8758 A->claim();
8759 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008760 } else if (mips::shouldUseFPXX(
8761 Args, getToolChain().getTriple(), CPUName, ABIName,
8762 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008763 CmdArgs.push_back("-mfpxx");
8764
8765 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8766 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008767 if (Arg *A =
8768 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008769 if (A->getOption().matches(options::OPT_mips16)) {
8770 A->claim();
8771 A->render(Args, CmdArgs);
8772 } else {
8773 A->claim();
8774 CmdArgs.push_back("-no-mips16");
8775 }
8776 }
8777
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008778 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8779 options::OPT_mno_micromips);
8780 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8781 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8782
Simon Atanasyanbd986632013-11-26 11:58:04 +00008783 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8784 // Do not use AddLastArg because not all versions of MIPS assembler
8785 // support -mmsa / -mno-msa options.
8786 if (A->getOption().matches(options::OPT_mmsa))
8787 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8788 }
8789
Daniel Sanders379d44b2014-07-16 11:52:23 +00008790 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8791 options::OPT_msoft_float);
8792
Toma Tabacub36d6102015-06-11 12:13:18 +00008793 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8794 options::OPT_msingle_float);
8795
Daniel Sanders379d44b2014-07-16 11:52:23 +00008796 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8797 options::OPT_mno_odd_spreg);
8798
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008799 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008800 break;
8801 }
8802 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008803 // Always pass an -march option, since our default of z10 is later
8804 // than the GNU assembler's default.
8805 StringRef CPUName = getSystemZTargetCPU(Args);
8806 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008807 break;
8808 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008809 }
8810
Renato Golina74bbc72015-07-22 15:32:36 +00008811 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008812 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008813
8814 CmdArgs.push_back("-o");
8815 CmdArgs.push_back(Output.getFilename());
8816
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008817 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008818 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008819
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008820 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008822
8823 // Handle the debug info splitting at object creation time if we're
8824 // creating an object.
8825 // TODO: Currently only works on linux with newer objcopy.
8826 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008827 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008828 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008829 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008830}
8831
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008832static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008833 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008834 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008835 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008836 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8837 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008838 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008839 CmdArgs.push_back("-lgcc");
8840
Logan Chien3d3373c2012-11-19 12:04:11 +00008841 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008842 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008843 CmdArgs.push_back("-lgcc");
8844 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008845 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008846 CmdArgs.push_back("--as-needed");
8847 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008848 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008849 CmdArgs.push_back("--no-as-needed");
8850 }
8851
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008852 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008853 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008854 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008855 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008856
8857 // According to Android ABI, we have to link with libdl if we are
8858 // linking with non-static libgcc.
8859 //
8860 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8861 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8862 if (isAndroid && !StaticLibgcc)
8863 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008864}
8865
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008866static std::string getLinuxDynamicLinker(const ArgList &Args,
8867 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008868 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8869
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008870 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008871 if (ToolChain.getTriple().isArch64Bit())
8872 return "/system/bin/linker64";
8873 else
8874 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008875 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8876 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008877 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008878 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008879 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008880 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008881 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008882 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008883 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008884 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008885 return "/lib/ld-linux-armhf.so.3";
8886 else
8887 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008888 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8889 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008890 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008891 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008892 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008893 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008894 return "/lib/ld-linux.so.3";
8895 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8896 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008897 std::string LibDir =
8898 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008899 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008900 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008901 if (mips::isUCLibc(Args))
8902 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008903 else if (!ToolChain.getTriple().hasEnvironment()) {
8904 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8905 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8906 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8907 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008908 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008909
8910 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008911 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008912 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008913 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008914 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8915 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008916 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008917 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008918 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8919 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008920 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008921 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008922 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008923 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008924 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008925 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008926 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8927 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008928 else
8929 return "/lib64/ld-linux-x86-64.so.2";
8930}
8931
Renato Golinc4b49242014-02-13 10:01:16 +00008932static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008933 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008934 // Make use of compiler-rt if --rtlib option is used
8935 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8936
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008937 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008938 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008939 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008940 default:
8941 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008942 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008943 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008944 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008945 break;
8946 }
Renato Golinc4b49242014-02-13 10:01:16 +00008947 break;
8948 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008949 // Make sure libgcc is not used under MSVC environment by default
8950 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8951 // Issue error diagnostic if libgcc is explicitly specified
8952 // through command line as --rtlib option argument.
8953 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8954 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8955 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8956 }
8957 } else
8958 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008959 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008960 }
8961}
8962
Rafael Espindola1e085772014-08-15 17:14:35 +00008963static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8964 switch (T.getArch()) {
8965 case llvm::Triple::x86:
8966 return "elf_i386";
8967 case llvm::Triple::aarch64:
8968 return "aarch64linux";
8969 case llvm::Triple::aarch64_be:
8970 return "aarch64_be_linux";
8971 case llvm::Triple::arm:
8972 case llvm::Triple::thumb:
8973 return "armelf_linux_eabi";
8974 case llvm::Triple::armeb:
8975 case llvm::Triple::thumbeb:
8976 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8977 case llvm::Triple::ppc:
8978 return "elf32ppclinux";
8979 case llvm::Triple::ppc64:
8980 return "elf64ppc";
8981 case llvm::Triple::ppc64le:
8982 return "elf64lppc";
8983 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008984 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008985 return "elf32_sparc";
8986 case llvm::Triple::sparcv9:
8987 return "elf64_sparc";
8988 case llvm::Triple::mips:
8989 return "elf32btsmip";
8990 case llvm::Triple::mipsel:
8991 return "elf32ltsmip";
8992 case llvm::Triple::mips64:
8993 if (mips::hasMipsAbiArg(Args, "n32"))
8994 return "elf32btsmipn32";
8995 return "elf64btsmip";
8996 case llvm::Triple::mips64el:
8997 if (mips::hasMipsAbiArg(Args, "n32"))
8998 return "elf32ltsmipn32";
8999 return "elf64ltsmip";
9000 case llvm::Triple::systemz:
9001 return "elf64_s390";
9002 case llvm::Triple::x86_64:
9003 if (T.getEnvironment() == llvm::Triple::GNUX32)
9004 return "elf32_x86_64";
9005 return "elf_x86_64";
9006 default:
9007 llvm_unreachable("Unexpected arch");
9008 }
9009}
9010
Douglas Katzman95354292015-06-23 20:42:09 +00009011void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9012 const InputInfo &Output,
9013 const InputInfoList &Inputs,
9014 const ArgList &Args,
9015 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009016 const toolchains::Linux &ToolChain =
9017 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009018 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009019
9020 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9021 llvm::Triple Triple = llvm::Triple(TripleStr);
9022
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009023 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009024 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009025 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009026 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9027 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009028 const bool HasCRTBeginEndFiles =
9029 ToolChain.getTriple().hasEnvironment() ||
9030 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009031
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009032 ArgStringList CmdArgs;
9033
Rafael Espindolad1002f62010-11-15 18:28:16 +00009034 // Silence warning for "clang -g foo.o -o foo"
9035 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009036 // and "clang -emit-llvm foo.o -o foo"
9037 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009038 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009039 // handled somewhere else.
9040 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009041
Peter Collingbourne39719a72015-11-20 20:49:39 +00009042 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9043 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009044 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009045 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009046 CmdArgs.push_back("-target");
9047 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9048 }
9049
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009050 if (!D.SysRoot.empty())
9051 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009052
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009053 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009054 CmdArgs.push_back("-pie");
9055
Rafael Espindola1c76c592010-11-07 22:57:16 +00009056 if (Args.hasArg(options::OPT_rdynamic))
9057 CmdArgs.push_back("-export-dynamic");
9058
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009059 if (Args.hasArg(options::OPT_s))
9060 CmdArgs.push_back("-s");
9061
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009062 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009063 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009064
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009065 for (const auto &Opt : ToolChain.ExtraOpts)
9066 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009067
9068 if (!Args.hasArg(options::OPT_static)) {
9069 CmdArgs.push_back("--eh-frame-hdr");
9070 }
9071
9072 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009073 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009074
9075 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009076 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9077 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009078 CmdArgs.push_back("-Bstatic");
9079 else
9080 CmdArgs.push_back("-static");
9081 } else if (Args.hasArg(options::OPT_shared)) {
9082 CmdArgs.push_back("-shared");
9083 }
9084
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009085 if (!Args.hasArg(options::OPT_static)) {
9086 if (Args.hasArg(options::OPT_rdynamic))
9087 CmdArgs.push_back("-export-dynamic");
9088
9089 if (!Args.hasArg(options::OPT_shared)) {
9090 const std::string Loader =
9091 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9092 CmdArgs.push_back("-dynamic-linker");
9093 CmdArgs.push_back(Args.MakeArgString(Loader));
9094 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009095 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009096
9097 CmdArgs.push_back("-o");
9098 CmdArgs.push_back(Output.getFilename());
9099
Douglas Katzman78b37b02015-11-17 20:28:07 +00009100 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009101 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009102 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009103 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009104 if (Args.hasArg(options::OPT_pg))
9105 crt1 = "gcrt1.o";
9106 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009107 crt1 = "Scrt1.o";
9108 else
9109 crt1 = "crt1.o";
9110 }
9111 if (crt1)
9112 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009113
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009114 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9115 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009116
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009117 const char *crtbegin;
9118 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009119 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009120 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009121 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009122 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009123 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009124 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009125 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009126
9127 if (HasCRTBeginEndFiles)
9128 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009129
9130 // Add crtfastmath.o if available and fast math is enabled.
9131 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009132 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009133
9134 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009135 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009136
Douglas Katzman6059ef92015-11-17 17:41:23 +00009137 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009138
Teresa Johnson945bc502015-10-15 20:35:53 +00009139 if (D.isUsingLTO())
9140 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009141
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009142 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9143 CmdArgs.push_back("--no-demangle");
9144
Alexey Samsonov52550342014-09-15 19:58:40 +00009145 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009146 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009147 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009148 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009149
Douglas Katzman78b37b02015-11-17 20:28:07 +00009150 if (D.CCCIsCXX() &&
9151 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009152 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009153 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009154 if (OnlyLibstdcxxStatic)
9155 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009156 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009157 if (OnlyLibstdcxxStatic)
9158 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009159 CmdArgs.push_back("-lm");
9160 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009161 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9162 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009163
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009164 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009165 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9166 if (Args.hasArg(options::OPT_static))
9167 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009168
Alexey Samsonov52550342014-09-15 19:58:40 +00009169 if (NeedsSanitizerDeps)
9170 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9171
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009172 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9173 Args.hasArg(options::OPT_pthreads);
9174
9175 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9176 options::OPT_fno_openmp, false)) {
9177 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9178 // FIXME: Does this really make sense for all GNU toolchains?
9179 WantPthread = true;
9180
9181 // Also link the particular OpenMP runtimes.
9182 switch (getOpenMPRuntime(ToolChain, Args)) {
9183 case OMPRT_OMP:
9184 CmdArgs.push_back("-lomp");
9185 break;
9186 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009187 CmdArgs.push_back("-lgomp");
9188
9189 // FIXME: Exclude this for platforms with libgomp that don't require
9190 // librt. Most modern Linux platforms require it, but some may not.
9191 CmdArgs.push_back("-lrt");
9192 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009193 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009194 CmdArgs.push_back("-liomp5");
9195 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009196 case OMPRT_Unknown:
9197 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009198 break;
9199 }
Chandler Carruth01538002013-01-17 13:19:29 +00009200 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009201
Renato Golinc4b49242014-02-13 10:01:16 +00009202 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009203
Richard Smith31d1de22015-05-20 22:48:44 +00009204 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009205 CmdArgs.push_back("-lpthread");
9206
Rafael Espindolab17bc532016-01-25 18:29:16 +00009207 if (Args.hasArg(options::OPT_fsplit_stack))
9208 CmdArgs.push_back("--wrap=pthread_create");
9209
Chandler Carruth94a32012012-05-14 18:31:18 +00009210 CmdArgs.push_back("-lc");
9211
9212 if (Args.hasArg(options::OPT_static))
9213 CmdArgs.push_back("--end-group");
9214 else
Renato Golinc4b49242014-02-13 10:01:16 +00009215 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009216 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009217
Rafael Espindola81937ec2010-12-01 01:52:43 +00009218 if (!Args.hasArg(options::OPT_nostartfiles)) {
9219 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009220 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009221 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009222 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009223 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009224 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009225 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009226
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009227 if (HasCRTBeginEndFiles)
9228 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009229 if (!isAndroid)
9230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009231 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009232 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009233
Peter Collingbourne39719a72015-11-20 20:49:39 +00009234 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009235}
9236
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009237// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9238// for the various SFI requirements like register masking. The assembly tool
9239// inserts the file containing the macros as an input into all the assembly
9240// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009241void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9242 const InputInfo &Output,
9243 const InputInfoList &Inputs,
9244 const ArgList &Args,
9245 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009246 const toolchains::NaClToolChain &ToolChain =
9247 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009248 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009249 "nacl-arm-macros.s");
9250 InputInfoList NewInputs;
9251 NewInputs.push_back(NaClMacros);
9252 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009253 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9254 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009255}
9256
Douglas Katzman750cfc52015-06-29 18:42:16 +00009257// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009258// we use static by default, do not yet support sanitizers or LTO, and a few
9259// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009260// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009261void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9262 const InputInfo &Output,
9263 const InputInfoList &Inputs,
9264 const ArgList &Args,
9265 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009266
Douglas Katzman54366072015-07-27 16:53:08 +00009267 const toolchains::NaClToolChain &ToolChain =
9268 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009269 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009270 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009271 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009272 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009273
9274 ArgStringList CmdArgs;
9275
9276 // Silence warning for "clang -g foo.o -o foo"
9277 Args.ClaimAllArgs(options::OPT_g_Group);
9278 // and "clang -emit-llvm foo.o -o foo"
9279 Args.ClaimAllArgs(options::OPT_emit_llvm);
9280 // and for "clang -w foo.o -o foo". Other warning options are already
9281 // handled somewhere else.
9282 Args.ClaimAllArgs(options::OPT_w);
9283
9284 if (!D.SysRoot.empty())
9285 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9286
9287 if (Args.hasArg(options::OPT_rdynamic))
9288 CmdArgs.push_back("-export-dynamic");
9289
9290 if (Args.hasArg(options::OPT_s))
9291 CmdArgs.push_back("-s");
9292
Douglas Katzman54366072015-07-27 16:53:08 +00009293 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9294 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009295 CmdArgs.push_back("--build-id");
9296
9297 if (!IsStatic)
9298 CmdArgs.push_back("--eh-frame-hdr");
9299
9300 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009301 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009302 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009303 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009304 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009305 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009306 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009307 else if (Arch == llvm::Triple::mipsel)
9308 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009310 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9311 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009312
9313 if (IsStatic)
9314 CmdArgs.push_back("-static");
9315 else if (Args.hasArg(options::OPT_shared))
9316 CmdArgs.push_back("-shared");
9317
9318 CmdArgs.push_back("-o");
9319 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009320 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009321 if (!Args.hasArg(options::OPT_shared))
9322 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9323 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9324
9325 const char *crtbegin;
9326 if (IsStatic)
9327 crtbegin = "crtbeginT.o";
9328 else if (Args.hasArg(options::OPT_shared))
9329 crtbegin = "crtbeginS.o";
9330 else
9331 crtbegin = "crtbegin.o";
9332 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9333 }
9334
9335 Args.AddAllArgs(CmdArgs, options::OPT_L);
9336 Args.AddAllArgs(CmdArgs, options::OPT_u);
9337
Douglas Katzman6059ef92015-11-17 17:41:23 +00009338 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009339
9340 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9341 CmdArgs.push_back("--no-demangle");
9342
9343 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9344
Douglas Katzman78b37b02015-11-17 20:28:07 +00009345 if (D.CCCIsCXX() &&
9346 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009347 bool OnlyLibstdcxxStatic =
9348 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009349 if (OnlyLibstdcxxStatic)
9350 CmdArgs.push_back("-Bstatic");
9351 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9352 if (OnlyLibstdcxxStatic)
9353 CmdArgs.push_back("-Bdynamic");
9354 CmdArgs.push_back("-lm");
9355 }
9356
9357 if (!Args.hasArg(options::OPT_nostdlib)) {
9358 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9359 // Always use groups, since it has no effect on dynamic libraries.
9360 CmdArgs.push_back("--start-group");
9361 CmdArgs.push_back("-lc");
9362 // NaCl's libc++ currently requires libpthread, so just always include it
9363 // in the group for C++.
9364 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009365 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009366 // Gold, used by Mips, handles nested groups differently than ld, and
9367 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9368 // which is not a desired behaviour here.
9369 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9370 if (getToolChain().getArch() == llvm::Triple::mipsel)
9371 CmdArgs.push_back("-lnacl");
9372
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009373 CmdArgs.push_back("-lpthread");
9374 }
9375
9376 CmdArgs.push_back("-lgcc");
9377 CmdArgs.push_back("--as-needed");
9378 if (IsStatic)
9379 CmdArgs.push_back("-lgcc_eh");
9380 else
9381 CmdArgs.push_back("-lgcc_s");
9382 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009383
9384 // Mips needs to create and use pnacl_legacy library that contains
9385 // definitions from bitcode/pnaclmm.c and definitions for
9386 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9387 if (getToolChain().getArch() == llvm::Triple::mipsel)
9388 CmdArgs.push_back("-lpnacl_legacy");
9389
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009390 CmdArgs.push_back("--end-group");
9391 }
9392
9393 if (!Args.hasArg(options::OPT_nostartfiles)) {
9394 const char *crtend;
9395 if (Args.hasArg(options::OPT_shared))
9396 crtend = "crtendS.o";
9397 else
9398 crtend = "crtend.o";
9399
9400 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9401 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9402 }
9403 }
9404
Peter Collingbourne39719a72015-11-20 20:49:39 +00009405 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9406 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009407}
9408
Douglas Katzman95354292015-06-23 20:42:09 +00009409void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9410 const InputInfo &Output,
9411 const InputInfoList &Inputs,
9412 const ArgList &Args,
9413 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009414 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009415 ArgStringList CmdArgs;
9416
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009417 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009418
9419 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009420 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009421
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009422 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009423 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009424
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009425 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009426 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009427}
9428
Douglas Katzman95354292015-06-23 20:42:09 +00009429void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9430 const InputInfo &Output,
9431 const InputInfoList &Inputs,
9432 const ArgList &Args,
9433 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009434 const Driver &D = getToolChain().getDriver();
9435 ArgStringList CmdArgs;
9436
Daniel Dunbarb440f562010-08-02 02:38:21 +00009437 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009438 CmdArgs.push_back("-o");
9439 CmdArgs.push_back(Output.getFilename());
9440 } else {
9441 assert(Output.isNothing() && "Invalid output.");
9442 }
9443
Douglas Katzman78b37b02015-11-17 20:28:07 +00009444 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009445 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9446 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9447 CmdArgs.push_back(
9448 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9449 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009450 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009451
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009452 Args.AddAllArgs(CmdArgs,
9453 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009454
Daniel Dunbar54423b22010-09-17 00:24:54 +00009455 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009456
Xinliang David Li69306c02015-10-22 06:15:31 +00009457 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009458
Douglas Katzman78b37b02015-11-17 20:28:07 +00009459 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009460 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009461 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009462 CmdArgs.push_back("-lm");
9463 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009464 }
9465
Douglas Katzman78b37b02015-11-17 20:28:07 +00009466 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009467 if (Args.hasArg(options::OPT_pthread))
9468 CmdArgs.push_back("-lpthread");
9469 CmdArgs.push_back("-lc");
9470 CmdArgs.push_back("-lCompilerRT-Generic");
9471 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9472 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009473 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009474 }
9475
Logan Chieneb9162f2014-06-26 14:23:45 +00009476 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009477 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009478}
9479
Daniel Dunbarcc912342009-05-02 18:28:39 +00009480/// DragonFly Tools
9481
9482// For now, DragonFly Assemble does just about the same as for
9483// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009484void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9485 const InputInfo &Output,
9486 const InputInfoList &Inputs,
9487 const ArgList &Args,
9488 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009489 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009490 ArgStringList CmdArgs;
9491
9492 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9493 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009494 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009495 CmdArgs.push_back("--32");
9496
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009497 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009498
9499 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009500 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009501
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009502 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009503 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009504
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009505 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009506 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009507}
9508
Douglas Katzman95354292015-06-23 20:42:09 +00009509void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9510 const InputInfo &Output,
9511 const InputInfoList &Inputs,
9512 const ArgList &Args,
9513 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009514 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009515 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009516
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009517 if (!D.SysRoot.empty())
9518 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9519
John McCall65b8da02013-04-11 22:55:55 +00009520 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009521 if (Args.hasArg(options::OPT_static)) {
9522 CmdArgs.push_back("-Bstatic");
9523 } else {
John McCall65b8da02013-04-11 22:55:55 +00009524 if (Args.hasArg(options::OPT_rdynamic))
9525 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009526 if (Args.hasArg(options::OPT_shared))
9527 CmdArgs.push_back("-Bshareable");
9528 else {
9529 CmdArgs.push_back("-dynamic-linker");
9530 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9531 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009532 CmdArgs.push_back("--hash-style=gnu");
9533 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009534 }
9535
9536 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9537 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009538 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009539 CmdArgs.push_back("-m");
9540 CmdArgs.push_back("elf_i386");
9541 }
9542
Daniel Dunbarb440f562010-08-02 02:38:21 +00009543 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009544 CmdArgs.push_back("-o");
9545 CmdArgs.push_back(Output.getFilename());
9546 } else {
9547 assert(Output.isNothing() && "Invalid output.");
9548 }
9549
Douglas Katzman78b37b02015-11-17 20:28:07 +00009550 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009551 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009552 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009553 CmdArgs.push_back(
9554 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009555 else {
9556 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009557 CmdArgs.push_back(
9558 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009559 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009560 CmdArgs.push_back(
9561 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009562 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009563 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009564 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009565 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009566 CmdArgs.push_back(
9567 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009568 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009569 CmdArgs.push_back(
9570 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009571 }
9572
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009573 Args.AddAllArgs(CmdArgs,
9574 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009575
Daniel Dunbar54423b22010-09-17 00:24:54 +00009576 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009577
Douglas Katzman78b37b02015-11-17 20:28:07 +00009578 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009579 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009580
9581 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009582 CmdArgs.push_back("-rpath");
9583 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009584 }
9585
Hans Wennborg70850d82013-07-18 20:29:38 +00009586 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009587 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009588 CmdArgs.push_back("-lm");
9589 }
9590
Daniel Dunbarcc912342009-05-02 18:28:39 +00009591 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009592 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009593
9594 if (!Args.hasArg(options::OPT_nolibc)) {
9595 CmdArgs.push_back("-lc");
9596 }
9597
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009598 if (Args.hasArg(options::OPT_static) ||
9599 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009600 CmdArgs.push_back("-lgcc");
9601 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009602 } else {
9603 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009604 CmdArgs.push_back("-lgcc_pic");
9605 if (!Args.hasArg(options::OPT_shared))
9606 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009607 } else {
John McCall65b8da02013-04-11 22:55:55 +00009608 CmdArgs.push_back("-lgcc");
9609 CmdArgs.push_back("--as-needed");
9610 CmdArgs.push_back("-lgcc_pic");
9611 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009612 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009613 }
9614 }
9615
Douglas Katzman78b37b02015-11-17 20:28:07 +00009616 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009617 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009618 CmdArgs.push_back(
9619 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009620 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009621 CmdArgs.push_back(
9622 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9623 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009624 }
9625
Xinliang David Li69306c02015-10-22 06:15:31 +00009626 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009627
Logan Chieneb9162f2014-06-26 14:23:45 +00009628 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009629 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009630}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009631
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009632// Try to find Exe from a Visual Studio distribution. This first tries to find
9633// an installed copy of Visual Studio and, failing that, looks in the PATH,
9634// making sure that whatever executable that's found is not a same-named exe
9635// from clang itself to prevent clang from falling back to itself.
9636static std::string FindVisualStudioExecutable(const ToolChain &TC,
9637 const char *Exe,
9638 const char *ClangProgramPath) {
9639 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9640 std::string visualStudioBinDir;
9641 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9642 visualStudioBinDir)) {
9643 SmallString<128> FilePath(visualStudioBinDir);
9644 llvm::sys::path::append(FilePath, Exe);
9645 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9646 return FilePath.str();
9647 }
9648
9649 return Exe;
9650}
9651
Douglas Katzman95354292015-06-23 20:42:09 +00009652void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9653 const InputInfo &Output,
9654 const InputInfoList &Inputs,
9655 const ArgList &Args,
9656 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009657 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009658 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009659
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009660 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9661 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009662 CmdArgs.push_back(
9663 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009664
Douglas Katzman78b37b02015-11-17 20:28:07 +00009665 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9666 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009667 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009668
Zachary Turner10d75b22014-10-22 20:40:43 +00009669 if (!llvm::sys::Process::GetEnv("LIB")) {
9670 // If the VC environment hasn't been configured (perhaps because the user
9671 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009672 // the environment variable is set however, assume the user knows what
9673 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009674 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009675 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009676 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9677 SmallString<128> LibDir(VisualStudioDir);
9678 llvm::sys::path::append(LibDir, "VC", "lib");
9679 switch (MSVC.getArch()) {
9680 case llvm::Triple::x86:
9681 // x86 just puts the libraries directly in lib
9682 break;
9683 case llvm::Triple::x86_64:
9684 llvm::sys::path::append(LibDir, "amd64");
9685 break;
9686 case llvm::Triple::arm:
9687 llvm::sys::path::append(LibDir, "arm");
9688 break;
9689 default:
9690 break;
9691 }
9692 CmdArgs.push_back(
9693 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009694
9695 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9696 std::string UniversalCRTLibPath;
9697 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9698 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9699 UniversalCRTLibPath.c_str()));
9700 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009701 }
9702
9703 std::string WindowsSdkLibPath;
9704 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9705 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9706 WindowsSdkLibPath.c_str()));
9707 }
9708
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009709 CmdArgs.push_back("-nologo");
9710
Reid Kleckner124955a2015-08-05 18:51:13 +00009711 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009712 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009713
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009714 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009715 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009716 if (DLL) {
9717 CmdArgs.push_back(Args.MakeArgString("-dll"));
9718
9719 SmallString<128> ImplibName(Output.getFilename());
9720 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009721 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009722 }
9723
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009724 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009725 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009726 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009727 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009728 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9729 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009730 // Make sure the dynamic runtime thunk is not optimized out at link time
9731 // to ensure proper SEH handling.
9732 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009733 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009734 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009735 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009736 for (const auto &Lib : {"asan", "asan_cxx"})
9737 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009738 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009739 }
9740
Hans Wennborg2e274592013-08-13 23:38:57 +00009741 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009742
Alexey Bataevc7e84352015-08-19 04:49:01 +00009743 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9744 options::OPT_fno_openmp, false)) {
9745 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9746 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9747 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9748 TC.getDriver().Dir + "/../lib"));
9749 switch (getOpenMPRuntime(getToolChain(), Args)) {
9750 case OMPRT_OMP:
9751 CmdArgs.push_back("-defaultlib:libomp.lib");
9752 break;
9753 case OMPRT_IOMP5:
9754 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9755 break;
9756 case OMPRT_GOMP:
9757 break;
9758 case OMPRT_Unknown:
9759 // Already diagnosed.
9760 break;
9761 }
9762 }
9763
Andrey Turetskiya4868572016-03-14 11:19:43 +00009764 // Add compiler-rt lib in case if it was explicitly
9765 // specified as an argument for --rtlib option.
9766 if (!Args.hasArg(options::OPT_nostdlib)) {
9767 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9768 }
9769
Reid Kleckner337188f2014-09-16 19:22:00 +00009770 // Add filenames, libraries, and other linker inputs.
9771 for (const auto &Input : Inputs) {
9772 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009773 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009774 continue;
9775 }
9776
9777 const Arg &A = Input.getInputArg();
9778
9779 // Render -l options differently for the MSVC linker.
9780 if (A.getOption().matches(options::OPT_l)) {
9781 StringRef Lib = A.getValue();
9782 const char *LinkLibArg;
9783 if (Lib.endswith(".lib"))
9784 LinkLibArg = Args.MakeArgString(Lib);
9785 else
9786 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9787 CmdArgs.push_back(LinkLibArg);
9788 continue;
9789 }
9790
9791 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9792 // or -L. Render it, even if MSVC doesn't understand it.
9793 A.renderAsInput(Args, CmdArgs);
9794 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009795
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009796 TC.addProfileRTLibs(Args, CmdArgs);
9797
Zachary Turner719f58c2014-12-01 23:06:47 +00009798 // We need to special case some linker paths. In the case of lld, we need to
9799 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9800 // linker, we need to use a special search algorithm.
9801 llvm::SmallString<128> linkPath;
9802 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9803 if (Linker.equals_lower("lld"))
9804 Linker = "lld-link";
9805
9806 if (Linker.equals_lower("link")) {
9807 // If we're using the MSVC linker, it's not sufficient to just use link
9808 // from the program PATH, because other environments like GnuWin32 install
9809 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009810 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009811 C.getDriver().getClangProgramPath());
9812 } else {
9813 linkPath = Linker;
9814 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009815 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009816 }
9817
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009818 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009819 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009820}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009821
Douglas Katzman95354292015-06-23 20:42:09 +00009822void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9823 const InputInfo &Output,
9824 const InputInfoList &Inputs,
9825 const ArgList &Args,
9826 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009827 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9828}
9829
Douglas Katzman95354292015-06-23 20:42:09 +00009830std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009831 Compilation &C, const JobAction &JA, const InputInfo &Output,
9832 const InputInfoList &Inputs, const ArgList &Args,
9833 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009834 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009835 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009836 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009837 CmdArgs.push_back("/W0"); // No warnings.
9838
9839 // The goal is to be able to invoke this tool correctly based on
9840 // any flag accepted by clang-cl.
9841
9842 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009843 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009844
9845 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009846 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9847 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9848 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009849 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9850 if (A->getOption().getID() == options::OPT_O0) {
9851 CmdArgs.push_back("/Od");
9852 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009853 CmdArgs.push_back("/Og");
9854
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009855 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009856 if (OptLevel == "s" || OptLevel == "z")
9857 CmdArgs.push_back("/Os");
9858 else
9859 CmdArgs.push_back("/Ot");
9860
9861 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009862 }
9863 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009864 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9865 options::OPT_fno_omit_frame_pointer))
9866 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9867 ? "/Oy"
9868 : "/Oy-");
9869 if (!Args.hasArg(options::OPT_fwritable_strings))
9870 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009871
Nico Weber3f8dafb2015-03-12 19:37:10 +00009872 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009873 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9874
David Majnemerf6072342014-07-01 22:24:56 +00009875 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9876 /*default=*/false))
9877 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009878 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9879 options::OPT_fno_function_sections))
9880 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9881 ? "/Gy"
9882 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009883 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9884 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009885 CmdArgs.push_back(
9886 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009887 if (Args.hasArg(options::OPT_fsyntax_only))
9888 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009889 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9890 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009891 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009892
Nico Weber3f8dafb2015-03-12 19:37:10 +00009893 std::vector<std::string> Includes =
9894 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009895 for (const auto &Include : Includes)
9896 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009897
Hans Wennborg87cfa712013-09-19 20:32:16 +00009898 // Flags that can simply be passed through.
9899 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9900 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009901 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9902 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009903 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009904 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009905
9906 // The order of these flags is relevant, so pick the last one.
9907 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9908 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9909 A->render(Args, CmdArgs);
9910
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009911 // Pass through all unknown arguments so that the fallback command can see
9912 // them too.
9913 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9914
Hans Wennborg87cfa712013-09-19 20:32:16 +00009915 // Input filename.
9916 assert(Inputs.size() == 1);
9917 const InputInfo &II = Inputs[0];
9918 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9919 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9920 if (II.isFilename())
9921 CmdArgs.push_back(II.getFilename());
9922 else
9923 II.getInputArg().renderAsInput(Args, CmdArgs);
9924
9925 // Output filename.
9926 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009927 const char *Fo =
9928 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009929 CmdArgs.push_back(Fo);
9930
Hans Wennborg188382e2013-09-20 18:16:35 +00009931 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009932 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9933 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009934 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009935 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009936}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009937
Yaron Keren1c0070c2015-07-02 04:45:27 +00009938/// MinGW Tools
9939void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9940 const InputInfo &Output,
9941 const InputInfoList &Inputs,
9942 const ArgList &Args,
9943 const char *LinkingOutput) const {
9944 claimNoWarnArgs(Args);
9945 ArgStringList CmdArgs;
9946
9947 if (getToolChain().getArch() == llvm::Triple::x86) {
9948 CmdArgs.push_back("--32");
9949 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9950 CmdArgs.push_back("--64");
9951 }
9952
9953 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9954
9955 CmdArgs.push_back("-o");
9956 CmdArgs.push_back(Output.getFilename());
9957
9958 for (const auto &II : Inputs)
9959 CmdArgs.push_back(II.getFilename());
9960
9961 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009962 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009963
9964 if (Args.hasArg(options::OPT_gsplit_dwarf))
9965 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9966 SplitDebugName(Args, Inputs[0]));
9967}
9968
9969void MinGW::Linker::AddLibGCC(const ArgList &Args,
9970 ArgStringList &CmdArgs) const {
9971 if (Args.hasArg(options::OPT_mthreads))
9972 CmdArgs.push_back("-lmingwthrd");
9973 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009974
Yaron Kerenaa281332015-08-09 00:24:07 +00009975 // Make use of compiler-rt if --rtlib option is used
9976 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9977 if (RLT == ToolChain::RLT_Libgcc) {
9978 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9979 Args.hasArg(options::OPT_static);
9980 bool Shared = Args.hasArg(options::OPT_shared);
9981 bool CXX = getToolChain().getDriver().CCCIsCXX();
9982
9983 if (Static || (!CXX && !Shared)) {
9984 CmdArgs.push_back("-lgcc");
9985 CmdArgs.push_back("-lgcc_eh");
9986 } else {
9987 CmdArgs.push_back("-lgcc_s");
9988 CmdArgs.push_back("-lgcc");
9989 }
9990 } else {
9991 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9992 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009993
Yaron Keren1c0070c2015-07-02 04:45:27 +00009994 CmdArgs.push_back("-lmoldname");
9995 CmdArgs.push_back("-lmingwex");
9996 CmdArgs.push_back("-lmsvcrt");
9997}
9998
9999void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10000 const InputInfo &Output,
10001 const InputInfoList &Inputs,
10002 const ArgList &Args,
10003 const char *LinkingOutput) const {
10004 const ToolChain &TC = getToolChain();
10005 const Driver &D = TC.getDriver();
10006 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10007
10008 ArgStringList CmdArgs;
10009
10010 // Silence warning for "clang -g foo.o -o foo"
10011 Args.ClaimAllArgs(options::OPT_g_Group);
10012 // and "clang -emit-llvm foo.o -o foo"
10013 Args.ClaimAllArgs(options::OPT_emit_llvm);
10014 // and for "clang -w foo.o -o foo". Other warning options are already
10015 // handled somewhere else.
10016 Args.ClaimAllArgs(options::OPT_w);
10017
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010018 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10019 if (LinkerName.equals_lower("lld")) {
10020 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010021 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010022 } else if (!LinkerName.equals_lower("ld")) {
10023 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010024 }
10025
Yaron Keren1c0070c2015-07-02 04:45:27 +000010026 if (!D.SysRoot.empty())
10027 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10028
10029 if (Args.hasArg(options::OPT_s))
10030 CmdArgs.push_back("-s");
10031
10032 CmdArgs.push_back("-m");
10033 if (TC.getArch() == llvm::Triple::x86)
10034 CmdArgs.push_back("i386pe");
10035 if (TC.getArch() == llvm::Triple::x86_64)
10036 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010037 if (TC.getArch() == llvm::Triple::arm)
10038 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010039
10040 if (Args.hasArg(options::OPT_mwindows)) {
10041 CmdArgs.push_back("--subsystem");
10042 CmdArgs.push_back("windows");
10043 } else if (Args.hasArg(options::OPT_mconsole)) {
10044 CmdArgs.push_back("--subsystem");
10045 CmdArgs.push_back("console");
10046 }
10047
10048 if (Args.hasArg(options::OPT_static))
10049 CmdArgs.push_back("-Bstatic");
10050 else {
10051 if (Args.hasArg(options::OPT_mdll))
10052 CmdArgs.push_back("--dll");
10053 else if (Args.hasArg(options::OPT_shared))
10054 CmdArgs.push_back("--shared");
10055 CmdArgs.push_back("-Bdynamic");
10056 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10057 CmdArgs.push_back("-e");
10058 if (TC.getArch() == llvm::Triple::x86)
10059 CmdArgs.push_back("_DllMainCRTStartup@12");
10060 else
10061 CmdArgs.push_back("DllMainCRTStartup");
10062 CmdArgs.push_back("--enable-auto-image-base");
10063 }
10064 }
10065
10066 CmdArgs.push_back("-o");
10067 CmdArgs.push_back(Output.getFilename());
10068
10069 Args.AddAllArgs(CmdArgs, options::OPT_e);
10070 // FIXME: add -N, -n flags
10071 Args.AddLastArg(CmdArgs, options::OPT_r);
10072 Args.AddLastArg(CmdArgs, options::OPT_s);
10073 Args.AddLastArg(CmdArgs, options::OPT_t);
10074 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10075 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10076
Douglas Katzman78b37b02015-11-17 20:28:07 +000010077 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010078 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10079 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10080 } else {
10081 if (Args.hasArg(options::OPT_municode))
10082 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10083 else
10084 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10085 }
10086 if (Args.hasArg(options::OPT_pg))
10087 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10088 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10089 }
10090
10091 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010092 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010093 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10094
10095 // TODO: Add ASan stuff here
10096
10097 // TODO: Add profile stuff here
10098
Douglas Katzman78b37b02015-11-17 20:28:07 +000010099 if (D.CCCIsCXX() &&
10100 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010101 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10102 !Args.hasArg(options::OPT_static);
10103 if (OnlyLibstdcxxStatic)
10104 CmdArgs.push_back("-Bstatic");
10105 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10106 if (OnlyLibstdcxxStatic)
10107 CmdArgs.push_back("-Bdynamic");
10108 }
10109
10110 if (!Args.hasArg(options::OPT_nostdlib)) {
10111 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10112 if (Args.hasArg(options::OPT_static))
10113 CmdArgs.push_back("--start-group");
10114
10115 if (Args.hasArg(options::OPT_fstack_protector) ||
10116 Args.hasArg(options::OPT_fstack_protector_strong) ||
10117 Args.hasArg(options::OPT_fstack_protector_all)) {
10118 CmdArgs.push_back("-lssp_nonshared");
10119 CmdArgs.push_back("-lssp");
10120 }
10121 if (Args.hasArg(options::OPT_fopenmp))
10122 CmdArgs.push_back("-lgomp");
10123
10124 AddLibGCC(Args, CmdArgs);
10125
10126 if (Args.hasArg(options::OPT_pg))
10127 CmdArgs.push_back("-lgmon");
10128
Yaron Kerenadce68e2015-07-06 18:52:19 +000010129 if (Args.hasArg(options::OPT_pthread))
10130 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010131
10132 // add system libraries
10133 if (Args.hasArg(options::OPT_mwindows)) {
10134 CmdArgs.push_back("-lgdi32");
10135 CmdArgs.push_back("-lcomdlg32");
10136 }
10137 CmdArgs.push_back("-ladvapi32");
10138 CmdArgs.push_back("-lshell32");
10139 CmdArgs.push_back("-luser32");
10140 CmdArgs.push_back("-lkernel32");
10141
10142 if (Args.hasArg(options::OPT_static))
10143 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010144 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010145 AddLibGCC(Args, CmdArgs);
10146 }
10147
10148 if (!Args.hasArg(options::OPT_nostartfiles)) {
10149 // Add crtfastmath.o if available and fast math is enabled.
10150 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10151
10152 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10153 }
10154 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010155 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010156 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010157}
10158
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010159/// XCore Tools
10160// We pass assemble and link construction to the xcc tool.
10161
Douglas Katzman95354292015-06-23 20:42:09 +000010162void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10163 const InputInfo &Output,
10164 const InputInfoList &Inputs,
10165 const ArgList &Args,
10166 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010167 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010168 ArgStringList CmdArgs;
10169
10170 CmdArgs.push_back("-o");
10171 CmdArgs.push_back(Output.getFilename());
10172
10173 CmdArgs.push_back("-c");
10174
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010175 if (Args.hasArg(options::OPT_v))
10176 CmdArgs.push_back("-v");
10177
Robert Lytton894d25c2014-05-02 09:33:25 +000010178 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10179 if (!A->getOption().matches(options::OPT_g0))
10180 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010181
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010182 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10183 false))
10184 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010185
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010186 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010187
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010188 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010189 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010190
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010191 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010192 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010193}
10194
Douglas Katzman95354292015-06-23 20:42:09 +000010195void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10196 const InputInfo &Output,
10197 const InputInfoList &Inputs,
10198 const ArgList &Args,
10199 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010200 ArgStringList CmdArgs;
10201
10202 if (Output.isFilename()) {
10203 CmdArgs.push_back("-o");
10204 CmdArgs.push_back(Output.getFilename());
10205 } else {
10206 assert(Output.isNothing() && "Invalid output.");
10207 }
10208
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010209 if (Args.hasArg(options::OPT_v))
10210 CmdArgs.push_back("-v");
10211
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010212 // Pass -fexceptions through to the linker if it was present.
10213 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10214 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010215 CmdArgs.push_back("-fexceptions");
10216
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010217 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10218
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010219 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010220 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010221}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010222
Douglas Katzman95354292015-06-23 20:42:09 +000010223void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10224 const InputInfo &Output,
10225 const InputInfoList &Inputs,
10226 const ArgList &Args,
10227 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010228 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010229 const auto &TC =
10230 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10231 ArgStringList CmdArgs;
10232 const char *Exec;
10233
10234 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010235 default:
10236 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010237 case llvm::Triple::arm:
10238 case llvm::Triple::thumb:
10239 break;
10240 case llvm::Triple::x86:
10241 CmdArgs.push_back("--32");
10242 break;
10243 case llvm::Triple::x86_64:
10244 CmdArgs.push_back("--64");
10245 break;
10246 }
10247
10248 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10249
10250 CmdArgs.push_back("-o");
10251 CmdArgs.push_back(Output.getFilename());
10252
10253 for (const auto &Input : Inputs)
10254 CmdArgs.push_back(Input.getFilename());
10255
10256 const std::string Assembler = TC.GetProgramPath("as");
10257 Exec = Args.MakeArgString(Assembler);
10258
Justin Bognerd3371d82015-07-17 03:35:54 +000010259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010260}
10261
Douglas Katzman95354292015-06-23 20:42:09 +000010262void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10263 const InputInfo &Output,
10264 const InputInfoList &Inputs,
10265 const ArgList &Args,
10266 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010267 const auto &TC =
10268 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10269 const llvm::Triple &T = TC.getTriple();
10270 const Driver &D = TC.getDriver();
10271 SmallString<128> EntryPoint;
10272 ArgStringList CmdArgs;
10273 const char *Exec;
10274
10275 // Silence warning for "clang -g foo.o -o foo"
10276 Args.ClaimAllArgs(options::OPT_g_Group);
10277 // and "clang -emit-llvm foo.o -o foo"
10278 Args.ClaimAllArgs(options::OPT_emit_llvm);
10279 // and for "clang -w foo.o -o foo"
10280 Args.ClaimAllArgs(options::OPT_w);
10281 // Other warning options are already handled somewhere else.
10282
10283 if (!D.SysRoot.empty())
10284 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10285
10286 if (Args.hasArg(options::OPT_pie))
10287 CmdArgs.push_back("-pie");
10288 if (Args.hasArg(options::OPT_rdynamic))
10289 CmdArgs.push_back("-export-dynamic");
10290 if (Args.hasArg(options::OPT_s))
10291 CmdArgs.push_back("--strip-all");
10292
10293 CmdArgs.push_back("-m");
10294 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010295 default:
10296 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010297 case llvm::Triple::arm:
10298 case llvm::Triple::thumb:
10299 // FIXME: this is incorrect for WinCE
10300 CmdArgs.push_back("thumb2pe");
10301 break;
10302 case llvm::Triple::x86:
10303 CmdArgs.push_back("i386pe");
10304 EntryPoint.append("_");
10305 break;
10306 case llvm::Triple::x86_64:
10307 CmdArgs.push_back("i386pep");
10308 break;
10309 }
10310
10311 if (Args.hasArg(options::OPT_shared)) {
10312 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010313 default:
10314 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010315 case llvm::Triple::arm:
10316 case llvm::Triple::thumb:
10317 case llvm::Triple::x86_64:
10318 EntryPoint.append("_DllMainCRTStartup");
10319 break;
10320 case llvm::Triple::x86:
10321 EntryPoint.append("_DllMainCRTStartup@12");
10322 break;
10323 }
10324
10325 CmdArgs.push_back("-shared");
10326 CmdArgs.push_back("-Bdynamic");
10327
10328 CmdArgs.push_back("--enable-auto-image-base");
10329
10330 CmdArgs.push_back("--entry");
10331 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10332 } else {
10333 EntryPoint.append("mainCRTStartup");
10334
10335 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10336 : "-Bdynamic");
10337
Douglas Katzman78b37b02015-11-17 20:28:07 +000010338 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010339 CmdArgs.push_back("--entry");
10340 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10341 }
10342
10343 // FIXME: handle subsystem
10344 }
10345
10346 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010347 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010348
10349 CmdArgs.push_back("-o");
10350 CmdArgs.push_back(Output.getFilename());
10351
10352 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10353 SmallString<261> ImpLib(Output.getFilename());
10354 llvm::sys::path::replace_extension(ImpLib, ".lib");
10355
10356 CmdArgs.push_back("--out-implib");
10357 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10358 }
10359
Douglas Katzman78b37b02015-11-17 20:28:07 +000010360 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010361 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10362 const char *CRTBegin;
10363
10364 CRTBegin =
10365 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10366 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10367 }
10368
10369 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010370 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010371 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10372
10373 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10374 !Args.hasArg(options::OPT_nodefaultlibs)) {
10375 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10376 !Args.hasArg(options::OPT_static);
10377 if (StaticCXX)
10378 CmdArgs.push_back("-Bstatic");
10379 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10380 if (StaticCXX)
10381 CmdArgs.push_back("-Bdynamic");
10382 }
10383
10384 if (!Args.hasArg(options::OPT_nostdlib)) {
10385 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10386 // TODO handle /MT[d] /MD[d]
10387 CmdArgs.push_back("-lmsvcrt");
10388 AddRunTimeLibs(TC, D, CmdArgs, Args);
10389 }
10390 }
10391
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010392 if (TC.getSanitizerArgs().needsAsanRt()) {
10393 // TODO handle /MT[d] /MD[d]
10394 if (Args.hasArg(options::OPT_shared)) {
10395 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10396 } else {
10397 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10398 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10399 // Make sure the dynamic runtime thunk is not optimized out at link time
10400 // to ensure proper SEH handling.
10401 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10402 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10403 ? "___asan_seh_interceptor"
10404 : "__asan_seh_interceptor"));
10405 }
10406 }
10407
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010408 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010409
Justin Bognerd3371d82015-07-17 03:35:54 +000010410 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010411}
Douglas Katzman84a75642015-06-19 14:55:19 +000010412
Douglas Katzman95354292015-06-23 20:42:09 +000010413void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10414 const InputInfo &Output,
10415 const InputInfoList &Inputs,
10416 const ArgList &Args,
10417 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010418 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010419 assert(Inputs.size() == 1);
10420 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010421 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10422 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010423
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010424 if (JA.getKind() == Action::PreprocessJobClass) {
10425 Args.ClaimAllArgs();
10426 CmdArgs.push_back("-E");
10427 } else {
10428 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10429 CmdArgs.push_back("-S");
10430 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10431 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010432 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010433
Douglas Katzmanf6071112015-08-03 14:34:22 +000010434 // Append all -I, -iquote, -isystem paths, defines/undefines,
10435 // 'f' flags, optimize flags, and warning options.
10436 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010437 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010438 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010439 options::OPT_f_Group, options::OPT_f_clang_Group,
10440 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010441 options::OPT_O_Group, options::OPT_W_Group,
10442 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010443
10444 // If we're producing a dependency file, and assembly is the final action,
10445 // then the name of the target in the dependency file should be the '.o'
10446 // file, not the '.s' file produced by this step. For example, instead of
10447 // /tmp/mumble.s: mumble.c .../someheader.h
10448 // the filename on the lefthand side should be "mumble.o"
10449 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10450 C.getActions().size() == 1 &&
10451 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10452 Arg *A = Args.getLastArg(options::OPT_o);
10453 if (A) {
10454 CmdArgs.push_back("-MT");
10455 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10456 }
10457 }
10458
Douglas Katzman84a75642015-06-19 14:55:19 +000010459 CmdArgs.push_back(II.getFilename());
10460 CmdArgs.push_back("-o");
10461 CmdArgs.push_back(Output.getFilename());
10462
10463 std::string Exec =
10464 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010465 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10466 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010467}
10468
Douglas Katzman95354292015-06-23 20:42:09 +000010469void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10470 const InputInfo &Output,
10471 const InputInfoList &Inputs,
10472 const ArgList &Args,
10473 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010474 ArgStringList CmdArgs;
10475
10476 assert(Inputs.size() == 1);
10477 const InputInfo &II = Inputs[0];
10478 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10479 assert(Output.getType() == types::TY_Object);
10480
10481 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010482 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10483 if (CPUArg)
10484 CmdArgs.push_back(
10485 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010486 CmdArgs.push_back("-noSPrefixing");
10487 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010488 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10489 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10490 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010491 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010492 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010493 }
10494 CmdArgs.push_back("-elf"); // Output format.
10495 CmdArgs.push_back(II.getFilename());
10496 CmdArgs.push_back(
10497 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10498
10499 std::string Exec =
10500 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010501 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10502 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010503}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010504
10505void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10506 const InputInfo &Output,
10507 const InputInfoList &Inputs,
10508 const ArgList &Args,
10509 const char *LinkingOutput) const {
10510 const auto &TC =
10511 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10512 const llvm::Triple &T = TC.getTriple();
10513 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010514 bool UseStartfiles =
10515 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010516 bool UseDefaultLibs =
10517 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010518
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010519 if (T.getArch() == llvm::Triple::sparc)
10520 CmdArgs.push_back("-EB");
10521 else // SHAVE assumes little-endian, and sparcel is expressly so.
10522 CmdArgs.push_back("-EL");
10523
10524 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10525 // but we never pass through a --sysroot option and various other bits.
10526 // For example, there are no sanitizers (yet) nor gold linker.
10527
10528 // Eat some arguments that may be present but have no effect.
10529 Args.ClaimAllArgs(options::OPT_g_Group);
10530 Args.ClaimAllArgs(options::OPT_w);
10531 Args.ClaimAllArgs(options::OPT_static_libgcc);
10532
10533 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10534 CmdArgs.push_back("-s");
10535
10536 CmdArgs.push_back("-o");
10537 CmdArgs.push_back(Output.getFilename());
10538
10539 if (UseStartfiles) {
10540 // If you want startfiles, it means you want the builtin crti and crtbegin,
10541 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010542 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10543 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010544 }
10545
10546 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10547 options::OPT_e, options::OPT_s, options::OPT_t,
10548 options::OPT_Z_Flag, options::OPT_r});
10549
Douglas Katzman674a3122015-11-18 16:24:46 +000010550 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010551
10552 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10553
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010554 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010555 if (C.getDriver().CCCIsCXX())
10556 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010557 if (T.getOS() == llvm::Triple::RTEMS) {
10558 CmdArgs.push_back("--start-group");
10559 CmdArgs.push_back("-lc");
10560 // You must provide your own "-L" option to enable finding these.
10561 CmdArgs.push_back("-lrtemscpu");
10562 CmdArgs.push_back("-lrtemsbsp");
10563 CmdArgs.push_back("--end-group");
10564 } else {
10565 CmdArgs.push_back("-lc");
10566 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010567 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010568 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010569 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010570 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10571 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010572 }
10573
10574 std::string Exec =
10575 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10576 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10577 CmdArgs, Inputs));
10578}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010579
10580void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10581 const InputInfo &Output,
10582 const InputInfoList &Inputs,
10583 const ArgList &Args,
10584 const char *LinkingOutput) const {
10585 claimNoWarnArgs(Args);
10586 ArgStringList CmdArgs;
10587
10588 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10589
10590 CmdArgs.push_back("-o");
10591 CmdArgs.push_back(Output.getFilename());
10592
10593 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10594 const InputInfo &Input = Inputs[0];
10595 assert(Input.isFilename() && "Invalid input.");
10596 CmdArgs.push_back(Input.getFilename());
10597
10598 const char *Exec =
10599 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10600 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10601}
10602
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010603static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10604 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10605 if (SanArgs.needsUbsanRt()) {
10606 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10607 }
10608 if (SanArgs.needsAsanRt()) {
10609 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10610 }
10611}
10612
10613static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10614 const JobAction &JA, const InputInfo &Output,
10615 const InputInfoList &Inputs,
10616 const ArgList &Args,
10617 const char *LinkingOutput) {
10618 const toolchains::FreeBSD &ToolChain =
10619 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10620 const Driver &D = ToolChain.getDriver();
10621 ArgStringList CmdArgs;
10622
10623 // Silence warning for "clang -g foo.o -o foo"
10624 Args.ClaimAllArgs(options::OPT_g_Group);
10625 // and "clang -emit-llvm foo.o -o foo"
10626 Args.ClaimAllArgs(options::OPT_emit_llvm);
10627 // and for "clang -w foo.o -o foo". Other warning options are already
10628 // handled somewhere else.
10629 Args.ClaimAllArgs(options::OPT_w);
10630
10631 if (!D.SysRoot.empty())
10632 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10633
10634 if (Args.hasArg(options::OPT_pie))
10635 CmdArgs.push_back("-pie");
10636
10637 if (Args.hasArg(options::OPT_rdynamic))
10638 CmdArgs.push_back("-export-dynamic");
10639 if (Args.hasArg(options::OPT_shared))
10640 CmdArgs.push_back("--oformat=so");
10641
10642 if (Output.isFilename()) {
10643 CmdArgs.push_back("-o");
10644 CmdArgs.push_back(Output.getFilename());
10645 } else {
10646 assert(Output.isNothing() && "Invalid output.");
10647 }
10648
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010649 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10650
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010651 Args.AddAllArgs(CmdArgs, options::OPT_L);
10652 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10653 Args.AddAllArgs(CmdArgs, options::OPT_e);
10654 Args.AddAllArgs(CmdArgs, options::OPT_s);
10655 Args.AddAllArgs(CmdArgs, options::OPT_t);
10656 Args.AddAllArgs(CmdArgs, options::OPT_r);
10657
10658 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10659 CmdArgs.push_back("--no-demangle");
10660
10661 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10662
10663 if (Args.hasArg(options::OPT_pthread)) {
10664 CmdArgs.push_back("-lpthread");
10665 }
10666
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010667 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10668
10669 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10670}
10671
10672static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10673 const JobAction &JA, const InputInfo &Output,
10674 const InputInfoList &Inputs,
10675 const ArgList &Args,
10676 const char *LinkingOutput) {
10677 const toolchains::FreeBSD &ToolChain =
10678 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10679 const Driver &D = ToolChain.getDriver();
10680 ArgStringList CmdArgs;
10681
10682 // Silence warning for "clang -g foo.o -o foo"
10683 Args.ClaimAllArgs(options::OPT_g_Group);
10684 // and "clang -emit-llvm foo.o -o foo"
10685 Args.ClaimAllArgs(options::OPT_emit_llvm);
10686 // and for "clang -w foo.o -o foo". Other warning options are already
10687 // handled somewhere else.
10688 Args.ClaimAllArgs(options::OPT_w);
10689
10690 if (!D.SysRoot.empty())
10691 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10692
10693 if (Args.hasArg(options::OPT_pie))
10694 CmdArgs.push_back("-pie");
10695
10696 if (Args.hasArg(options::OPT_static)) {
10697 CmdArgs.push_back("-Bstatic");
10698 } else {
10699 if (Args.hasArg(options::OPT_rdynamic))
10700 CmdArgs.push_back("-export-dynamic");
10701 CmdArgs.push_back("--eh-frame-hdr");
10702 if (Args.hasArg(options::OPT_shared)) {
10703 CmdArgs.push_back("-Bshareable");
10704 } else {
10705 CmdArgs.push_back("-dynamic-linker");
10706 CmdArgs.push_back("/libexec/ld-elf.so.1");
10707 }
10708 CmdArgs.push_back("--enable-new-dtags");
10709 }
10710
10711 if (Output.isFilename()) {
10712 CmdArgs.push_back("-o");
10713 CmdArgs.push_back(Output.getFilename());
10714 } else {
10715 assert(Output.isNothing() && "Invalid output.");
10716 }
10717
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010718 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10719
Douglas Katzman78b37b02015-11-17 20:28:07 +000010720 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010721 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010722 if (!Args.hasArg(options::OPT_shared)) {
10723 if (Args.hasArg(options::OPT_pg))
10724 crt1 = "gcrt1.o";
10725 else if (Args.hasArg(options::OPT_pie))
10726 crt1 = "Scrt1.o";
10727 else
10728 crt1 = "crt1.o";
10729 }
10730 if (crt1)
10731 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10732
10733 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10734
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010735 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010736 if (Args.hasArg(options::OPT_static))
10737 crtbegin = "crtbeginT.o";
10738 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10739 crtbegin = "crtbeginS.o";
10740 else
10741 crtbegin = "crtbegin.o";
10742
10743 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10744 }
10745
10746 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010747 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010748 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10749 Args.AddAllArgs(CmdArgs, options::OPT_e);
10750 Args.AddAllArgs(CmdArgs, options::OPT_s);
10751 Args.AddAllArgs(CmdArgs, options::OPT_t);
10752 Args.AddAllArgs(CmdArgs, options::OPT_r);
10753
10754 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10755 CmdArgs.push_back("--no-demangle");
10756
10757 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10758
Douglas Katzman78b37b02015-11-17 20:28:07 +000010759 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010760 // For PS4, we always want to pass libm, libstdc++ and libkernel
10761 // libraries for both C and C++ compilations.
10762 CmdArgs.push_back("-lkernel");
10763 if (D.CCCIsCXX()) {
10764 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10765 if (Args.hasArg(options::OPT_pg))
10766 CmdArgs.push_back("-lm_p");
10767 else
10768 CmdArgs.push_back("-lm");
10769 }
10770 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10771 // the default system libraries. Just mimic this for now.
10772 if (Args.hasArg(options::OPT_pg))
10773 CmdArgs.push_back("-lgcc_p");
10774 else
10775 CmdArgs.push_back("-lcompiler_rt");
10776 if (Args.hasArg(options::OPT_static)) {
10777 CmdArgs.push_back("-lstdc++");
10778 } else if (Args.hasArg(options::OPT_pg)) {
10779 CmdArgs.push_back("-lgcc_eh_p");
10780 } else {
10781 CmdArgs.push_back("--as-needed");
10782 CmdArgs.push_back("-lstdc++");
10783 CmdArgs.push_back("--no-as-needed");
10784 }
10785
10786 if (Args.hasArg(options::OPT_pthread)) {
10787 if (Args.hasArg(options::OPT_pg))
10788 CmdArgs.push_back("-lpthread_p");
10789 else
10790 CmdArgs.push_back("-lpthread");
10791 }
10792
10793 if (Args.hasArg(options::OPT_pg)) {
10794 if (Args.hasArg(options::OPT_shared))
10795 CmdArgs.push_back("-lc");
10796 else {
10797 if (Args.hasArg(options::OPT_static)) {
10798 CmdArgs.push_back("--start-group");
10799 CmdArgs.push_back("-lc_p");
10800 CmdArgs.push_back("-lpthread_p");
10801 CmdArgs.push_back("--end-group");
10802 } else {
10803 CmdArgs.push_back("-lc_p");
10804 }
10805 }
10806 CmdArgs.push_back("-lgcc_p");
10807 } else {
10808 if (Args.hasArg(options::OPT_static)) {
10809 CmdArgs.push_back("--start-group");
10810 CmdArgs.push_back("-lc");
10811 CmdArgs.push_back("-lpthread");
10812 CmdArgs.push_back("--end-group");
10813 } else {
10814 CmdArgs.push_back("-lc");
10815 }
10816 CmdArgs.push_back("-lcompiler_rt");
10817 }
10818
10819 if (Args.hasArg(options::OPT_static)) {
10820 CmdArgs.push_back("-lstdc++");
10821 } else if (Args.hasArg(options::OPT_pg)) {
10822 CmdArgs.push_back("-lgcc_eh_p");
10823 } else {
10824 CmdArgs.push_back("--as-needed");
10825 CmdArgs.push_back("-lstdc++");
10826 CmdArgs.push_back("--no-as-needed");
10827 }
10828 }
10829
Douglas Katzman78b37b02015-11-17 20:28:07 +000010830 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010831 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10832 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10833 else
10834 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10835 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10836 }
10837
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010838 const char *Exec =
10839#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010840 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010841#else
10842 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10843#endif
10844
10845 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10846}
10847
10848void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10849 const InputInfo &Output,
10850 const InputInfoList &Inputs,
10851 const ArgList &Args,
10852 const char *LinkingOutput) const {
10853 const toolchains::FreeBSD &ToolChain =
10854 static_cast<const toolchains::FreeBSD &>(getToolChain());
10855 const Driver &D = ToolChain.getDriver();
10856 bool PS4Linker;
10857 StringRef LinkerOptName;
10858 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10859 LinkerOptName = A->getValue();
10860 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10861 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10862 }
10863
10864 if (LinkerOptName == "gold")
10865 PS4Linker = false;
10866 else if (LinkerOptName == "ps4")
10867 PS4Linker = true;
10868 else
10869 PS4Linker = !Args.hasArg(options::OPT_shared);
10870
10871 if (PS4Linker)
10872 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10873 else
10874 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10875}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010876
10877void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10878 const InputInfo &Output,
10879 const InputInfoList &Inputs,
10880 const ArgList &Args,
10881 const char *LinkingOutput) const {
10882 const auto &TC =
10883 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010884 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010885
10886 std::vector<std::string> gpu_archs =
10887 Args.getAllArgValues(options::OPT_march_EQ);
10888 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10889 const std::string& gpu_arch = gpu_archs[0];
10890
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010891 ArgStringList CmdArgs;
10892 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010893 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10894 // ptxas does not accept -g option if optimization is enabled, so
10895 // we ignore the compiler's -O* options if we want debug info.
10896 CmdArgs.push_back("-g");
10897 CmdArgs.push_back("--dont-merge-basicblocks");
10898 CmdArgs.push_back("--return-at-end");
10899 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10900 // Map the -O we received to -O{0,1,2,3}.
10901 //
10902 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10903 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010904
Justin Lebar2836dcd2016-01-19 19:52:21 +000010905 // -O3 seems like the least-bad option when -Osomething is specified to
10906 // clang but it isn't handled below.
10907 StringRef OOpt = "3";
10908 if (A->getOption().matches(options::OPT_O4) ||
10909 A->getOption().matches(options::OPT_Ofast))
10910 OOpt = "3";
10911 else if (A->getOption().matches(options::OPT_O0))
10912 OOpt = "0";
10913 else if (A->getOption().matches(options::OPT_O)) {
10914 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10915 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10916 .Case("1", "1")
10917 .Case("2", "2")
10918 .Case("3", "3")
10919 .Case("s", "2")
10920 .Case("z", "2")
10921 .Default("2");
10922 }
10923 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10924 } else {
10925 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10926 // to no optimizations, but ptxas's default is -O3.
10927 CmdArgs.push_back("-O0");
10928 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010929
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010930 CmdArgs.push_back("--gpu-name");
10931 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10932 CmdArgs.push_back("--output-file");
10933 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10934 for (const auto& II : Inputs)
10935 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10936
10937 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10938 CmdArgs.push_back(Args.MakeArgString(A));
10939
10940 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10941 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10942}
10943
10944// All inputs to this linker must be from CudaDeviceActions, as we need to look
10945// at the Inputs' Actions in order to figure out which GPU architecture they
10946// correspond to.
10947void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10948 const InputInfo &Output,
10949 const InputInfoList &Inputs,
10950 const ArgList &Args,
10951 const char *LinkingOutput) const {
10952 const auto &TC =
10953 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010954 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010955
10956 ArgStringList CmdArgs;
10957 CmdArgs.push_back("--cuda");
10958 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10959 CmdArgs.push_back(Args.MakeArgString("--create"));
10960 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10961
10962 for (const auto& II : Inputs) {
10963 auto* A = cast<const CudaDeviceAction>(II.getAction());
10964 // We need to pass an Arch of the form "sm_XX" for cubin files and
10965 // "compute_XX" for ptx.
10966 const char *Arch = (II.getType() == types::TY_PP_Asm)
10967 ? A->getComputeArchName()
10968 : A->getGpuArchName();
10969 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10970 Arch + ",file=" + II.getFilename()));
10971 }
10972
10973 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10974 CmdArgs.push_back(Args.MakeArgString(A));
10975
10976 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10977 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10978}