blob: 74ac807056125bf3c767bab87680cedf49171376 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001186 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001187 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001188
Brad Smithba26f582015-01-06 02:53:17 +00001189 // MIPS3 is the default for mips64*-unknown-openbsd.
1190 if (Triple.getOS() == llvm::Triple::OpenBSD)
1191 DefMips64CPU = "mips3";
1192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001194 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001195
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001197 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 // Convert a GNU style Mips ABI name to the name
1199 // accepted by LLVM Mips backend.
1200 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001201 .Case("32", "o32")
1202 .Case("64", "n64")
1203 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001204 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001205
1206 // Setup default CPU and ABI names.
1207 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001208 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001209 default:
1210 llvm_unreachable("Unexpected triple arch name");
1211 case llvm::Triple::mips:
1212 case llvm::Triple::mipsel:
1213 CPUName = DefMips32CPU;
1214 break;
1215 case llvm::Triple::mips64:
1216 case llvm::Triple::mips64el:
1217 CPUName = DefMips64CPU;
1218 break;
1219 }
1220 }
1221
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001222 if (ABIName.empty()) {
1223 // Deduce ABI name from the target triple.
1224 if (Triple.getArch() == llvm::Triple::mips ||
1225 Triple.getArch() == llvm::Triple::mipsel)
1226 ABIName = "o32";
1227 else
1228 ABIName = "n64";
1229 }
1230
1231 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 // Deduce CPU name from ABI name.
1233 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001234 .Cases("o32", "eabi", DefMips32CPU)
1235 .Cases("n32", "n64", DefMips64CPU)
1236 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001237 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001238
1239 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001240}
1241
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001242std::string mips::getMipsABILibSuffix(const ArgList &Args,
1243 const llvm::Triple &Triple) {
1244 StringRef CPUName, ABIName;
1245 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1246 return llvm::StringSwitch<std::string>(ABIName)
1247 .Case("o32", "")
1248 .Case("n32", "32")
1249 .Case("n64", "64");
1250}
1251
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252// Convert ABI name to the GNU tools acceptable variant.
1253static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1254 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001255 .Case("o32", "32")
1256 .Case("n64", "64")
1257 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001258}
1259
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001260// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1261// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1263 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001264 if (Arg *A =
1265 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1266 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001267 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001268 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1273 .Case("soft", mips::FloatABI::Soft)
1274 .Case("hard", mips::FloatABI::Hard)
1275 .Default(mips::FloatABI::Invalid);
1276 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001277 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 }
1280 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
1283 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001284 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001285 // Assume "hard", because it's a default value used by gcc.
1286 // When we start to recognize specific target MIPS processors,
1287 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001288 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001289 }
1290
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001291 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1292 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293}
1294
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 std::vector<const char *> &Features,
1297 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 StringRef FeatureName) {
1299 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001300 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001302 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001304 }
1305}
1306
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1308 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001309 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001310 StringRef CPUName;
1311 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001313 ABIName = getGnuCompatibleMipsABIName(ABIName);
1314
Daniel Sandersfeb61302014-08-08 15:47:17 +00001315 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1316 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001317
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001318 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1319 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001320 // FIXME: Note, this is a hack. We need to pass the selected float
1321 // mode to the MipsTargetInfoBase to define appropriate macros there.
1322 // Now it is the only method.
1323 Features.push_back("+soft-float");
1324 }
1325
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001327 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001328 if (Val == "2008") {
1329 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1330 Features.push_back("+nan2008");
1331 else {
1332 Features.push_back("-nan2008");
1333 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1334 }
1335 } else if (Val == "legacy") {
1336 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1337 Features.push_back("-nan2008");
1338 else {
1339 Features.push_back("+nan2008");
1340 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1341 }
1342 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001343 D.Diag(diag::err_drv_unsupported_option_argument)
1344 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001345 }
1346
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001347 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1348 options::OPT_mdouble_float, "single-float");
1349 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1350 "mips16");
1351 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1352 options::OPT_mno_micromips, "micromips");
1353 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1354 "dsp");
1355 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1356 "dspr2");
1357 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1358 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001359
1360 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1361 // pass -mfpxx
1362 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1363 options::OPT_mfp64)) {
1364 if (A->getOption().matches(options::OPT_mfp32))
1365 Features.push_back(Args.MakeArgString("-fp64"));
1366 else if (A->getOption().matches(options::OPT_mfpxx)) {
1367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 } else
1370 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001371 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001372 Features.push_back(Args.MakeArgString("+fpxx"));
1373 Features.push_back(Args.MakeArgString("+nooddspreg"));
1374 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001375
Daniel Sanders28e5d392014-07-10 10:39:51 +00001376 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1377 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001378}
1379
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001380void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001381 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382 const Driver &D = getToolChain().getDriver();
1383 StringRef CPUName;
1384 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001385 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001386 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001387
1388 CmdArgs.push_back("-target-abi");
1389 CmdArgs.push_back(ABIName.data());
1390
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1392 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001393 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001397 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001398 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001399 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001400 CmdArgs.push_back("-mfloat-abi");
1401 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001402 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001403
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001404 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1405 if (A->getOption().matches(options::OPT_mxgot)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mxgot");
1408 }
1409 }
1410
Simon Atanasyanc580b322013-05-11 06:33:44 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1412 options::OPT_mno_ldc1_sdc1)) {
1413 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-ldc1-sdc1");
1416 }
1417 }
1418
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001419 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1420 options::OPT_mno_check_zero_division)) {
1421 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1422 CmdArgs.push_back("-mllvm");
1423 CmdArgs.push_back("-mno-check-zero-division");
1424 }
1425 }
1426
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001427 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001428 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001429 CmdArgs.push_back("-mllvm");
1430 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1431 A->claim();
1432 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001433}
1434
Hal Finkel8eb59282012-06-11 22:35:19 +00001435/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1436static std::string getPPCTargetCPU(const ArgList &Args) {
1437 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001438 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001439
1440 if (CPUName == "native") {
1441 std::string CPU = llvm::sys::getHostCPUName();
1442 if (!CPU.empty() && CPU != "generic")
1443 return CPU;
1444 else
1445 return "";
1446 }
1447
1448 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001449 .Case("common", "generic")
1450 .Case("440", "440")
1451 .Case("440fp", "440")
1452 .Case("450", "450")
1453 .Case("601", "601")
1454 .Case("602", "602")
1455 .Case("603", "603")
1456 .Case("603e", "603e")
1457 .Case("603ev", "603ev")
1458 .Case("604", "604")
1459 .Case("604e", "604e")
1460 .Case("620", "620")
1461 .Case("630", "pwr3")
1462 .Case("G3", "g3")
1463 .Case("7400", "7400")
1464 .Case("G4", "g4")
1465 .Case("7450", "7450")
1466 .Case("G4+", "g4+")
1467 .Case("750", "750")
1468 .Case("970", "970")
1469 .Case("G5", "g5")
1470 .Case("a2", "a2")
1471 .Case("a2q", "a2q")
1472 .Case("e500mc", "e500mc")
1473 .Case("e5500", "e5500")
1474 .Case("power3", "pwr3")
1475 .Case("power4", "pwr4")
1476 .Case("power5", "pwr5")
1477 .Case("power5x", "pwr5x")
1478 .Case("power6", "pwr6")
1479 .Case("power6x", "pwr6x")
1480 .Case("power7", "pwr7")
1481 .Case("power8", "pwr8")
1482 .Case("pwr3", "pwr3")
1483 .Case("pwr4", "pwr4")
1484 .Case("pwr5", "pwr5")
1485 .Case("pwr5x", "pwr5x")
1486 .Case("pwr6", "pwr6")
1487 .Case("pwr6x", "pwr6x")
1488 .Case("pwr7", "pwr7")
1489 .Case("pwr8", "pwr8")
1490 .Case("powerpc", "ppc")
1491 .Case("powerpc64", "ppc64")
1492 .Case("powerpc64le", "ppc64le")
1493 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001494 }
1495
1496 return "";
1497}
1498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1500 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001501 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001502 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001503
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001504 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1505 if (FloatABI == ppc::FloatABI::Soft &&
1506 !(Triple.getArch() == llvm::Triple::ppc64 ||
1507 Triple.getArch() == llvm::Triple::ppc64le))
1508 Features.push_back("+soft-float");
1509 else if (FloatABI == ppc::FloatABI::Soft &&
1510 (Triple.getArch() == llvm::Triple::ppc64 ||
1511 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001512 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001513 << "soft float is not supported for ppc64";
1514
Eric Christopher643bb6a2013-10-16 20:40:08 +00001515 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001516 AddTargetFeature(Args, Features, options::OPT_faltivec,
1517 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001518}
1519
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001520ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1521 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1522 if (Arg *A =
1523 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1524 options::OPT_mfloat_abi_EQ)) {
1525 if (A->getOption().matches(options::OPT_msoft_float))
1526 ABI = ppc::FloatABI::Soft;
1527 else if (A->getOption().matches(options::OPT_mhard_float))
1528 ABI = ppc::FloatABI::Hard;
1529 else {
1530 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1531 .Case("soft", ppc::FloatABI::Soft)
1532 .Case("hard", ppc::FloatABI::Hard)
1533 .Default(ppc::FloatABI::Invalid);
1534 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1535 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1536 ABI = ppc::FloatABI::Hard;
1537 }
1538 }
1539 }
1540
1541 // If unspecified, choose the default based on the platform.
1542 if (ABI == ppc::FloatABI::Invalid) {
1543 ABI = ppc::FloatABI::Hard;
1544 }
1545
1546 return ABI;
1547}
1548
Ulrich Weigand8afad612014-07-28 13:17:52 +00001549void Clang::AddPPCTargetArgs(const ArgList &Args,
1550 ArgStringList &CmdArgs) const {
1551 // Select the ABI to use.
1552 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001553 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001554 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001555 case llvm::Triple::ppc64: {
1556 // When targeting a processor that supports QPX, or if QPX is
1557 // specifically enabled, default to using the ABI that supports QPX (so
1558 // long as it is not specifically disabled).
1559 bool HasQPX = false;
1560 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1561 HasQPX = A->getValue() == StringRef("a2q");
1562 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1563 if (HasQPX) {
1564 ABIName = "elfv1-qpx";
1565 break;
1566 }
1567
Ulrich Weigand8afad612014-07-28 13:17:52 +00001568 ABIName = "elfv1";
1569 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001570 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571 case llvm::Triple::ppc64le:
1572 ABIName = "elfv2";
1573 break;
1574 default:
1575 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001576 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001577
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001578 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1579 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1580 // the option if given as we don't have backend support for any targets
1581 // that don't use the altivec abi.
1582 if (StringRef(A->getValue()) != "altivec")
1583 ABIName = A->getValue();
1584
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001585 ppc::FloatABI FloatABI =
1586 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1587
1588 if (FloatABI == ppc::FloatABI::Soft) {
1589 // Floating point operations and argument passing are soft.
1590 CmdArgs.push_back("-msoft-float");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("soft");
1593 } else {
1594 // Floating point operations and argument passing are hard.
1595 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1596 CmdArgs.push_back("-mfloat-abi");
1597 CmdArgs.push_back("hard");
1598 }
1599
Ulrich Weigand8afad612014-07-28 13:17:52 +00001600 if (ABIName) {
1601 CmdArgs.push_back("-target-abi");
1602 CmdArgs.push_back(ABIName);
1603 }
1604}
1605
1606bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1607 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1608 return A && (A->getValue() == StringRef(Value));
1609}
1610
Tom Stellard6674c702013-04-01 20:56:53 +00001611/// Get the (LLVM) name of the R600 gpu we are targeting.
1612static std::string getR600TargetGPU(const ArgList &Args) {
1613 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001614 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001615 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001616 .Cases("rv630", "rv635", "r600")
1617 .Cases("rv610", "rv620", "rs780", "rs880")
1618 .Case("rv740", "rv770")
1619 .Case("palm", "cedar")
1620 .Cases("sumo", "sumo2", "sumo")
1621 .Case("hemlock", "cypress")
1622 .Case("aruba", "cayman")
1623 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001624 }
1625 return "";
1626}
1627
Jacques Pienaard964cc22016-03-28 21:02:54 +00001628static std::string getLanaiTargetCPU(const ArgList &Args) {
1629 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1630 return A->getValue();
1631 }
1632 return "";
1633}
1634
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001635void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001636 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001637 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001638 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001639
James Y Knightb2406522015-06-15 20:51:24 +00001640 bool SoftFloatABI = false;
1641 if (Arg *A =
1642 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001643 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001644 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001645 }
1646
James Y Knightb2406522015-06-15 20:51:24 +00001647 // Only the hard-float ABI on Sparc is standardized, and it is the
1648 // default. GCC also supports a nonstandard soft-float ABI mode, and
1649 // perhaps LLVM should implement that, too. However, since llvm
1650 // currently does not support Sparc soft-float, at all, display an
1651 // error if it's requested.
1652 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1654 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001655 }
1656}
1657
Richard Sandiford4652d892013-07-19 16:51:51 +00001658static const char *getSystemZTargetCPU(const ArgList &Args) {
1659 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1660 return A->getValue();
1661 return "z10";
1662}
1663
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001664static void getSystemZTargetFeatures(const ArgList &Args,
1665 std::vector<const char *> &Features) {
1666 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001667 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001668 if (A->getOption().matches(options::OPT_mhtm))
1669 Features.push_back("+transactional-execution");
1670 else
1671 Features.push_back("-transactional-execution");
1672 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001673 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001674 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001675 if (A->getOption().matches(options::OPT_mvx))
1676 Features.push_back("+vector");
1677 else
1678 Features.push_back("-vector");
1679 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001680}
1681
Chandler Carruth953fb082013-01-13 11:46:33 +00001682static const char *getX86TargetCPU(const ArgList &Args,
1683 const llvm::Triple &Triple) {
1684 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001686 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001687 return "core-avx2";
1688
Chandler Carruth953fb082013-01-13 11:46:33 +00001689 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001690 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001691
1692 // FIXME: Reject attempts to use -march=native unless the target matches
1693 // the host.
1694 //
1695 // FIXME: We should also incorporate the detected target features for use
1696 // with -native.
1697 std::string CPU = llvm::sys::getHostCPUName();
1698 if (!CPU.empty() && CPU != "generic")
1699 return Args.MakeArgString(CPU);
1700 }
1701
Reid Kleckner3123eff2015-06-30 16:32:04 +00001702 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1703 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1704 StringRef Arch = A->getValue();
1705 const char *CPU;
1706 if (Triple.getArch() == llvm::Triple::x86) {
1707 CPU = llvm::StringSwitch<const char *>(Arch)
1708 .Case("IA32", "i386")
1709 .Case("SSE", "pentium3")
1710 .Case("SSE2", "pentium4")
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 } else {
1715 CPU = llvm::StringSwitch<const char *>(Arch)
1716 .Case("AVX", "sandybridge")
1717 .Case("AVX2", "haswell")
1718 .Default(nullptr);
1719 }
1720 if (CPU)
1721 return CPU;
1722 }
1723
Chandler Carruth953fb082013-01-13 11:46:33 +00001724 // Select the default CPU if none was given (or detection failed).
1725
1726 if (Triple.getArch() != llvm::Triple::x86_64 &&
1727 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001728 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001729
1730 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1731
1732 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001733 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001734 if (Triple.getArchName() == "x86_64h")
1735 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001736 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001737 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001738
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001739 // Set up default CPU name for PS4 compilers.
1740 if (Triple.isPS4CPU())
1741 return "btver2";
1742
Alexey Bataev286d1b92014-01-31 04:07:13 +00001743 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001744 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001745 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001746
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001747 // Everything else goes to x86-64 in 64-bit mode.
1748 if (Is64Bit)
1749 return "x86-64";
1750
1751 switch (Triple.getOS()) {
1752 case llvm::Triple::FreeBSD:
1753 case llvm::Triple::NetBSD:
1754 case llvm::Triple::OpenBSD:
1755 return "i486";
1756 case llvm::Triple::Haiku:
1757 return "i586";
1758 case llvm::Triple::Bitrig:
1759 return "i686";
1760 default:
1761 // Fallback to p4.
1762 return "pentium4";
1763 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001764}
1765
Dan Gohmanc2853072015-09-03 22:51:53 +00001766/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1767static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1768 // If we have -mcpu=, use that.
1769 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1770 StringRef CPU = A->getValue();
1771
1772#ifdef __wasm__
1773 // Handle "native" by examining the host. "native" isn't meaningful when
1774 // cross compiling, so only support this when the host is also WebAssembly.
1775 if (CPU == "native")
1776 return llvm::sys::getHostCPUName();
1777#endif
1778
1779 return CPU;
1780 }
1781
1782 return "generic";
1783}
1784
Renato Golin7c542b42015-07-27 23:44:45 +00001785static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1786 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 default:
1789 return "";
1790
Amara Emerson703da2e2013-10-31 09:32:33 +00001791 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001792 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001793 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001794
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001796 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001797 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001798 case llvm::Triple::thumbeb: {
1799 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001800 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001801 return arm::getARMTargetCPU(MCPU, MArch, T);
1802 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001803 case llvm::Triple::mips:
1804 case llvm::Triple::mipsel:
1805 case llvm::Triple::mips64:
1806 case llvm::Triple::mips64el: {
1807 StringRef CPUName;
1808 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001809 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001810 return CPUName;
1811 }
1812
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001813 case llvm::Triple::nvptx:
1814 case llvm::Triple::nvptx64:
1815 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1816 return A->getValue();
1817 return "";
1818
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001819 case llvm::Triple::ppc:
1820 case llvm::Triple::ppc64:
1821 case llvm::Triple::ppc64le: {
1822 std::string TargetCPUName = getPPCTargetCPU(Args);
1823 // LLVM may default to generating code for the native CPU,
1824 // but, like gcc, we default to a more generic option for
1825 // each architecture. (except on Darwin)
1826 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1827 if (T.getArch() == llvm::Triple::ppc64)
1828 TargetCPUName = "ppc64";
1829 else if (T.getArch() == llvm::Triple::ppc64le)
1830 TargetCPUName = "ppc64le";
1831 else
1832 TargetCPUName = "ppc";
1833 }
1834 return TargetCPUName;
1835 }
1836
1837 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001838 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001839 case llvm::Triple::sparcv9:
1840 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001841 return A->getValue();
1842 return "";
1843
1844 case llvm::Triple::x86:
1845 case llvm::Triple::x86_64:
1846 return getX86TargetCPU(Args, T);
1847
1848 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001849 return "hexagon" +
1850 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001851
Jacques Pienaard964cc22016-03-28 21:02:54 +00001852 case llvm::Triple::lanai:
1853 return getLanaiTargetCPU(Args);
1854
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 case llvm::Triple::systemz:
1856 return getSystemZTargetCPU(Args);
1857
1858 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001859 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001861
1862 case llvm::Triple::wasm32:
1863 case llvm::Triple::wasm64:
1864 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001865 }
1866}
1867
Alp Tokerce365ca2013-12-02 12:43:03 +00001868static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001869 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001870 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1871 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1872 // forward.
1873 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 std::string Plugin =
1875 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001876 CmdArgs.push_back(Args.MakeArgString(Plugin));
1877
1878 // Try to pass driver level flags relevant to LTO code generation down to
1879 // the plugin.
1880
1881 // Handle flags for selecting CPU variants.
1882 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1883 if (!CPU.empty())
1884 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001885
James Molloyf97fdae2015-12-21 10:44:36 +00001886 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1887 StringRef OOpt;
1888 if (A->getOption().matches(options::OPT_O4) ||
1889 A->getOption().matches(options::OPT_Ofast))
1890 OOpt = "3";
1891 else if (A->getOption().matches(options::OPT_O))
1892 OOpt = A->getValue();
1893 else if (A->getOption().matches(options::OPT_O0))
1894 OOpt = "0";
1895 if (!OOpt.empty())
1896 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1897 }
1898
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001899 if (IsThinLTO)
1900 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001901
1902 // If an explicit debugger tuning argument appeared, pass it along.
1903 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1904 options::OPT_ggdbN_Group)) {
1905 if (A->getOption().matches(options::OPT_glldb))
1906 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1907 else if (A->getOption().matches(options::OPT_gsce))
1908 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1909 else
1910 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1911 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001912}
1913
Sanjay Patel2987c292015-06-11 14:53:41 +00001914/// This is a helper function for validating the optional refinement step
1915/// parameter in reciprocal argument strings. Return false if there is an error
1916/// parsing the refinement step. Otherwise, return true and set the Position
1917/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001918static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001920 const char RefinementStepToken = ':';
1921 Position = In.find(RefinementStepToken);
1922 if (Position != StringRef::npos) {
1923 StringRef Option = A.getOption().getName();
1924 StringRef RefStep = In.substr(Position + 1);
1925 // Allow exactly one numeric character for the additional refinement
1926 // step parameter. This is reasonable for all currently-supported
1927 // operations and architectures because we would expect that a larger value
1928 // of refinement steps would cause the estimate "optimization" to
1929 // under-perform the native operation. Also, if the estimate does not
1930 // converge quickly, it probably will not ever converge, so further
1931 // refinement steps will not produce a better answer.
1932 if (RefStep.size() != 1) {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 char RefStepChar = RefStep[0];
1937 if (RefStepChar < '0' || RefStepChar > '9') {
1938 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1939 return false;
1940 }
1941 }
1942 return true;
1943}
1944
1945/// The -mrecip flag requires processing of many optional parameters.
1946static void ParseMRecip(const Driver &D, const ArgList &Args,
1947 ArgStringList &OutStrings) {
1948 StringRef DisabledPrefixIn = "!";
1949 StringRef DisabledPrefixOut = "!";
1950 StringRef EnabledPrefixOut = "";
1951 StringRef Out = "-mrecip=";
1952
1953 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1954 if (!A)
1955 return;
1956
1957 unsigned NumOptions = A->getNumValues();
1958 if (NumOptions == 0) {
1959 // No option is the same as "all".
1960 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1961 return;
1962 }
1963
1964 // Pass through "all", "none", or "default" with an optional refinement step.
1965 if (NumOptions == 1) {
1966 StringRef Val = A->getValue(0);
1967 size_t RefStepLoc;
1968 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1969 return;
1970 StringRef ValBase = Val.slice(0, RefStepLoc);
1971 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1972 OutStrings.push_back(Args.MakeArgString(Out + Val));
1973 return;
1974 }
1975 }
1976
1977 // Each reciprocal type may be enabled or disabled individually.
1978 // Check each input value for validity, concatenate them all back together,
1979 // and pass through.
1980
1981 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001982 OptionStrings.insert(std::make_pair("divd", false));
1983 OptionStrings.insert(std::make_pair("divf", false));
1984 OptionStrings.insert(std::make_pair("vec-divd", false));
1985 OptionStrings.insert(std::make_pair("vec-divf", false));
1986 OptionStrings.insert(std::make_pair("sqrtd", false));
1987 OptionStrings.insert(std::make_pair("sqrtf", false));
1988 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1989 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001990
1991 for (unsigned i = 0; i != NumOptions; ++i) {
1992 StringRef Val = A->getValue(i);
1993
1994 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1995 // Ignore the disablement token for string matching.
1996 if (IsDisabled)
1997 Val = Val.substr(1);
1998
1999 size_t RefStep;
2000 if (!getRefinementStep(Val, D, *A, RefStep))
2001 return;
2002
2003 StringRef ValBase = Val.slice(0, RefStep);
2004 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2005 if (OptionIter == OptionStrings.end()) {
2006 // Try again specifying float suffix.
2007 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2008 if (OptionIter == OptionStrings.end()) {
2009 // The input name did not match any known option string.
2010 D.Diag(diag::err_drv_unknown_argument) << Val;
2011 return;
2012 }
2013 // The option was specified without a float or double suffix.
2014 // Make sure that the double entry was not already specified.
2015 // The float entry will be checked below.
2016 if (OptionStrings[ValBase.str() + 'd']) {
2017 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2018 return;
2019 }
2020 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002021
Sanjay Patel2987c292015-06-11 14:53:41 +00002022 if (OptionIter->second == true) {
2023 // Duplicate option specified.
2024 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2025 return;
2026 }
2027
2028 // Mark the matched option as found. Do not allow duplicate specifiers.
2029 OptionIter->second = true;
2030
2031 // If the precision was not specified, also mark the double entry as found.
2032 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2033 OptionStrings[ValBase.str() + 'd'] = true;
2034
2035 // Build the output string.
2036 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2037 Out = Args.MakeArgString(Out + Prefix + Val);
2038 if (i != NumOptions - 1)
2039 Out = Args.MakeArgString(Out + ",");
2040 }
2041
2042 OutStrings.push_back(Args.MakeArgString(Out));
2043}
2044
Eric Christopherc54920a2015-03-23 19:26:05 +00002045static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002046 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002047 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002048 // If -march=native, autodetect the feature list.
2049 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2050 if (StringRef(A->getValue()) == "native") {
2051 llvm::StringMap<bool> HostFeatures;
2052 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2053 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054 Features.push_back(
2055 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002056 }
2057 }
2058
Jim Grosbach82eee262013-11-16 00:53:35 +00002059 if (Triple.getArchName() == "x86_64h") {
2060 // x86_64h implies quite a few of the more modern subtarget features
2061 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2062 Features.push_back("-rdrnd");
2063 Features.push_back("-aes");
2064 Features.push_back("-pclmul");
2065 Features.push_back("-rtm");
2066 Features.push_back("-hle");
2067 Features.push_back("-fsgsbase");
2068 }
2069
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002070 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002071 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002072 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002073 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002074 Features.push_back("+sse4.2");
2075 Features.push_back("+popcnt");
2076 } else
2077 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002078 }
2079
Eric Christopherc54920a2015-03-23 19:26:05 +00002080 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2082 StringRef Arch = A->getValue();
2083 bool ArchUsed = false;
2084 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002085 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002086 if (Arch == "AVX" || Arch == "AVX2") {
2087 ArchUsed = true;
2088 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2089 }
2090 }
2091 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002092 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002093 if (Arch == "IA32") {
2094 ArchUsed = true;
2095 } else if (Arch == "SSE" || Arch == "SSE2") {
2096 ArchUsed = true;
2097 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2098 }
2099 }
2100 if (!ArchUsed)
2101 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2102 }
2103
Jim Grosbach82eee262013-11-16 00:53:35 +00002104 // Now add any that the user explicitly requested on the command line,
2105 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002106 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002107}
2108
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002109void Clang::AddX86TargetArgs(const ArgList &Args,
2110 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002112 Args.hasArg(options::OPT_mkernel) ||
2113 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002114 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002115
Bob Wilson2616e2e2013-02-10 16:01:41 +00002116 // Default to avoid implicit floating-point for kernel/kext code, but allow
2117 // that to be overridden with -mno-soft-float.
2118 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2119 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002120 if (Arg *A = Args.getLastArg(
2121 options::OPT_msoft_float, options::OPT_mno_soft_float,
2122 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002123 const Option &O = A->getOption();
2124 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2125 O.matches(options::OPT_msoft_float));
2126 }
2127 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002128 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002129
2130 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2131 StringRef Value = A->getValue();
2132 if (Value == "intel" || Value == "att") {
2133 CmdArgs.push_back("-mllvm");
2134 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2135 } else {
2136 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2137 << A->getOption().getName() << Value;
2138 }
2139 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002140
2141 // Set flags to support MCU ABI.
2142 if (Args.hasArg(options::OPT_miamcu)) {
2143 CmdArgs.push_back("-mfloat-abi");
2144 CmdArgs.push_back("soft");
2145 CmdArgs.push_back("-mstack-alignment=4");
2146 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002147}
2148
Tony Linthicum76329bf2011-12-12 21:14:55 +00002149void Clang::AddHexagonTargetArgs(const ArgList &Args,
2150 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002151 CmdArgs.push_back("-mqdsp6-compat");
2152 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002153
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002154 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2155 std::string N = llvm::utostr(G.getValue());
2156 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002158 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002159 }
2160
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002161 if (!Args.hasArg(options::OPT_fno_short_enums))
2162 CmdArgs.push_back("-fshort-enums");
2163 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002164 CmdArgs.push_back("-mllvm");
2165 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002166 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002167 CmdArgs.push_back("-mllvm");
2168 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002169}
2170
Jacques Pienaard964cc22016-03-28 21:02:54 +00002171void Clang::AddLanaiTargetArgs(const ArgList &Args,
2172 ArgStringList &CmdArgs) const {
2173 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2174 StringRef CPUName = A->getValue();
2175
2176 CmdArgs.push_back("-target-cpu");
2177 CmdArgs.push_back(Args.MakeArgString(CPUName));
2178 }
2179 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2180 StringRef Value = A->getValue();
2181 // Only support mregparm=4 to support old usage. Report error for all other
2182 // cases.
2183 int Mregparm;
2184 if (Value.getAsInteger(10, Mregparm)) {
2185 if (Mregparm != 4) {
2186 getToolChain().getDriver().Diag(
2187 diag::err_drv_unsupported_option_argument)
2188 << A->getOption().getName() << Value;
2189 }
2190 }
2191 }
2192}
2193
Dan Gohmane3d71e12016-01-07 01:00:21 +00002194void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2195 ArgStringList &CmdArgs) const {
2196 // Default to "hidden" visibility.
2197 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2198 options::OPT_fvisibility_ms_compat)) {
2199 CmdArgs.push_back("-fvisibility");
2200 CmdArgs.push_back("hidden");
2201 }
2202}
2203
Kevin Qin110db6f2014-07-18 07:03:22 +00002204// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002205static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 std::vector<const char *> &Features) {
2207 SmallVector<StringRef, 8> Split;
2208 text.split(Split, StringRef("+"), -1, false);
2209
Benjamin Kramer72e64312015-09-24 14:48:49 +00002210 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002211 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 .Case("fp", "+fp-armv8")
2213 .Case("simd", "+neon")
2214 .Case("crc", "+crc")
2215 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002216 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002217 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002218 .Case("nofp", "-fp-armv8")
2219 .Case("nosimd", "-neon")
2220 .Case("nocrc", "-crc")
2221 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002222 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002223 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002224 .Default(nullptr);
2225 if (result)
2226 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002227 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002228 D.Diag(diag::err_drv_no_neon_modifier);
2229 else
2230 return false;
2231 }
2232 return true;
2233}
2234
2235// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2236// decode CPU and feature.
2237static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2238 std::vector<const char *> &Features) {
2239 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2240 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002241 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002242 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2243 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002244 Features.push_back("+neon");
2245 Features.push_back("+crc");
2246 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002247 } else if (CPU == "cyclone") {
2248 Features.push_back("+neon");
2249 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002250 } else if (CPU == "generic") {
2251 Features.push_back("+neon");
2252 } else {
2253 return false;
2254 }
2255
2256 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2257 return false;
2258
2259 return true;
2260}
2261
2262static bool
2263getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2264 const ArgList &Args,
2265 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002266 std::string MarchLowerCase = March.lower();
2267 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002269 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002270 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002271 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002272 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002273 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2274 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002275 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002276 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002277 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002278
2279 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2280 return false;
2281
2282 return true;
2283}
2284
2285static bool
2286getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2287 const ArgList &Args,
2288 std::vector<const char *> &Features) {
2289 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002290 std::string McpuLowerCase = Mcpu.lower();
2291 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002292 return false;
2293
2294 return true;
2295}
2296
2297static bool
2298getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2299 const ArgList &Args,
2300 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002301 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002302 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002303 if (MtuneLowerCase == "native")
2304 MtuneLowerCase = llvm::sys::getHostCPUName();
2305 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002306 Features.push_back("+zcm");
2307 Features.push_back("+zcz");
2308 }
2309 return true;
2310}
2311
2312static bool
2313getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2314 const ArgList &Args,
2315 std::vector<const char *> &Features) {
2316 StringRef CPU;
2317 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002318 std::string McpuLowerCase = Mcpu.lower();
2319 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002320 return false;
2321
2322 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2323}
2324
Justin Bognerf9052562015-11-13 23:07:31 +00002325static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002326 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002327 Arg *A;
2328 bool success = true;
2329 // Enable NEON by default.
2330 Features.push_back("+neon");
2331 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2332 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2333 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2334 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002335 else if (Args.hasArg(options::OPT_arch))
2336 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2337 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002338
2339 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2340 success =
2341 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2342 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2343 success =
2344 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002345 else if (Args.hasArg(options::OPT_arch))
2346 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2347 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002348
2349 if (!success)
2350 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002351
2352 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2353 Features.push_back("-fp-armv8");
2354 Features.push_back("-crypto");
2355 Features.push_back("-neon");
2356 }
Bradley Smith418c5932014-05-02 15:17:51 +00002357
2358 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002359 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002360 if (A->getOption().matches(options::OPT_mcrc))
2361 Features.push_back("+crc");
2362 else
2363 Features.push_back("-crc");
2364 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002365
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002366 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2367 options::OPT_munaligned_access))
2368 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2369 Features.push_back("+strict-align");
2370
Justin Bognerf9052562015-11-13 23:07:31 +00002371 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002372 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002373}
2374
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002375static void getHexagonTargetFeatures(const ArgList &Args,
2376 std::vector<const char *> &Features) {
2377 bool HasHVX = false, HasHVXD = false;
2378
Eric Christopher49062a52015-12-22 03:12:34 +00002379 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2380 // doing dependent option handling here rather than in initFeatureMap or a
2381 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002382 for (auto &A : Args) {
2383 auto &Opt = A->getOption();
2384 if (Opt.matches(options::OPT_mhexagon_hvx))
2385 HasHVX = true;
2386 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2387 HasHVXD = HasHVX = false;
2388 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2389 HasHVXD = HasHVX = true;
2390 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2391 HasHVXD = false;
2392 else
2393 continue;
2394 A->claim();
2395 }
2396
2397 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2398 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2399}
2400
Dan Gohmanc2853072015-09-03 22:51:53 +00002401static void getWebAssemblyTargetFeatures(const ArgList &Args,
2402 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002403 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002404}
2405
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002406static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2407 std::vector<const char *> &Features) {
2408 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2409 StringRef value = dAbi->getValue();
2410 if (value == "1.0") {
2411 Features.push_back("+amdgpu-debugger-insert-nops");
2412 Features.push_back("+amdgpu-debugger-reserve-trap-regs");
2413 } else {
2414 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2415 }
2416 }
2417
2418 handleTargetFeaturesGroup(
2419 Args, Features, options::OPT_m_amdgpu_Features_Group);
2420}
2421
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002422static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002423 const ArgList &Args, ArgStringList &CmdArgs,
2424 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002425 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002426 std::vector<const char *> Features;
2427 switch (Triple.getArch()) {
2428 default:
2429 break;
2430 case llvm::Triple::mips:
2431 case llvm::Triple::mipsel:
2432 case llvm::Triple::mips64:
2433 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002434 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002435 break;
2436
2437 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002438 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002439 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002440 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002441 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002442 break;
2443
2444 case llvm::Triple::ppc:
2445 case llvm::Triple::ppc64:
2446 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002447 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002448 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002449 case llvm::Triple::systemz:
2450 getSystemZTargetFeatures(Args, Features);
2451 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002452 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002453 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002454 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002455 break;
2456 case llvm::Triple::x86:
2457 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002458 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002459 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002460 case llvm::Triple::hexagon:
2461 getHexagonTargetFeatures(Args, Features);
2462 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002463 case llvm::Triple::wasm32:
2464 case llvm::Triple::wasm64:
2465 getWebAssemblyTargetFeatures(Args, Features);
2466 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002467 case llvm::Triple::r600:
2468 case llvm::Triple::amdgcn:
2469 getAMDGPUTargetFeatures(D, Args, Features);
2470 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002471 }
Rafael Espindola43964802013-08-21 17:34:32 +00002472
2473 // Find the last of each feature.
2474 llvm::StringMap<unsigned> LastOpt;
2475 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2476 const char *Name = Features[I];
2477 assert(Name[0] == '-' || Name[0] == '+');
2478 LastOpt[Name + 1] = I;
2479 }
2480
2481 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2482 // If this feature was overridden, ignore it.
2483 const char *Name = Features[I];
2484 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2485 assert(LastI != LastOpt.end());
2486 unsigned Last = LastI->second;
2487 if (Last != I)
2488 continue;
2489
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002490 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002491 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002492 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002493}
2494
David Majnemerae394812014-12-09 00:12:30 +00002495static bool
2496shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2497 const llvm::Triple &Triple) {
2498 // We use the zero-cost exception tables for Objective-C if the non-fragile
2499 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2500 // later.
2501 if (runtime.isNonFragile())
2502 return true;
2503
2504 if (!Triple.isMacOSX())
2505 return false;
2506
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002507 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002508 (Triple.getArch() == llvm::Triple::x86_64 ||
2509 Triple.getArch() == llvm::Triple::arm));
2510}
2511
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002512/// Adds exception related arguments to the driver command arguments. There's a
2513/// master flag, -fexceptions and also language specific flags to enable/disable
2514/// C++ and Objective-C exceptions. This makes it possible to for example
2515/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002516static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002517 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002518 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002519 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002520 const Driver &D = TC.getDriver();
2521 const llvm::Triple &Triple = TC.getTriple();
2522
Chad Rosier4fab82c2012-03-26 22:04:46 +00002523 if (KernelOrKext) {
2524 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2525 // arguments now to avoid warnings about unused arguments.
2526 Args.ClaimAllArgs(options::OPT_fexceptions);
2527 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2528 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2529 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2530 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2531 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002532 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002533 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002534
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002535 // See if the user explicitly enabled exceptions.
2536 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2537 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002538
David Majnemerae394812014-12-09 00:12:30 +00002539 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2540 // is not necessarily sensible, but follows GCC.
2541 if (types::isObjC(InputType) &&
2542 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002543 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002544 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002545
David Majnemerae394812014-12-09 00:12:30 +00002546 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002547 }
2548
2549 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002550 // Disable C++ EH by default on XCore and PS4.
2551 bool CXXExceptionsEnabled =
2552 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002553 Arg *ExceptionArg = Args.getLastArg(
2554 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2555 options::OPT_fexceptions, options::OPT_fno_exceptions);
2556 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002557 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002558 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2559 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002560
2561 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002562 if (Triple.isPS4CPU()) {
2563 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2564 assert(ExceptionArg &&
2565 "On the PS4 exceptions should only be enabled if passing "
2566 "an argument");
2567 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2568 const Arg *RTTIArg = TC.getRTTIArg();
2569 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2570 D.Diag(diag::err_drv_argument_not_allowed_with)
2571 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2572 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2573 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2574 } else
2575 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2576
Anders Carlssone96ab552011-02-28 02:27:16 +00002577 CmdArgs.push_back("-fcxx-exceptions");
2578
David Majnemer8de68642014-12-05 08:11:58 +00002579 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002580 }
2581 }
2582
David Majnemer8de68642014-12-05 08:11:58 +00002583 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002584 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002585}
2586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002587static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002588 bool Default = true;
2589 if (TC.getTriple().isOSDarwin()) {
2590 // The native darwin assembler doesn't support the linker_option directives,
2591 // so we disable them if we think the .s file will be passed to it.
2592 Default = TC.useIntegratedAs();
2593 }
2594 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2595 Default);
2596}
2597
Ted Kremenek62093662013-03-12 17:02:12 +00002598static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2599 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002600 bool UseDwarfDirectory =
2601 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2602 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002603 return !UseDwarfDirectory;
2604}
2605
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002606/// \brief Check whether the given input tree contains any compilation actions.
2607static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002608 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002609 return true;
2610
Nico Weber5a459f82016-02-23 19:30:43 +00002611 for (const auto &AI : A->inputs())
2612 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002613 return true;
2614
2615 return false;
2616}
2617
2618/// \brief Check if -relax-all should be passed to the internal assembler.
2619/// This is done by default when compiling non-assembler source with -O0.
2620static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2621 bool RelaxDefault = true;
2622
2623 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2624 RelaxDefault = A->getOption().matches(options::OPT_O0);
2625
2626 if (RelaxDefault) {
2627 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002628 for (const auto &Act : C.getActions()) {
2629 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002630 RelaxDefault = true;
2631 break;
2632 }
2633 }
2634 }
2635
2636 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002638}
2639
Paul Robinson0334a042015-12-19 19:41:48 +00002640// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2641// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002642static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002643 assert(A.getOption().matches(options::OPT_gN_Group) &&
2644 "Not a -g option that specifies a debug-info level");
2645 if (A.getOption().matches(options::OPT_g0) ||
2646 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002647 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002648 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2649 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002650 return codegenoptions::DebugLineTablesOnly;
2651 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002652}
2653
Douglas Katzman3459ce22015-10-08 04:24:12 +00002654// Extract the integer N from a string spelled "-dwarf-N", returning 0
2655// on mismatch. The StringRef input (rather than an Arg) allows
2656// for use by the "-Xassembler" option parser.
2657static unsigned DwarfVersionNum(StringRef ArgValue) {
2658 return llvm::StringSwitch<unsigned>(ArgValue)
2659 .Case("-gdwarf-2", 2)
2660 .Case("-gdwarf-3", 3)
2661 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002662 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002663 .Default(0);
2664}
2665
2666static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002667 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002668 unsigned DwarfVersion,
2669 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002670 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002671 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002672 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2673 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002674 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002675 CmdArgs.push_back("-debug-info-kind=limited");
2676 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002677 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002678 CmdArgs.push_back("-debug-info-kind=standalone");
2679 break;
2680 default:
2681 break;
2682 }
2683 if (DwarfVersion > 0)
2684 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002685 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002686 switch (DebuggerTuning) {
2687 case llvm::DebuggerKind::GDB:
2688 CmdArgs.push_back("-debugger-tuning=gdb");
2689 break;
2690 case llvm::DebuggerKind::LLDB:
2691 CmdArgs.push_back("-debugger-tuning=lldb");
2692 break;
2693 case llvm::DebuggerKind::SCE:
2694 CmdArgs.push_back("-debugger-tuning=sce");
2695 break;
2696 default:
2697 break;
2698 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002699}
2700
David Blaikie9260ed62013-07-25 21:19:01 +00002701static void CollectArgsForIntegratedAssembler(Compilation &C,
2702 const ArgList &Args,
2703 ArgStringList &CmdArgs,
2704 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002705 if (UseRelaxAll(C, Args))
2706 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002707
David Majnemer2b9349d2015-12-21 22:09:34 +00002708 // Only default to -mincremental-linker-compatible if we think we are
2709 // targeting the MSVC linker.
2710 bool DefaultIncrementalLinkerCompatible =
2711 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2712 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2713 options::OPT_mno_incremental_linker_compatible,
2714 DefaultIncrementalLinkerCompatible))
2715 CmdArgs.push_back("-mincremental-linker-compatible");
2716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717 // When passing -I arguments to the assembler we sometimes need to
2718 // unconditionally take the next argument. For example, when parsing
2719 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2720 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2721 // arg after parsing the '-I' arg.
2722 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002724 // When using an integrated assembler, translate -Wa, and -Xassembler
2725 // options.
2726 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002727 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002728 for (const Arg *A :
2729 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2730 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002731
Benjamin Kramer72e64312015-09-24 14:48:49 +00002732 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002733 if (TakeNextArg) {
2734 CmdArgs.push_back(Value.data());
2735 TakeNextArg = false;
2736 continue;
2737 }
David Blaikie9260ed62013-07-25 21:19:01 +00002738
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002739 switch (C.getDefaultToolChain().getArch()) {
2740 default:
2741 break;
2742 case llvm::Triple::mips:
2743 case llvm::Triple::mipsel:
2744 case llvm::Triple::mips64:
2745 case llvm::Triple::mips64el:
2746 if (Value == "--trap") {
2747 CmdArgs.push_back("-target-feature");
2748 CmdArgs.push_back("+use-tcc-in-div");
2749 continue;
2750 }
2751 if (Value == "--break") {
2752 CmdArgs.push_back("-target-feature");
2753 CmdArgs.push_back("-use-tcc-in-div");
2754 continue;
2755 }
2756 if (Value.startswith("-msoft-float")) {
2757 CmdArgs.push_back("-target-feature");
2758 CmdArgs.push_back("+soft-float");
2759 continue;
2760 }
2761 if (Value.startswith("-mhard-float")) {
2762 CmdArgs.push_back("-target-feature");
2763 CmdArgs.push_back("-soft-float");
2764 continue;
2765 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002766
2767 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2768 .Case("-mips1", "+mips1")
2769 .Case("-mips2", "+mips2")
2770 .Case("-mips3", "+mips3")
2771 .Case("-mips4", "+mips4")
2772 .Case("-mips5", "+mips5")
2773 .Case("-mips32", "+mips32")
2774 .Case("-mips32r2", "+mips32r2")
2775 .Case("-mips32r3", "+mips32r3")
2776 .Case("-mips32r5", "+mips32r5")
2777 .Case("-mips32r6", "+mips32r6")
2778 .Case("-mips64", "+mips64")
2779 .Case("-mips64r2", "+mips64r2")
2780 .Case("-mips64r3", "+mips64r3")
2781 .Case("-mips64r5", "+mips64r5")
2782 .Case("-mips64r6", "+mips64r6")
2783 .Default(nullptr);
2784 if (MipsTargetFeature)
2785 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002786 }
2787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002788 if (Value == "-force_cpusubtype_ALL") {
2789 // Do nothing, this is the default and we don't support anything else.
2790 } else if (Value == "-L") {
2791 CmdArgs.push_back("-msave-temp-labels");
2792 } else if (Value == "--fatal-warnings") {
2793 CmdArgs.push_back("-massembler-fatal-warnings");
2794 } else if (Value == "--noexecstack") {
2795 CmdArgs.push_back("-mnoexecstack");
2796 } else if (Value == "-compress-debug-sections" ||
2797 Value == "--compress-debug-sections") {
2798 CompressDebugSections = true;
2799 } else if (Value == "-nocompress-debug-sections" ||
2800 Value == "--nocompress-debug-sections") {
2801 CompressDebugSections = false;
2802 } else if (Value.startswith("-I")) {
2803 CmdArgs.push_back(Value.data());
2804 // We need to consume the next argument if the current arg is a plain
2805 // -I. The next arg will be the include directory.
2806 if (Value == "-I")
2807 TakeNextArg = true;
2808 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002809 // "-gdwarf-N" options are not cc1as options.
2810 unsigned DwarfVersion = DwarfVersionNum(Value);
2811 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2812 CmdArgs.push_back(Value.data());
2813 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002814 RenderDebugEnablingArgs(Args, CmdArgs,
2815 codegenoptions::LimitedDebugInfo,
2816 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002817 }
Renato Golin7c542b42015-07-27 23:44:45 +00002818 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2819 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2820 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002821 } else {
2822 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002823 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002824 }
2825 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002826 }
2827 if (CompressDebugSections) {
2828 if (llvm::zlib::isAvailable())
2829 CmdArgs.push_back("-compress-debug-sections");
2830 else
2831 D.Diag(diag::warn_debug_compression_unavailable);
2832 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002833 if (MipsTargetFeature != nullptr) {
2834 CmdArgs.push_back("-target-feature");
2835 CmdArgs.push_back(MipsTargetFeature);
2836 }
David Blaikie9260ed62013-07-25 21:19:01 +00002837}
2838
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002839// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002840// FIXME: Make sure we can also emit shared objects if they're requested
2841// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002842static void addClangRT(const ToolChain &TC, const ArgList &Args,
2843 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002844 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002845}
2846
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002847namespace {
2848enum OpenMPRuntimeKind {
2849 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2850 /// without knowing what runtime to target.
2851 OMPRT_Unknown,
2852
2853 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2854 /// the default for Clang.
2855 OMPRT_OMP,
2856
2857 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2858 /// this runtime but can swallow the pragmas, and find and link against the
2859 /// runtime library itself.
2860 OMPRT_GOMP,
2861
Chandler Carruthc6625c62015-05-28 21:10:31 +00002862 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002863 /// OpenMP runtime. We support this mode for users with existing dependencies
2864 /// on this runtime library name.
2865 OMPRT_IOMP5
2866};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002867}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002868
2869/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002870static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2871 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002872 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2873
2874 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2875 if (A)
2876 RuntimeName = A->getValue();
2877
2878 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002879 .Case("libomp", OMPRT_OMP)
2880 .Case("libgomp", OMPRT_GOMP)
2881 .Case("libiomp5", OMPRT_IOMP5)
2882 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002883
2884 if (RT == OMPRT_Unknown) {
2885 if (A)
2886 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002887 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002888 else
2889 // FIXME: We could use a nicer diagnostic here.
2890 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2891 }
2892
2893 return RT;
2894}
2895
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002896static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2897 const ArgList &Args) {
2898 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2899 options::OPT_fno_openmp, false))
2900 return;
2901
2902 switch (getOpenMPRuntime(TC, Args)) {
2903 case OMPRT_OMP:
2904 CmdArgs.push_back("-lomp");
2905 break;
2906 case OMPRT_GOMP:
2907 CmdArgs.push_back("-lgomp");
2908 break;
2909 case OMPRT_IOMP5:
2910 CmdArgs.push_back("-liomp5");
2911 break;
2912 case OMPRT_Unknown:
2913 // Already diagnosed.
2914 break;
2915 }
2916}
2917
Alexey Samsonov52550342014-09-15 19:58:40 +00002918static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2919 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002920 bool IsShared, bool IsWhole) {
2921 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002922 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002923 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002924 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002925 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002926}
2927
Alexey Samsonov52550342014-09-15 19:58:40 +00002928// Tries to use a file with the list of dynamic symbols that need to be exported
2929// from the runtime library. Returns true if the file was found.
2930static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2931 ArgStringList &CmdArgs,
2932 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002933 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002934 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2935 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002936 return true;
2937 }
2938 return false;
2939}
2940
2941static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2942 ArgStringList &CmdArgs) {
2943 // Force linking against the system libraries sanitizers depends on
2944 // (see PR15823 why this is necessary).
2945 CmdArgs.push_back("--no-as-needed");
2946 CmdArgs.push_back("-lpthread");
2947 CmdArgs.push_back("-lrt");
2948 CmdArgs.push_back("-lm");
2949 // There's no libdl on FreeBSD.
2950 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2951 CmdArgs.push_back("-ldl");
2952}
2953
2954static void
2955collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2956 SmallVectorImpl<StringRef> &SharedRuntimes,
2957 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002958 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2959 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2960 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2962 // Collect shared runtimes.
2963 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2964 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002965 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002966 // The stats_client library is also statically linked into DSOs.
2967 if (SanArgs.needsStatsRt())
2968 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002969
Alexey Samsonov52550342014-09-15 19:58:40 +00002970 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002971 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002972 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002973 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002974 }
2975 if (SanArgs.needsAsanRt()) {
2976 if (SanArgs.needsSharedAsanRt()) {
2977 HelperStaticRuntimes.push_back("asan-preinit");
2978 } else {
2979 StaticRuntimes.push_back("asan");
2980 if (SanArgs.linkCXXRuntimes())
2981 StaticRuntimes.push_back("asan_cxx");
2982 }
2983 }
2984 if (SanArgs.needsDfsanRt())
2985 StaticRuntimes.push_back("dfsan");
2986 if (SanArgs.needsLsanRt())
2987 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002988 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002989 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002990 if (SanArgs.linkCXXRuntimes())
2991 StaticRuntimes.push_back("msan_cxx");
2992 }
2993 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002994 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002995 if (SanArgs.linkCXXRuntimes())
2996 StaticRuntimes.push_back("tsan_cxx");
2997 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002998 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002999 StaticRuntimes.push_back("ubsan_standalone");
3000 if (SanArgs.linkCXXRuntimes())
3001 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003002 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003003 if (SanArgs.needsSafeStackRt())
3004 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003005 if (SanArgs.needsCfiRt())
3006 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003007 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003008 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003009 if (SanArgs.linkCXXRuntimes())
3010 StaticRuntimes.push_back("ubsan_standalone_cxx");
3011 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003012 if (SanArgs.needsStatsRt()) {
3013 NonWholeStaticRuntimes.push_back("stats");
3014 RequiredSymbols.push_back("__sanitizer_stats_register");
3015 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003016 if (SanArgs.needsEsanRt())
3017 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003018}
3019
Alexey Samsonov52550342014-09-15 19:58:40 +00003020// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3021// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3022static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003023 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003024 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003025 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003026 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003027 NonWholeStaticRuntimes, HelperStaticRuntimes,
3028 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003029 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003030 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003031 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003032 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003033 bool AddExportDynamic = false;
3034 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003035 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003036 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3037 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003038 for (auto RT : NonWholeStaticRuntimes) {
3039 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3040 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3041 }
3042 for (auto S : RequiredSymbols) {
3043 CmdArgs.push_back("-u");
3044 CmdArgs.push_back(Args.MakeArgString(S));
3045 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003046 // If there is a static runtime with no dynamic list, force all the symbols
3047 // to be dynamic to be sure we export sanitizer interface functions.
3048 if (AddExportDynamic)
3049 CmdArgs.push_back("-export-dynamic");
3050 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003051}
3052
Reid Kleckner86ea7702015-02-04 23:45:07 +00003053static bool areOptimizationsEnabled(const ArgList &Args) {
3054 // Find the last -O arg and see if it is non-zero.
3055 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3056 return !A->getOption().matches(options::OPT_O0);
3057 // Defaults to -O0.
3058 return false;
3059}
3060
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003061static bool shouldUseFramePointerForTarget(const ArgList &Args,
3062 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003063 switch (Triple.getArch()) {
3064 case llvm::Triple::xcore:
3065 case llvm::Triple::wasm32:
3066 case llvm::Triple::wasm64:
3067 // XCore never wants frame pointers, regardless of OS.
3068 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003069 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003070 default:
3071 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003072 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003073
3074 if (Triple.isOSLinux()) {
3075 switch (Triple.getArch()) {
3076 // Don't use a frame pointer on linux if optimizing for certain targets.
3077 case llvm::Triple::mips64:
3078 case llvm::Triple::mips64el:
3079 case llvm::Triple::mips:
3080 case llvm::Triple::mipsel:
3081 case llvm::Triple::systemz:
3082 case llvm::Triple::x86:
3083 case llvm::Triple::x86_64:
3084 return !areOptimizationsEnabled(Args);
3085 default:
3086 return true;
3087 }
3088 }
3089
3090 if (Triple.isOSWindows()) {
3091 switch (Triple.getArch()) {
3092 case llvm::Triple::x86:
3093 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003094 case llvm::Triple::x86_64:
3095 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003096 case llvm::Triple::arm:
3097 case llvm::Triple::thumb:
3098 // Windows on ARM builds with FPO disabled to aid fast stack walking
3099 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003100 default:
3101 // All other supported Windows ISAs use xdata unwind information, so frame
3102 // pointers are not generally useful.
3103 return false;
3104 }
3105 }
3106
3107 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003108}
3109
Rafael Espindola224dd632011-12-14 21:02:23 +00003110static bool shouldUseFramePointer(const ArgList &Args,
3111 const llvm::Triple &Triple) {
3112 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3113 options::OPT_fomit_frame_pointer))
3114 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003115 if (Args.hasArg(options::OPT_pg))
3116 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003117
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003118 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003119}
3120
Eric Christopherb7d97e92013-04-03 01:58:53 +00003121static bool shouldUseLeafFramePointer(const ArgList &Args,
3122 const llvm::Triple &Triple) {
3123 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3124 options::OPT_momit_leaf_frame_pointer))
3125 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003126 if (Args.hasArg(options::OPT_pg))
3127 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003128
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003129 if (Triple.isPS4CPU())
3130 return false;
3131
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003132 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003133}
3134
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003135/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003136static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003137 SmallString<128> cwd;
3138 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003139 CmdArgs.push_back("-fdebug-compilation-dir");
3140 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003141 }
3142}
3143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003144static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003145 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3146 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3147 SmallString<128> T(FinalOutput->getValue());
3148 llvm::sys::path::replace_extension(T, "dwo");
3149 return Args.MakeArgString(T);
3150 } else {
3151 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003152 SmallString<128> T(
3153 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003154 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003155 llvm::sys::path::replace_extension(F, "dwo");
3156 T += F;
3157 return Args.MakeArgString(F);
3158 }
3159}
3160
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003161static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3162 const JobAction &JA, const ArgList &Args,
3163 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003164 ArgStringList ExtractArgs;
3165 ExtractArgs.push_back("--extract-dwo");
3166
3167 ArgStringList StripArgs;
3168 StripArgs.push_back("--strip-dwo");
3169
3170 // Grabbing the output of the earlier compile step.
3171 StripArgs.push_back(Output.getFilename());
3172 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003173 ExtractArgs.push_back(OutFile);
3174
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003175 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003176 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003177
3178 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003179 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003180
3181 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003182 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003183}
3184
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003185/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003186/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3187static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003188 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003189 if (A->getOption().matches(options::OPT_O4) ||
3190 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003191 return true;
3192
3193 if (A->getOption().matches(options::OPT_O0))
3194 return false;
3195
3196 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3197
Rafael Espindola91780de2013-08-26 14:05:41 +00003198 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003199 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003200 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003201 return true;
3202
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003203 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003204 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003205 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003206
3207 unsigned OptLevel = 0;
3208 if (S.getAsInteger(10, OptLevel))
3209 return false;
3210
3211 return OptLevel > 1;
3212 }
3213
3214 return false;
3215}
3216
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003217/// Add -x lang to \p CmdArgs for \p Input.
3218static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3219 ArgStringList &CmdArgs) {
3220 // When using -verify-pch, we don't want to provide the type
3221 // 'precompiled-header' if it was inferred from the file extension
3222 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3223 return;
3224
3225 CmdArgs.push_back("-x");
3226 if (Args.hasArg(options::OPT_rewrite_objc))
3227 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3228 else
3229 CmdArgs.push_back(types::getTypeName(Input.getType()));
3230}
3231
David Majnemerc371ff02015-03-22 08:39:22 +00003232static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003233 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003234 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003235
3236 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003237 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003238
3239 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003240 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003241 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003242 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003243}
3244
Rafael Espindola577637a2015-01-03 00:06:04 +00003245// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003246// options that build systems might add but are unused when assembling or only
3247// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003248static void claimNoWarnArgs(const ArgList &Args) {
3249 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003250 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003251 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003252 Args.ClaimAllArgs(options::OPT_flto);
3253 Args.ClaimAllArgs(options::OPT_fno_lto);
3254}
3255
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003256static void appendUserToPath(SmallVectorImpl<char> &Result) {
3257#ifdef LLVM_ON_UNIX
3258 const char *Username = getenv("LOGNAME");
3259#else
3260 const char *Username = getenv("USERNAME");
3261#endif
3262 if (Username) {
3263 // Validate that LoginName can be used in a path, and get its length.
3264 size_t Len = 0;
3265 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003266 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003267 Username = nullptr;
3268 break;
3269 }
3270 }
3271
3272 if (Username && Len > 0) {
3273 Result.append(Username, Username + Len);
3274 return;
3275 }
3276 }
3277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003279#ifdef LLVM_ON_UNIX
3280 std::string UID = llvm::utostr(getuid());
3281#else
3282 // FIXME: Windows seems to have an 'SID' that might work.
3283 std::string UID = "9999";
3284#endif
3285 Result.append(UID.begin(), UID.end());
3286}
3287
David Majnemere11d3732015-06-08 00:22:46 +00003288VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3289 const llvm::Triple &Triple,
3290 const llvm::opt::ArgList &Args,
3291 bool IsWindowsMSVC) {
3292 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3293 IsWindowsMSVC) ||
3294 Args.hasArg(options::OPT_fmsc_version) ||
3295 Args.hasArg(options::OPT_fms_compatibility_version)) {
3296 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3297 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003298 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003299
3300 if (MSCVersion && MSCompatibilityVersion) {
3301 if (D)
3302 D->Diag(diag::err_drv_argument_not_allowed_with)
3303 << MSCVersion->getAsString(Args)
3304 << MSCompatibilityVersion->getAsString(Args);
3305 return VersionTuple();
3306 }
3307
3308 if (MSCompatibilityVersion) {
3309 VersionTuple MSVT;
3310 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3311 D->Diag(diag::err_drv_invalid_value)
3312 << MSCompatibilityVersion->getAsString(Args)
3313 << MSCompatibilityVersion->getValue();
3314 return MSVT;
3315 }
3316
3317 if (MSCVersion) {
3318 unsigned Version = 0;
3319 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3320 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3321 << MSCVersion->getValue();
3322 return getMSCompatibilityVersion(Version);
3323 }
3324
3325 unsigned Major, Minor, Micro;
3326 Triple.getEnvironmentVersion(Major, Minor, Micro);
3327 if (Major || Minor || Micro)
3328 return VersionTuple(Major, Minor, Micro);
3329
Nico Weber9a952752016-03-23 23:26:59 +00003330 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003331 return VersionTuple(18);
3332 }
3333 return VersionTuple();
3334}
3335
Diego Novilloa0545962015-07-10 18:00:07 +00003336static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3337 const InputInfo &Output, const ArgList &Args,
3338 ArgStringList &CmdArgs) {
3339 auto *ProfileGenerateArg = Args.getLastArg(
3340 options::OPT_fprofile_instr_generate,
3341 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003342 options::OPT_fprofile_generate_EQ,
3343 options::OPT_fno_profile_instr_generate);
3344 if (ProfileGenerateArg &&
3345 ProfileGenerateArg->getOption().matches(
3346 options::OPT_fno_profile_instr_generate))
3347 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003348
3349 auto *ProfileUseArg = Args.getLastArg(
3350 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003351 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3352 options::OPT_fno_profile_instr_use);
3353 if (ProfileUseArg &&
3354 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3355 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003356
3357 if (ProfileGenerateArg && ProfileUseArg)
3358 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003359 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003360
Diego Novillo758f3f52015-08-05 21:49:51 +00003361 if (ProfileGenerateArg) {
3362 if (ProfileGenerateArg->getOption().matches(
3363 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003364 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3365 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003366 else if (ProfileGenerateArg->getOption().matches(
3367 options::OPT_fprofile_generate_EQ)) {
3368 SmallString<128> Path(ProfileGenerateArg->getValue());
3369 llvm::sys::path::append(Path, "default.profraw");
3370 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003371 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3372 }
3373 // The default is to use Clang Instrumentation.
3374 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003375 }
Diego Novilloa0545962015-07-10 18:00:07 +00003376
Diego Novillo758f3f52015-08-05 21:49:51 +00003377 if (ProfileUseArg) {
3378 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003379 CmdArgs.push_back(Args.MakeArgString(
3380 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003381 else if ((ProfileUseArg->getOption().matches(
3382 options::OPT_fprofile_use_EQ) ||
3383 ProfileUseArg->getOption().matches(
3384 options::OPT_fprofile_instr_use))) {
3385 SmallString<128> Path(
3386 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3387 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3388 llvm::sys::path::append(Path, "default.profdata");
3389 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003390 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003391 }
Diego Novilloa0545962015-07-10 18:00:07 +00003392 }
3393
3394 if (Args.hasArg(options::OPT_ftest_coverage) ||
3395 Args.hasArg(options::OPT_coverage))
3396 CmdArgs.push_back("-femit-coverage-notes");
3397 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3398 false) ||
3399 Args.hasArg(options::OPT_coverage))
3400 CmdArgs.push_back("-femit-coverage-data");
3401
Diego Novilloc4b94da2015-08-05 23:27:40 +00003402 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3403 options::OPT_fno_coverage_mapping, false) &&
3404 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003405 D.Diag(diag::err_drv_argument_only_allowed_with)
3406 << "-fcoverage-mapping"
3407 << "-fprofile-instr-generate";
3408
Diego Novilloc4b94da2015-08-05 23:27:40 +00003409 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3410 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003411 CmdArgs.push_back("-fcoverage-mapping");
3412
3413 if (C.getArgs().hasArg(options::OPT_c) ||
3414 C.getArgs().hasArg(options::OPT_S)) {
3415 if (Output.isFilename()) {
3416 CmdArgs.push_back("-coverage-file");
3417 SmallString<128> CoverageFilename;
3418 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3419 CoverageFilename = FinalOutput->getValue();
3420 } else {
3421 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3422 }
3423 if (llvm::sys::path::is_relative(CoverageFilename)) {
3424 SmallString<128> Pwd;
3425 if (!llvm::sys::fs::current_path(Pwd)) {
3426 llvm::sys::path::append(Pwd, CoverageFilename);
3427 CoverageFilename.swap(Pwd);
3428 }
3429 }
3430 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3431 }
3432 }
3433}
3434
Paul Robinsond083b9a2015-12-16 17:25:27 +00003435static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3436 ArgStringList &CmdArgs) {
3437 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3438 false) ||
3439 Args.hasFlag(options::OPT_fprofile_generate,
3440 options::OPT_fno_profile_instr_generate, false) ||
3441 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3442 options::OPT_fno_profile_instr_generate, false) ||
3443 Args.hasFlag(options::OPT_fprofile_instr_generate,
3444 options::OPT_fno_profile_instr_generate, false) ||
3445 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3446 options::OPT_fno_profile_instr_generate, false) ||
3447 Args.hasArg(options::OPT_fcreate_profile) ||
3448 Args.hasArg(options::OPT_coverage)))
3449 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3450}
3451
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003452/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3453/// smooshes them together with platform defaults, to decide whether
3454/// this compile should be using PIC mode or not. Returns a tuple of
3455/// (RelocationModel, PICLevel, IsPIE).
3456static std::tuple<llvm::Reloc::Model, unsigned, bool>
3457ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3458 const ArgList &Args) {
3459 // FIXME: why does this code...and so much everywhere else, use both
3460 // ToolChain.getTriple() and Triple?
3461 bool PIE = ToolChain.isPIEDefault();
3462 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003463 // The Darwin/MachO default to use PIC does not apply when using -static.
3464 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3465 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003466 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003467 bool IsPICLevelTwo = PIC;
3468
3469 bool KernelOrKext =
3470 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3471
3472 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003473 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003474 switch (ToolChain.getArch()) {
3475 case llvm::Triple::arm:
3476 case llvm::Triple::armeb:
3477 case llvm::Triple::thumb:
3478 case llvm::Triple::thumbeb:
3479 case llvm::Triple::aarch64:
3480 case llvm::Triple::mips:
3481 case llvm::Triple::mipsel:
3482 case llvm::Triple::mips64:
3483 case llvm::Triple::mips64el:
3484 PIC = true; // "-fpic"
3485 break;
3486
3487 case llvm::Triple::x86:
3488 case llvm::Triple::x86_64:
3489 PIC = true; // "-fPIC"
3490 IsPICLevelTwo = true;
3491 break;
3492
3493 default:
3494 break;
3495 }
3496 }
3497
3498 // OpenBSD-specific defaults for PIE
3499 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3500 switch (ToolChain.getArch()) {
3501 case llvm::Triple::mips64:
3502 case llvm::Triple::mips64el:
3503 case llvm::Triple::sparcel:
3504 case llvm::Triple::x86:
3505 case llvm::Triple::x86_64:
3506 IsPICLevelTwo = false; // "-fpie"
3507 break;
3508
3509 case llvm::Triple::ppc:
3510 case llvm::Triple::sparc:
3511 case llvm::Triple::sparcv9:
3512 IsPICLevelTwo = true; // "-fPIE"
3513 break;
3514
3515 default:
3516 break;
3517 }
3518 }
3519
3520 // The last argument relating to either PIC or PIE wins, and no
3521 // other argument is used. If the last argument is any flavor of the
3522 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3523 // option implicitly enables PIC at the same level.
3524 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3525 options::OPT_fpic, options::OPT_fno_pic,
3526 options::OPT_fPIE, options::OPT_fno_PIE,
3527 options::OPT_fpie, options::OPT_fno_pie);
3528 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3529 // is forced, then neither PIC nor PIE flags will have no effect.
3530 if (!ToolChain.isPICDefaultForced()) {
3531 if (LastPICArg) {
3532 Option O = LastPICArg->getOption();
3533 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3534 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3535 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3536 PIC =
3537 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3538 IsPICLevelTwo =
3539 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3540 } else {
3541 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003542 if (Triple.isPS4CPU()) {
3543 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3544 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3545 if (Model != "kernel") {
3546 PIC = true;
3547 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3548 << LastPICArg->getSpelling();
3549 }
3550 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003551 }
3552 }
3553 }
3554
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003555 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3556 // PIC level would've been set to level 1, force it back to level 2 PIC
3557 // instead.
3558 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003559 IsPICLevelTwo |= ToolChain.isPICDefault();
3560
James Y Knightc4015d32015-08-21 04:14:55 +00003561 // This kernel flags are a trump-card: they will disable PIC/PIE
3562 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003563 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3564 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003565 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003566
3567 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3568 // This is a very special mode. It trumps the other modes, almost no one
3569 // uses it, and it isn't even valid on any OS but Darwin.
3570 if (!ToolChain.getTriple().isOSDarwin())
3571 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3572 << A->getSpelling() << ToolChain.getTriple().str();
3573
3574 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3575
3576 // Only a forced PIC mode can cause the actual compile to have PIC defines
3577 // etc., no flags are sufficient. This behavior was selected to closely
3578 // match that of llvm-gcc and Apple GCC before that.
3579 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3580
3581 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3582 }
3583
3584 if (PIC)
3585 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3586
3587 return std::make_tuple(llvm::Reloc::Static, 0, false);
3588}
3589
3590static const char *RelocationModelName(llvm::Reloc::Model Model) {
3591 switch (Model) {
3592 case llvm::Reloc::Default:
3593 return nullptr;
3594 case llvm::Reloc::Static:
3595 return "static";
3596 case llvm::Reloc::PIC_:
3597 return "pic";
3598 case llvm::Reloc::DynamicNoPIC:
3599 return "dynamic-no-pic";
3600 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003601 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003602}
3603
3604static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3605 ArgStringList &CmdArgs) {
3606 llvm::Reloc::Model RelocationModel;
3607 unsigned PICLevel;
3608 bool IsPIE;
3609 std::tie(RelocationModel, PICLevel, IsPIE) =
3610 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3611
3612 if (RelocationModel != llvm::Reloc::Static)
3613 CmdArgs.push_back("-KPIC");
3614}
3615
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003616void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003617 const InputInfo &Output, const InputInfoList &Inputs,
3618 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003619 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3620 const llvm::Triple Triple(TripleStr);
3621
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003622 bool KernelOrKext =
3623 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003624 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003625 ArgStringList CmdArgs;
3626
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003627 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003628 bool IsWindowsCygnus =
3629 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003630 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003631 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003632
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003633 // Check number of inputs for sanity. We need at least one input.
3634 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003635 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003636 // CUDA compilation may have multiple inputs (source file + results of
3637 // device-side compilations). All other jobs are expected to have exactly one
3638 // input.
3639 bool IsCuda = types::isCuda(Input.getType());
3640 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003641
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003642 // Invoke ourselves in -cc1 mode.
3643 //
3644 // FIXME: Implement custom jobs for internal actions.
3645 CmdArgs.push_back("-cc1");
3646
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003647 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003648 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003649 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003650
Artem Belevichfa11ab52015-11-17 22:28:46 +00003651 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003652 if (IsCuda) {
3653 // FIXME: We need a (better) way to pass information about
3654 // particular compilation pass we're constructing here. For now we
3655 // can check which toolchain we're using and pick the other one to
3656 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003657 if (&getToolChain() == C.getCudaDeviceToolChain())
3658 AuxToolChain = C.getCudaHostToolChain();
3659 else if (&getToolChain() == C.getCudaHostToolChain())
3660 AuxToolChain = C.getCudaDeviceToolChain();
3661 else
3662 llvm_unreachable("Can't figure out CUDA compilation mode.");
3663 assert(AuxToolChain != nullptr && "No aux toolchain.");
3664 CmdArgs.push_back("-aux-triple");
3665 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3666 }
3667
James Y Knight2db38f32015-08-15 03:45:25 +00003668 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3669 Triple.getArch() == llvm::Triple::thumb)) {
3670 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003671 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003672 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003673 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003674 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003675 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003676 }
3677
Tim Northover336f1892014-03-29 13:16:12 +00003678 // Push all default warning arguments that are specific to
3679 // the given target. These come before user provided warning options
3680 // are provided.
3681 getToolChain().addClangWarningOptions(CmdArgs);
3682
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003683 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003684 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003685
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003686 if (isa<AnalyzeJobAction>(JA)) {
3687 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3688 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003689 } else if (isa<MigrateJobAction>(JA)) {
3690 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003691 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003692 if (Output.getType() == types::TY_Dependencies)
3693 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003694 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003695 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003696 if (Args.hasArg(options::OPT_rewrite_objc) &&
3697 !Args.hasArg(options::OPT_g_Group))
3698 CmdArgs.push_back("-P");
3699 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003700 } else if (isa<AssembleJobAction>(JA)) {
3701 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003702
David Blaikie9260ed62013-07-25 21:19:01 +00003703 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003704
3705 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003706 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003707 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003708 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003709 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003710
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003711 if (JA.getType() == types::TY_Nothing)
3712 CmdArgs.push_back("-fsyntax-only");
3713 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003714 CmdArgs.push_back("-emit-pch");
3715 else
3716 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003717 } else if (isa<VerifyPCHJobAction>(JA)) {
3718 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003719 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003720 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3721 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003722 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003723 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003724 } else if (JA.getType() == types::TY_LLVM_IR ||
3725 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003726 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003727 } else if (JA.getType() == types::TY_LLVM_BC ||
3728 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003729 CmdArgs.push_back("-emit-llvm-bc");
3730 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003731 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003732 } else if (JA.getType() == types::TY_AST) {
3733 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003734 } else if (JA.getType() == types::TY_ModuleFile) {
3735 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003736 } else if (JA.getType() == types::TY_RewrittenObjC) {
3737 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003738 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003739 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3740 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003741 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003742 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003743 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003744 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003745
3746 // Preserve use-list order by default when emitting bitcode, so that
3747 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3748 // same result as running passes here. For LTO, we don't need to preserve
3749 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003750 if (JA.getType() == types::TY_LLVM_BC)
3751 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003752
3753 if (D.isUsingLTO())
3754 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003755 }
3756
Teresa Johnsonaff22322015-12-07 19:21:34 +00003757 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3758 if (!types::isLLVMIR(Input.getType()))
3759 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3760 << "-x ir";
3761 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3762 }
3763
Steven Wu574b0f22016-03-01 01:07:58 +00003764 // Embed-bitcode option.
3765 if (C.getDriver().embedBitcodeEnabled() &&
3766 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3767 // Add flags implied by -fembed-bitcode.
3768 CmdArgs.push_back("-fembed-bitcode");
3769 // Disable all llvm IR level optimizations.
3770 CmdArgs.push_back("-disable-llvm-optzns");
3771 }
3772 if (C.getDriver().embedBitcodeMarkerOnly())
3773 CmdArgs.push_back("-fembed-bitcode-marker");
3774
Justin Bognera88f0122014-06-20 22:59:50 +00003775 // We normally speed up the clang process a bit by skipping destructors at
3776 // exit, but when we're generating diagnostics we can rely on some of the
3777 // cleanup.
3778 if (!C.isForDiagnostics())
3779 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003780
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003781// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003782#ifdef NDEBUG
3783 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003784 // Discard LLVM value names in -asserts builds.
3785 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003786#endif
3787
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003788 // Set the main file name, so that debug info works even with
3789 // -save-temps.
3790 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003791 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003792
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003793 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003794 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003795 if (Args.hasArg(options::OPT_static))
3796 CmdArgs.push_back("-static-define");
3797
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003798 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003799 // Enable region store model by default.
3800 CmdArgs.push_back("-analyzer-store=region");
3801
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003802 // Treat blocks as analysis entry points.
3803 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3804
Ted Kremenek49c79792011-03-24 00:28:47 +00003805 CmdArgs.push_back("-analyzer-eagerly-assume");
3806
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003807 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003808 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003809 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003810
Devin Coughlin65c77082016-01-21 20:09:49 +00003811 if (!IsWindowsMSVC) {
3812 CmdArgs.push_back("-analyzer-checker=unix");
3813 } else {
3814 // Enable "unix" checkers that also work on Windows.
3815 CmdArgs.push_back("-analyzer-checker=unix.API");
3816 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3817 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3818 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3819 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3820 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3821 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003822
Sean Evesonb38c32b2016-01-06 10:03:58 +00003823 // Disable some unix checkers for PS4.
3824 if (IsPS4CPU) {
3825 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3826 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3827 }
3828
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003829 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003830 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003831
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003832 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003833
Artem Belevichba558952015-05-06 18:20:23 +00003834 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003835 CmdArgs.push_back("-analyzer-checker=cplusplus");
3836
Sean Evesonb38c32b2016-01-06 10:03:58 +00003837 if (!IsPS4CPU) {
3838 CmdArgs.push_back(
3839 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3840 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3841 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3842 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3843 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3844 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3845 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003846
3847 // Default nullability checks.
3848 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3849 CmdArgs.push_back(
3850 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003851 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003852
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003853 // Set the output format. The default is plist, for (lame) historical
3854 // reasons.
3855 CmdArgs.push_back("-analyzer-output");
3856 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003857 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003858 else
3859 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003860
Ted Kremenekfe449a22010-03-22 22:32:05 +00003861 // Disable the presentation of standard compiler warnings when
3862 // using --analyze. We only want to show static analyzer diagnostics
3863 // or frontend errors.
3864 CmdArgs.push_back("-w");
3865
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003866 // Add -Xanalyzer arguments when running as analyzer.
3867 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003868 }
3869
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003870 CheckCodeGenerationOptions(D, Args);
3871
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003872 llvm::Reloc::Model RelocationModel;
3873 unsigned PICLevel;
3874 bool IsPIE;
3875 std::tie(RelocationModel, PICLevel, IsPIE) =
3876 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003877
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003878 const char *RMName = RelocationModelName(RelocationModel);
3879 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003880 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003881 CmdArgs.push_back(RMName);
3882 }
3883 if (PICLevel > 0) {
3884 CmdArgs.push_back("-pic-level");
3885 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3886 if (IsPIE) {
3887 CmdArgs.push_back("-pie-level");
3888 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003889 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003890 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003891
Renato Golin4854d802015-11-09 12:40:41 +00003892 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3893 CmdArgs.push_back("-meabi");
3894 CmdArgs.push_back(A->getValue());
3895 }
3896
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003897 CmdArgs.push_back("-mthread-model");
3898 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3899 CmdArgs.push_back(A->getValue());
3900 else
3901 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3902
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003903 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3904
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003905 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3906 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003907 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003908
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003909 // LLVM Code Generator Options.
3910
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003911 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3912 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003913 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3914 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003915 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003916 CmdArgs.push_back(A->getValue());
3917 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003918 }
3919 }
3920
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003921 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3922 StringRef v = A->getValue();
3923 CmdArgs.push_back("-mllvm");
3924 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3925 A->claim();
3926 }
3927
Nirav Daved2f44d82016-04-05 17:50:43 +00003928 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3929 true))
3930 CmdArgs.push_back("-fno-jump-tables");
3931
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003932 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3933 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003934 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003935 }
3936
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003937 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3938 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003939 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003940 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003941 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003942 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3943 CmdArgs.push_back("-fpcc-struct-return");
3944 } else {
3945 assert(A->getOption().matches(options::OPT_freg_struct_return));
3946 CmdArgs.push_back("-freg-struct-return");
3947 }
3948 }
3949
Roman Divacky65b88cd2011-03-01 17:40:53 +00003950 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3951 CmdArgs.push_back("-mrtd");
3952
Rafael Espindola224dd632011-12-14 21:02:23 +00003953 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003954 CmdArgs.push_back("-mdisable-fp-elim");
3955 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3956 options::OPT_fno_zero_initialized_in_bss))
3957 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003958
3959 bool OFastEnabled = isOptimizationLevelFast(Args);
3960 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3961 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003962 OptSpecifier StrictAliasingAliasOption =
3963 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003964 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3965 // doesn't do any TBAA.
3966 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003967 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003968 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003969 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003970 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3971 options::OPT_fno_struct_path_tbaa))
3972 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003973 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3974 false))
3975 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003976 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3977 options::OPT_fno_strict_vtable_pointers,
3978 false))
3979 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003980 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3981 options::OPT_fno_optimize_sibling_calls))
3982 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003983
Eric Christopher006208c2013-04-04 06:29:47 +00003984 // Handle segmented stacks.
3985 if (Args.hasArg(options::OPT_fsplit_stack))
3986 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003987
3988 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3989 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003990 OptSpecifier FastMathAliasOption =
3991 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3992
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003993 // Handle various floating point optimization flags, mapping them to the
3994 // appropriate LLVM code generation flags. The pattern for all of these is to
3995 // default off the codegen optimizations, and if any flag enables them and no
3996 // flag disables them after the flag enabling them, enable the codegen
3997 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003998 if (Arg *A = Args.getLastArg(
3999 options::OPT_ffast_math, FastMathAliasOption,
4000 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4001 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4002 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004003 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4004 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004005 A->getOption().getID() != options::OPT_fhonor_infinities)
4006 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004007 if (Arg *A = Args.getLastArg(
4008 options::OPT_ffast_math, FastMathAliasOption,
4009 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4010 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4011 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004012 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4013 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004014 A->getOption().getID() != options::OPT_fhonor_nans)
4015 CmdArgs.push_back("-menable-no-nans");
4016
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004017 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4018 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004019 if (Arg *A =
4020 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4021 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4022 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004023 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4024 // However, turning *off* -ffast_math merely restores the toolchain default
4025 // (which may be false).
4026 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4027 A->getOption().getID() == options::OPT_ffast_math ||
4028 A->getOption().getID() == options::OPT_Ofast)
4029 MathErrno = false;
4030 else if (A->getOption().getID() == options::OPT_fmath_errno)
4031 MathErrno = true;
4032 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004033 if (MathErrno)
4034 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004035
4036 // There are several flags which require disabling very specific
4037 // optimizations. Any of these being disabled forces us to turn off the
4038 // entire set of LLVM optimizations, so collect them through all the flag
4039 // madness.
4040 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004041 if (Arg *A = Args.getLastArg(
4042 options::OPT_ffast_math, FastMathAliasOption,
4043 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4044 options::OPT_fno_unsafe_math_optimizations,
4045 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004046 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4047 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004048 A->getOption().getID() != options::OPT_fno_associative_math)
4049 AssociativeMath = true;
4050 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004051 if (Arg *A = Args.getLastArg(
4052 options::OPT_ffast_math, FastMathAliasOption,
4053 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4054 options::OPT_fno_unsafe_math_optimizations,
4055 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004056 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4057 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004058 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4059 ReciprocalMath = true;
4060 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004061 if (Arg *A = Args.getLastArg(
4062 options::OPT_ffast_math, FastMathAliasOption,
4063 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4064 options::OPT_fno_unsafe_math_optimizations,
4065 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004066 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4067 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004068 A->getOption().getID() != options::OPT_fsigned_zeros)
4069 SignedZeros = false;
4070 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004071 if (Arg *A = Args.getLastArg(
4072 options::OPT_ffast_math, FastMathAliasOption,
4073 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4074 options::OPT_fno_unsafe_math_optimizations,
4075 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004076 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4077 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004078 A->getOption().getID() != options::OPT_ftrapping_math)
4079 TrappingMath = false;
4080 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4081 !TrappingMath)
4082 CmdArgs.push_back("-menable-unsafe-fp-math");
4083
Sanjay Patel76c9e092015-01-23 16:40:50 +00004084 if (!SignedZeros)
4085 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004086
Sanjay Patel359b1052015-04-09 15:03:23 +00004087 if (ReciprocalMath)
4088 CmdArgs.push_back("-freciprocal-math");
4089
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004090 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004091 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004092 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004093 options::OPT_ffp_contract)) {
4094 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004095 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004096 if (Val == "fast" || Val == "on" || Val == "off") {
4097 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4098 } else {
4099 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004100 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004101 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004102 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4103 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004104 // If fast-math is set then set the fp-contract mode to fast.
4105 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4106 }
4107 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004108
Sanjay Patel2987c292015-06-11 14:53:41 +00004109 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004110
Bob Wilson6a039162012-07-19 03:52:53 +00004111 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4112 // and if we find them, tell the frontend to provide the appropriate
4113 // preprocessor macros. This is distinct from enabling any optimizations as
4114 // these options induce language changes which must survive serialization
4115 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004116 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4117 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004118 if (!A->getOption().matches(options::OPT_fno_fast_math))
4119 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004120 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4121 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004122 if (A->getOption().matches(options::OPT_ffinite_math_only))
4123 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004124
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004125 // Decide whether to use verbose asm. Verbose assembly is the default on
4126 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004127 bool IsIntegratedAssemblerDefault =
4128 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004129 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004130 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004131 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004132 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004133
Rafael Espindolab8a12932015-05-22 20:44:03 +00004134 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4135 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004136 CmdArgs.push_back("-no-integrated-as");
4137
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004138 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4139 CmdArgs.push_back("-mdebug-pass");
4140 CmdArgs.push_back("Structure");
4141 }
4142 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4143 CmdArgs.push_back("-mdebug-pass");
4144 CmdArgs.push_back("Arguments");
4145 }
4146
Justin Lebar710a35f2016-01-25 22:36:35 +00004147 // Enable -mconstructor-aliases except on darwin, where we have to work around
4148 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4149 // aliases aren't supported.
4150 if (!getToolChain().getTriple().isOSDarwin() &&
4151 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004152 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004153
John McCall7ef5cb32011-03-18 02:56:14 +00004154 // Darwin's kernel doesn't support guard variables; just die if we
4155 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004156 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004157 CmdArgs.push_back("-fforbid-guard-variables");
4158
Akira Hatanaka02028482015-11-12 17:21:22 +00004159 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4160 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004161 CmdArgs.push_back("-mms-bitfields");
4162 }
John McCall8517abc2010-02-19 02:45:38 +00004163
Daniel Dunbar306945d2009-09-16 06:17:29 +00004164 // This is a coarse approximation of what llvm-gcc actually does, both
4165 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4166 // complicated ways.
4167 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004168 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4169 options::OPT_fno_asynchronous_unwind_tables,
4170 (getToolChain().IsUnwindTablesDefault() ||
4171 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4172 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004173 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4174 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004175 CmdArgs.push_back("-munwind-tables");
4176
Chandler Carruth05fb5852012-11-21 23:40:23 +00004177 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004178
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004179 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4180 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004181 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004182 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004183
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004184 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004185 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004186
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004187 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004188 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004189 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004190 }
4191
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004192 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004193 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004194 if (!CPU.empty()) {
4195 CmdArgs.push_back("-target-cpu");
4196 CmdArgs.push_back(Args.MakeArgString(CPU));
4197 }
4198
Rafael Espindolaeb265472013-08-21 21:59:03 +00004199 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4200 CmdArgs.push_back("-mfpmath");
4201 CmdArgs.push_back(A->getValue());
4202 }
4203
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004204 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004205 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004206
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004207 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004208 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004209 default:
4210 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004211
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004212 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004213 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004214 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004215 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004216 // Use the effective triple, which takes into account the deployment target.
4217 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004218 break;
4219
Tim Northover573cbee2014-05-24 12:52:07 +00004220 case llvm::Triple::aarch64:
4221 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004222 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004223 break;
4224
Eric Christopher0b26a612010-03-02 02:41:08 +00004225 case llvm::Triple::mips:
4226 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004227 case llvm::Triple::mips64:
4228 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004229 AddMIPSTargetArgs(Args, CmdArgs);
4230 break;
4231
Ulrich Weigand8afad612014-07-28 13:17:52 +00004232 case llvm::Triple::ppc:
4233 case llvm::Triple::ppc64:
4234 case llvm::Triple::ppc64le:
4235 AddPPCTargetArgs(Args, CmdArgs);
4236 break;
4237
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004238 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004239 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004240 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004241 AddSparcTargetArgs(Args, CmdArgs);
4242 break;
4243
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004244 case llvm::Triple::x86:
4245 case llvm::Triple::x86_64:
4246 AddX86TargetArgs(Args, CmdArgs);
4247 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004248
Jacques Pienaard964cc22016-03-28 21:02:54 +00004249 case llvm::Triple::lanai:
4250 AddLanaiTargetArgs(Args, CmdArgs);
4251 break;
4252
Tony Linthicum76329bf2011-12-12 21:14:55 +00004253 case llvm::Triple::hexagon:
4254 AddHexagonTargetArgs(Args, CmdArgs);
4255 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004256
4257 case llvm::Triple::wasm32:
4258 case llvm::Triple::wasm64:
4259 AddWebAssemblyTargetArgs(Args, CmdArgs);
4260 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004261 }
4262
Douglas Katzman3459ce22015-10-08 04:24:12 +00004263 // The 'g' groups options involve a somewhat intricate sequence of decisions
4264 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004265 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004266 // * what level of debug info to generate
4267 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004268 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004269 // This avoids having to monkey around further in cc1 other than to disable
4270 // codeview if not running in a Windows environment. Perhaps even that
4271 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004272 unsigned DwarfVersion = 0;
4273 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4274 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004275 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004276 bool EmitCodeView = false;
4277
Hans Wennborg75958c42013-08-08 00:17:41 +00004278 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004279 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004280 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004281 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004282
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004283 // Pass the linker version in use.
4284 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4285 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004286 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004287 }
4288
Eric Christopherb7d97e92013-04-03 01:58:53 +00004289 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004290 CmdArgs.push_back("-momit-leaf-frame-pointer");
4291
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004292 // Explicitly error on some things we know we don't support and can't just
4293 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004294 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4295 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004296 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004297 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004298 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4299 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004300 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004301 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004302 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004303 }
4304
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004305 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004306 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004307 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004308 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004309 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4310 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004311 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004312 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004313 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004314
Chad Rosierbe10f982011-08-02 17:58:04 +00004315 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004316 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004317 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4318 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004319 }
4320
Rafael Espindola08a692a2010-03-07 04:46:18 +00004321 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004322 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004323 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004324 // If the last option explicitly specified a debug-info level, use it.
4325 if (A->getOption().matches(options::OPT_gN_Group)) {
4326 DebugInfoKind = DebugLevelToInfoKind(*A);
4327 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4328 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4329 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004330 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004331 A->getIndex() > SplitDwarfArg->getIndex())
4332 SplitDwarfArg = nullptr;
4333 } else
4334 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004335 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004336 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004337
Paul Robinson0334a042015-12-19 19:41:48 +00004338 // If a debugger tuning argument appeared, remember it.
4339 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4340 options::OPT_ggdbN_Group)) {
4341 if (A->getOption().matches(options::OPT_glldb))
4342 DebuggerTuning = llvm::DebuggerKind::LLDB;
4343 else if (A->getOption().matches(options::OPT_gsce))
4344 DebuggerTuning = llvm::DebuggerKind::SCE;
4345 else
4346 DebuggerTuning = llvm::DebuggerKind::GDB;
4347 }
4348
4349 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004350 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004351 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004352 DwarfVersion = DwarfVersionNum(A->getSpelling());
4353
Reid Kleckner124955a2015-08-05 18:51:13 +00004354 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004355 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4356 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4357 // DwarfVersion remains at 0 if no explicit choice was made.
4358 CmdArgs.push_back("-gcodeview");
4359 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004360 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004361 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4362 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004363
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004364 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4365 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004366
4367 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004368 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004369 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004370 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004371
Eric Christopher138c32b2013-09-13 22:37:55 +00004372 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004373 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004374 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004375 CmdArgs.push_back("-dwarf-ext-refs");
4376 CmdArgs.push_back("-fmodule-format=obj");
4377 }
4378
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004379 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4380 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004381 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004382 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004383 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004384 CmdArgs.push_back("-backend-option");
4385 CmdArgs.push_back("-split-dwarf=Enable");
4386 }
4387
Douglas Katzman3459ce22015-10-08 04:24:12 +00004388 // After we've dealt with all combinations of things that could
4389 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4390 // figure out if we need to "upgrade" it to standalone debug info.
4391 // We parse these two '-f' options whether or not they will be used,
4392 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4393 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4394 options::OPT_fno_standalone_debug,
4395 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004396 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4397 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004398 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4399 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004400
Eric Christopher138c32b2013-09-13 22:37:55 +00004401 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4402 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4403 CmdArgs.push_back("-backend-option");
4404 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4405 }
Eric Christophereec89c22013-06-18 00:03:50 +00004406
Eric Christopher0d403d22014-02-14 01:27:03 +00004407 // -gdwarf-aranges turns on the emission of the aranges section in the
4408 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004409 // Always enabled on the PS4.
4410 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004411 CmdArgs.push_back("-backend-option");
4412 CmdArgs.push_back("-generate-arange-section");
4413 }
4414
David Blaikief36d9ba2014-01-27 18:52:43 +00004415 if (Args.hasFlag(options::OPT_fdebug_types_section,
4416 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004417 CmdArgs.push_back("-backend-option");
4418 CmdArgs.push_back("-generate-type-units");
4419 }
Eric Christophereec89c22013-06-18 00:03:50 +00004420
Dan Gohmana5b804b2016-01-07 00:50:27 +00004421 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4422 // default.
4423 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4424 Triple.getArch() == llvm::Triple::wasm32 ||
4425 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004426
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004427 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004428 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004429 CmdArgs.push_back("-ffunction-sections");
4430 }
4431
Benjamin Kramer5556a5c2016-04-28 12:14:47 +00004432 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4433 options::OPT_fno_whole_program_vtables, false)) {
4434 if (!D.isUsingLTO())
4435 D.Diag(diag::err_drv_argument_only_allowed_with)
4436 << "-fwhole-program-vtables"
4437 << "-flto";
4438 CmdArgs.push_back("-fwhole-program-vtables");
4439
4440 clang::SmallString<64> Path(D.ResourceDir);
4441 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4442 if (llvm::sys::fs::exists(Path)) {
4443 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4444 BlacklistOpt += Path.str();
4445 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4446 }
4447
4448 for (const Arg *A :
4449 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4450 A->claim();
4451 if (!llvm::sys::fs::exists(A->getValue()))
4452 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4453 }
4454
4455 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4456 }
4457
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004458 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4459 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004460 CmdArgs.push_back("-fdata-sections");
4461 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004462
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004463 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004464 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004465 CmdArgs.push_back("-fno-unique-section-names");
4466
Chris Lattner3c77a352010-06-22 00:03:40 +00004467 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4468
Diego Novilloa0545962015-07-10 18:00:07 +00004469 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004470
Paul Robinsond083b9a2015-12-16 17:25:27 +00004471 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4472 if (getToolChain().getTriple().isPS4CPU())
4473 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4474
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004475 // Pass options for controlling the default header search paths.
4476 if (Args.hasArg(options::OPT_nostdinc)) {
4477 CmdArgs.push_back("-nostdsysteminc");
4478 CmdArgs.push_back("-nobuiltininc");
4479 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004480 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004481 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004482 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4483 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4484 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004485
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004486 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004487 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004488 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004489
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004490 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4491
Ted Kremenekf7639e12012-03-06 20:06:33 +00004492 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004493 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004494 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004495 options::OPT_ccc_arcmt_modify,
4496 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004497 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004498 switch (A->getOption().getID()) {
4499 default:
4500 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004501 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004502 CmdArgs.push_back("-arcmt-check");
4503 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004504 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004505 CmdArgs.push_back("-arcmt-modify");
4506 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004507 case options::OPT_ccc_arcmt_migrate:
4508 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004509 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004510 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004511
4512 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4513 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004514 break;
John McCalld70fb982011-06-15 23:25:17 +00004515 }
4516 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004517 } else {
4518 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4519 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4520 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004521 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004522
Ted Kremenekf7639e12012-03-06 20:06:33 +00004523 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4524 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004525 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4526 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004527 }
4528 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004529 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004530
4531 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004532 options::OPT_objcmt_migrate_subscripting,
4533 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004534 // None specified, means enable them all.
4535 CmdArgs.push_back("-objcmt-migrate-literals");
4536 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004537 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004538 } else {
4539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004542 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004543 } else {
4544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004551 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4552 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4553 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4554 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4555 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4556 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4557 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004558 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004559 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004560 }
4561
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004562 // Add preprocessing options like -I, -D, etc. if we are using the
4563 // preprocessor.
4564 //
4565 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004566 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004567 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4568 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004569
Rafael Espindolaa7431922011-07-21 23:40:37 +00004570 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4571 // that "The compiler can only warn and ignore the option if not recognized".
4572 // When building with ccache, it will pass -D options to clang even on
4573 // preprocessed inputs and configure concludes that -fPIC is not supported.
4574 Args.ClaimAllArgs(options::OPT_D);
4575
Alp Toker7874bdc2013-11-15 20:40:58 +00004576 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004577 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4578 if (A->getOption().matches(options::OPT_O4)) {
4579 CmdArgs.push_back("-O3");
4580 D.Diag(diag::warn_O4_is_O3);
4581 } else {
4582 A->render(Args, CmdArgs);
4583 }
4584 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004585
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004586 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004587 for (const Arg *A :
4588 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4589 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004590 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004591 }
4592
Rafael Espindola577637a2015-01-03 00:06:04 +00004593 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004594
Richard Smith3be1cb22014-08-07 00:24:21 +00004595 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004596 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004597 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4598 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004599 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004600 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004601
4602 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004603 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004604 //
4605 // If a std is supplied, only add -trigraphs if it follows the
4606 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004607 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004608 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4609 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004610 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004611 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004612 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004613 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004614 else
4615 Std->render(Args, CmdArgs);
4616
Nico Weber00721502014-12-23 22:32:37 +00004617 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004618 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004619 options::OPT_ftrigraphs,
4620 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004621 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004622 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004623 } else {
4624 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004625 //
4626 // FIXME: Clang doesn't correctly handle -std= when the input language
4627 // doesn't match. For the time being just ignore this for C++ inputs;
4628 // eventually we want to do all the standard defaulting here instead of
4629 // splitting it between the driver and clang -cc1.
4630 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004631 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4632 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004633 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004634 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004635
Nico Weber00721502014-12-23 22:32:37 +00004636 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4637 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004638 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004639
Richard Smith282b4492013-09-04 22:50:31 +00004640 // GCC's behavior for -Wwrite-strings is a bit strange:
4641 // * In C, this "warning flag" changes the types of string literals from
4642 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4643 // for the discarded qualifier.
4644 // * In C++, this is just a normal warning flag.
4645 //
4646 // Implementing this warning correctly in C is hard, so we follow GCC's
4647 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4648 // a non-const char* in C, rather than using this crude hack.
4649 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004650 // FIXME: This should behave just like a warning flag, and thus should also
4651 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4652 Arg *WriteStrings =
4653 Args.getLastArg(options::OPT_Wwrite_strings,
4654 options::OPT_Wno_write_strings, options::OPT_w);
4655 if (WriteStrings &&
4656 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004657 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004658 }
4659
Chandler Carruth61fbf622011-04-23 09:27:53 +00004660 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004661 // during C++ compilation, which it is by default. GCC keeps this define even
4662 // in the presence of '-w', match this behavior bug-for-bug.
4663 if (types::isCXX(InputType) &&
4664 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4665 true)) {
4666 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004667 }
4668
Chandler Carruthe0391482010-05-22 02:21:53 +00004669 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4670 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4671 if (Asm->getOption().matches(options::OPT_fasm))
4672 CmdArgs.push_back("-fgnu-keywords");
4673 else
4674 CmdArgs.push_back("-fno-gnu-keywords");
4675 }
4676
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004677 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4678 CmdArgs.push_back("-fno-dwarf-directory-asm");
4679
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004680 if (ShouldDisableAutolink(Args, getToolChain()))
4681 CmdArgs.push_back("-fno-autolink");
4682
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004683 // Add in -fdebug-compilation-dir if necessary.
4684 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004685
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004686 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4687 StringRef Map = A->getValue();
4688 if (Map.find('=') == StringRef::npos)
4689 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4690 else
4691 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4692 A->claim();
4693 }
4694
Richard Smith9a568822011-11-21 19:36:32 +00004695 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4696 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004697 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004698 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004699 }
4700
Richard Smith79c927b2013-11-06 19:31:51 +00004701 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4702 CmdArgs.push_back("-foperator-arrow-depth");
4703 CmdArgs.push_back(A->getValue());
4704 }
4705
Richard Smith9a568822011-11-21 19:36:32 +00004706 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4707 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004708 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004709 }
4710
Richard Smitha3d3bd22013-05-08 02:12:03 +00004711 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4712 CmdArgs.push_back("-fconstexpr-steps");
4713 CmdArgs.push_back(A->getValue());
4714 }
4715
Richard Smithb3a14522013-02-22 01:59:51 +00004716 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4717 CmdArgs.push_back("-fbracket-depth");
4718 CmdArgs.push_back(A->getValue());
4719 }
4720
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004721 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4722 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004723 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004724 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004725 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4726 } else
4727 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004728 }
4729
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004730 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004731 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004732
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004733 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4734 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004735 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004736 }
David Chisnall5778fce2009-08-31 16:41:57 +00004737
Chris Lattnere23003d2010-01-09 21:54:33 +00004738 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4739 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004740 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004741 }
4742
Chris Lattnerb35583d2010-04-07 20:49:23 +00004743 CmdArgs.push_back("-ferror-limit");
4744 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004745 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004746 else
4747 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004748
Chandler Carrutha77a7272010-05-06 04:55:18 +00004749 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4750 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004751 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004752 }
4753
4754 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4755 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004756 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004757 }
4758
Richard Smithf6f003a2011-12-16 19:06:07 +00004759 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4760 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004761 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004762 }
4763
Nick Lewycky24653262014-12-16 21:39:02 +00004764 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4765 CmdArgs.push_back("-fspell-checking-limit");
4766 CmdArgs.push_back(A->getValue());
4767 }
4768
Daniel Dunbar2c978472009-11-04 06:24:47 +00004769 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004770 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004771 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004772 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004773 } else {
4774 // If -fmessage-length=N was not specified, determine whether this is a
4775 // terminal and, if so, implicitly define -fmessage-length appropriately.
4776 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004777 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004778 }
4779
John McCallb4a99d32013-02-19 01:57:35 +00004780 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4781 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4782 options::OPT_fvisibility_ms_compat)) {
4783 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4784 CmdArgs.push_back("-fvisibility");
4785 CmdArgs.push_back(A->getValue());
4786 } else {
4787 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4788 CmdArgs.push_back("-fvisibility");
4789 CmdArgs.push_back("hidden");
4790 CmdArgs.push_back("-ftype-visibility");
4791 CmdArgs.push_back("default");
4792 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004793 }
4794
Douglas Gregor08329632010-06-15 17:05:35 +00004795 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004796
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004797 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4798
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004799 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004800 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4801 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004802 CmdArgs.push_back("-ffreestanding");
4803
Daniel Dunbare357d562009-12-03 18:42:11 +00004804 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004805 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004806 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004807 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004808 // Emulated TLS is enabled by default on Android, and can be enabled manually
4809 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004810 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004811 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4812 EmulatedTLSDefault))
4813 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004814 // AltiVec-like language extensions aren't relevant for assembling.
4815 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004816 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004817 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4818 }
Richard Trieu91844232012-06-26 18:18:47 +00004819 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4820 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004821
Alexey Bataevdb390212015-05-20 04:24:19 +00004822 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004823 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4824 options::OPT_fno_openmp, false))
4825 switch (getOpenMPRuntime(getToolChain(), Args)) {
4826 case OMPRT_OMP:
4827 case OMPRT_IOMP5:
4828 // Clang can generate useful OpenMP code for these two runtime libraries.
4829 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004830
4831 // If no option regarding the use of TLS in OpenMP codegeneration is
4832 // given, decide a default based on the target. Otherwise rely on the
4833 // options and pass the right information to the frontend.
4834 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004835 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004836 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004837 break;
4838 default:
4839 // By default, if Clang doesn't know how to generate useful OpenMP code
4840 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4841 // down to the actual compilation.
4842 // FIXME: It would be better to have a mode which *only* omits IR
4843 // generation based on the OpenMP support so that we get consistent
4844 // semantic analysis, etc.
4845 break;
4846 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004847
Peter Collingbourne32701642013-11-01 18:16:25 +00004848 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004849 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004850
Eric Christopher459d2712013-02-19 06:16:53 +00004851 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004852 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4853 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4854 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4855 Arch == llvm::Triple::ppc64le))
4856 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4857 << "ppc/ppc64/ppc64le";
4858 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004859
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004860 // -fzvector is incompatible with -faltivec.
4861 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4862 if (Args.hasArg(options::OPT_faltivec))
4863 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4864 << "-faltivec";
4865
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004866 if (getToolChain().SupportsProfiling())
4867 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004868
4869 // -flax-vector-conversions is default.
4870 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4871 options::OPT_fno_lax_vector_conversions))
4872 CmdArgs.push_back("-fno-lax-vector-conversions");
4873
John Brawna7b4ec02015-08-10 11:11:28 +00004874 if (Args.getLastArg(options::OPT_fapple_kext) ||
4875 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004876 CmdArgs.push_back("-fapple-kext");
4877
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004878 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004879 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004880 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004881 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4882 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004883
4884 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4885 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004886 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004887 }
4888
Bob Wilson14adb362012-02-03 06:27:22 +00004889 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004890
Chandler Carruth6e501032011-03-27 00:04:55 +00004891 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4892 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004893 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004894 if (A->getOption().matches(options::OPT_fwrapv))
4895 CmdArgs.push_back("-fwrapv");
4896 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4897 options::OPT_fno_strict_overflow)) {
4898 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4899 CmdArgs.push_back("-fwrapv");
4900 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004901
4902 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4903 options::OPT_fno_reroll_loops))
4904 if (A->getOption().matches(options::OPT_freroll_loops))
4905 CmdArgs.push_back("-freroll-loops");
4906
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004907 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004908 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4909 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004910
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004911 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4912
Daniel Dunbar4930e332009-11-17 08:07:36 +00004913 // -stack-protector=0 is default.
4914 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004915 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4916 options::OPT_fstack_protector_all,
4917 options::OPT_fstack_protector_strong,
4918 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004919 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004920 StackProtectorLevel = std::max<unsigned>(
4921 LangOptions::SSPOn,
4922 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004923 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004924 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004925 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004926 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004927 } else {
4928 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004929 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004930 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004931 if (StackProtectorLevel) {
4932 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004933 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004934 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004935
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004936 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004937 for (const Arg *A : Args.filtered(options::OPT__param)) {
4938 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004939 if (Str.startswith("ssp-buffer-size=")) {
4940 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004941 CmdArgs.push_back("-stack-protector-buffer-size");
4942 // FIXME: Verify the argument is a valid integer.
4943 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004944 }
Sean Silva14facf32015-06-09 01:57:17 +00004945 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004946 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004947 }
4948
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004949 // Translate -mstackrealign
4950 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004951 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004952 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004953
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004954 if (Args.hasArg(options::OPT_mstack_alignment)) {
4955 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4956 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004957 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004958
Hans Wennborg77dc2362015-01-20 19:45:50 +00004959 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4960 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4961
4962 if (!Size.empty())
4963 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4964 else
4965 CmdArgs.push_back("-mstack-probe-size=0");
4966 }
4967
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004968 switch (getToolChain().getArch()) {
4969 case llvm::Triple::aarch64:
4970 case llvm::Triple::aarch64_be:
4971 case llvm::Triple::arm:
4972 case llvm::Triple::armeb:
4973 case llvm::Triple::thumb:
4974 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004975 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004976 break;
4977
4978 default:
4979 break;
4980 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004981
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004982 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4983 options::OPT_mno_restrict_it)) {
4984 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4985 CmdArgs.push_back("-backend-option");
4986 CmdArgs.push_back("-arm-restrict-it");
4987 } else {
4988 CmdArgs.push_back("-backend-option");
4989 CmdArgs.push_back("-arm-no-restrict-it");
4990 }
James Y Knight2db38f32015-08-15 03:45:25 +00004991 } else if (Triple.isOSWindows() &&
4992 (Triple.getArch() == llvm::Triple::arm ||
4993 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004994 // Windows on ARM expects restricted IT blocks
4995 CmdArgs.push_back("-backend-option");
4996 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004997 }
4998
Daniel Dunbard18049a2009-04-07 21:16:11 +00004999 // Forward -f options with positive and negative forms; we translate
5000 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00005001 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5002 StringRef fname = A->getValue();
5003 if (!llvm::sys::fs::exists(fname))
5004 D.Diag(diag::err_drv_no_such_file) << fname;
5005 else
5006 A->render(Args, CmdArgs);
5007 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005008
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005009 // -fbuiltin is default unless -mkernel is used.
5010 bool UseBuiltins =
5011 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5012 !Args.hasArg(options::OPT_mkernel));
5013 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005014 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005015
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005016 // -ffreestanding implies -fno-builtin.
5017 if (Args.hasArg(options::OPT_ffreestanding))
5018 UseBuiltins = false;
5019
5020 // Process the -fno-builtin-* options.
5021 for (const auto &Arg : Args) {
5022 const Option &O = Arg->getOption();
5023 if (!O.matches(options::OPT_fno_builtin_))
5024 continue;
5025
5026 Arg->claim();
5027 // If -fno-builtin is specified, then there's no need to pass the option to
5028 // the frontend.
5029 if (!UseBuiltins)
5030 continue;
5031
5032 StringRef FuncName = Arg->getValue();
5033 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5034 }
5035
Nuno Lopes13c88c72009-12-16 16:59:22 +00005036 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5037 options::OPT_fno_assume_sane_operator_new))
5038 CmdArgs.push_back("-fno-assume-sane-operator-new");
5039
Daniel Dunbar4930e332009-11-17 08:07:36 +00005040 // -fblocks=0 is default.
5041 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005042 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005043 (Args.hasArg(options::OPT_fgnu_runtime) &&
5044 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5045 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005046 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005048 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005049 !getToolChain().hasBlocksRuntime())
5050 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005051 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005052
Richard Smith47972af2015-06-16 00:08:24 +00005053 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005054 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005055 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005056 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005057 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005058 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5059 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005060 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005061 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005062 HaveModules = true;
5063 }
5064 }
5065
Richard Smith47972af2015-06-16 00:08:24 +00005066 // -fmodule-maps enables implicit reading of module map files. By default,
5067 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005068 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5069 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005070 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005071 }
5072
Daniel Jasperac42b752013-10-21 06:34:34 +00005073 // -fmodules-decluse checks that modules used are declared so (off by
5074 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005075 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005076 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005077 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005078 }
5079
Daniel Jasper962b38e2014-04-11 11:47:45 +00005080 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5081 // all #included headers are part of modules.
5082 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005083 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005084 CmdArgs.push_back("-fmodules-strict-decluse");
5085 }
5086
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005087 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5088 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5089 options::OPT_fno_implicit_modules)) {
5090 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005091 } else if (HaveModules) {
5092 // -fmodule-cache-path specifies where our implicitly-built module files
5093 // should be written.
5094 SmallString<128> Path;
5095 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5096 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005097 if (C.isForDiagnostics()) {
5098 // When generating crash reports, we want to emit the modules along with
5099 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005100 Path = Output.getFilename();
5101 llvm::sys::path::replace_extension(Path, ".cache");
5102 llvm::sys::path::append(Path, "modules");
5103 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005104 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005105 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005106 llvm::sys::path::append(Path, "org.llvm.clang.");
5107 appendUserToPath(Path);
5108 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005109 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005110 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005111 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5112 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005113 }
5114
Richard Smith8d83d6d2016-03-21 19:06:06 +00005115 // -fmodule-name specifies the module that is currently being built (or
5116 // used for header checking by -fmodule-maps).
5117 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5118
5119 // -fmodule-map-file can be used to specify files containing module
5120 // definitions.
5121 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5122
5123 // -fmodule-file can be used to specify files containing precompiled modules.
5124 if (HaveModules)
5125 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5126 else
5127 Args.ClaimAllArgs(options::OPT_fmodule_file);
5128
Justin Bognera88f0122014-06-20 22:59:50 +00005129 // When building modules and generating crashdumps, we need to dump a module
5130 // dependency VFS alongside the output.
5131 if (HaveModules && C.isForDiagnostics()) {
5132 SmallString<128> VFSDir(Output.getFilename());
5133 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005134 // Add the cache directory as a temp so the crash diagnostics pick it up.
5135 C.addTempFile(Args.MakeArgString(VFSDir));
5136
Justin Bognera88f0122014-06-20 22:59:50 +00005137 llvm::sys::path::append(VFSDir, "vfs");
5138 CmdArgs.push_back("-module-dependency-dir");
5139 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005140 }
5141
Richard Smith9887d792014-10-17 01:42:53 +00005142 if (HaveModules)
5143 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005144
Douglas Gregor35b04d62013-02-07 19:01:24 +00005145 // Pass through all -fmodules-ignore-macro arguments.
5146 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005147 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5148 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005149
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005150 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5151
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005152 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5153 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5154 D.Diag(diag::err_drv_argument_not_allowed_with)
5155 << A->getAsString(Args) << "-fbuild-session-timestamp";
5156
5157 llvm::sys::fs::file_status Status;
5158 if (llvm::sys::fs::status(A->getValue(), Status))
5159 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005160 CmdArgs.push_back(Args.MakeArgString(
5161 "-fbuild-session-timestamp=" +
5162 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005163 }
5164
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005165 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005166 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5167 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005168 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5169
5170 Args.AddLastArg(CmdArgs,
5171 options::OPT_fmodules_validate_once_per_build_session);
5172 }
5173
Ben Langmuirdcf73862014-03-12 00:06:17 +00005174 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5175
John McCalldfea9982010-04-09 19:12:06 +00005176 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005177 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005178 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005179 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005180
Anders Carlssond470fef2010-11-21 00:09:52 +00005181 // -felide-constructors is the default.
5182 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005183 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005184 CmdArgs.push_back("-fno-elide-constructors");
5185
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005186 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005187
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005188 if (KernelOrKext || (types::isCXX(InputType) &&
5189 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5190 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005191 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005192
Tony Linthicum76329bf2011-12-12 21:14:55 +00005193 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005194 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5195 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005196 CmdArgs.push_back("-fshort-enums");
5197
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005198 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005199 if (Arg *A = Args.getLastArg(
5200 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5201 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5202 if (A->getOption().matches(options::OPT_funsigned_char) ||
5203 A->getOption().matches(options::OPT_fno_signed_char)) {
5204 CmdArgs.push_back("-fno-signed-char");
5205 }
5206 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005207 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005208 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005209
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005210 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005211 if (!Args.hasFlag(
5212 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5213 !IsWindowsCygnus && !IsWindowsGNU &&
5214 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5215 getToolChain().getArch() != llvm::Triple::hexagon &&
5216 getToolChain().getArch() != llvm::Triple::xcore &&
5217 ((getToolChain().getTriple().getVendor() !=
5218 llvm::Triple::MipsTechnologies) ||
5219 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005220 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005221 CmdArgs.push_back("-fno-use-cxa-atexit");
5222
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005223 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005224 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005225 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005226 CmdArgs.push_back("-fms-extensions");
5227
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005228 // -fno-use-line-directives is default.
5229 if (Args.hasFlag(options::OPT_fuse_line_directives,
5230 options::OPT_fno_use_line_directives, false))
5231 CmdArgs.push_back("-fuse-line-directives");
5232
Francois Pichet1b4f1632011-09-17 04:32:15 +00005233 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005234 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005235 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005236 (IsWindowsMSVC &&
5237 Args.hasFlag(options::OPT_fms_extensions,
5238 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005239 CmdArgs.push_back("-fms-compatibility");
5240
David Majnemerc371ff02015-03-22 08:39:22 +00005241 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005242 VersionTuple MSVT = visualstudio::getMSVCVersion(
5243 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5244 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005245 CmdArgs.push_back(
5246 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005247
David Majnemer8db91762015-05-18 04:49:30 +00005248 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5249 if (ImplyVCPPCXXVer) {
5250 if (IsMSVC2015Compatible)
5251 CmdArgs.push_back("-std=c++14");
5252 else
5253 CmdArgs.push_back("-std=c++11");
5254 }
5255
Eric Christopher5ecce122013-02-18 00:38:31 +00005256 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005257 if (Args.hasFlag(options::OPT_fborland_extensions,
5258 options::OPT_fno_borland_extensions, false))
5259 CmdArgs.push_back("-fborland-extensions");
5260
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005261 // -fno-declspec is default, except for PS4.
5262 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5263 getToolChain().getTriple().isPS4()))
5264 CmdArgs.push_back("-fdeclspec");
5265 else if (Args.hasArg(options::OPT_fno_declspec))
5266 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5267
David Majnemerc371ff02015-03-22 08:39:22 +00005268 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5269 // than 19.
5270 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5271 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005272 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005273 CmdArgs.push_back("-fno-threadsafe-statics");
5274
Francois Pichet02744872011-09-01 16:38:08 +00005275 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5276 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005277 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005278 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005279 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005280
Chandler Carruthe03aa552010-04-17 20:17:31 +00005281 // -fgnu-keywords default varies depending on language; only pass if
5282 // specified.
5283 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005284 options::OPT_fno_gnu_keywords))
5285 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005286
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005287 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005288 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005289 CmdArgs.push_back("-fgnu89-inline");
5290
Chad Rosier9c76d242012-03-15 22:31:42 +00005291 if (Args.hasArg(options::OPT_fno_inline))
5292 CmdArgs.push_back("-fno-inline");
5293
Chad Rosier64d6be92012-03-06 21:17:19 +00005294 if (Args.hasArg(options::OPT_fno_inline_functions))
5295 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005296
John McCall5fb5df92012-06-20 06:18:46 +00005297 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005298
John McCall5fb5df92012-06-20 06:18:46 +00005299 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005300 // legacy is the default. Except for deployment taget of 10.5,
5301 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5302 // gets ignored silently.
5303 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005304 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5305 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005306 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005307 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005308 if (getToolChain().UseObjCMixedDispatch())
5309 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5310 else
5311 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5312 }
5313 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005314
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005315 // When ObjectiveC legacy runtime is in effect on MacOSX,
5316 // turn on the option to do Array/Dictionary subscripting
5317 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005318 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005319 getToolChain().getTriple().isMacOSX() &&
5320 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5321 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005322 objcRuntime.isNeXTFamily())
5323 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005324
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005325 // -fencode-extended-block-signature=1 is default.
5326 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5327 CmdArgs.push_back("-fencode-extended-block-signature");
5328 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005329
John McCall24fc0de2011-07-06 00:26:06 +00005330 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5331 // NOTE: This logic is duplicated in ToolChains.cpp.
5332 bool ARC = isObjCAutoRefCount(Args);
5333 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005334 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005335
John McCall24fc0de2011-07-06 00:26:06 +00005336 CmdArgs.push_back("-fobjc-arc");
5337
Chandler Carruth491db322011-11-04 07:34:47 +00005338 // FIXME: It seems like this entire block, and several around it should be
5339 // wrapped in isObjC, but for now we just use it here as this is where it
5340 // was being used previously.
5341 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5342 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5343 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5344 else
5345 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5346 }
5347
John McCall24fc0de2011-07-06 00:26:06 +00005348 // Allow the user to enable full exceptions code emission.
5349 // We define off for Objective-CC, on for Objective-C++.
5350 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5351 options::OPT_fno_objc_arc_exceptions,
5352 /*default*/ types::isCXX(InputType)))
5353 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005354
John McCall24fc0de2011-07-06 00:26:06 +00005355 }
5356
5357 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5358 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005359 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005360 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005361
John McCall24fc0de2011-07-06 00:26:06 +00005362 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5363 // takes precedence.
5364 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5365 if (!GCArg)
5366 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5367 if (GCArg) {
5368 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005369 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005370 } else if (getToolChain().SupportsObjCGC()) {
5371 GCArg->render(Args, CmdArgs);
5372 } else {
5373 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005374 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005375 }
5376 }
5377
John McCallfbe5ed72015-11-05 19:19:56 +00005378 // Pass down -fobjc-weak or -fno-objc-weak if present.
5379 if (types::isObjC(InputType)) {
5380 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5381 options::OPT_fno_objc_weak);
5382 if (!WeakArg) {
5383 // nothing to do
5384 } else if (GCArg) {
5385 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5386 D.Diag(diag::err_objc_weak_with_gc);
5387 } else if (!objcRuntime.allowsWeak()) {
5388 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5389 D.Diag(diag::err_objc_weak_unsupported);
5390 } else {
5391 WeakArg->render(Args, CmdArgs);
5392 }
5393 }
5394
Bob Wilsonb111ec92015-03-02 19:01:14 +00005395 if (Args.hasFlag(options::OPT_fapplication_extension,
5396 options::OPT_fno_application_extension, false))
5397 CmdArgs.push_back("-fapplication-extension");
5398
Reid Klecknerc542d372014-06-27 17:02:02 +00005399 // Handle GCC-style exception args.
5400 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005401 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5402 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005403
Tim Northovere931f9f2015-10-30 16:30:41 +00005404 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005405 CmdArgs.push_back("-fsjlj-exceptions");
5406
5407 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005408 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5409 options::OPT_fno_assume_sane_operator_new))
5410 CmdArgs.push_back("-fno-assume-sane-operator-new");
5411
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005412 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5413 // most platforms.
5414 if (Args.hasFlag(options::OPT_fsized_deallocation,
5415 options::OPT_fno_sized_deallocation, false))
5416 CmdArgs.push_back("-fsized-deallocation");
5417
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005418 // -fconstant-cfstrings is default, and may be subject to argument translation
5419 // on Darwin.
5420 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5421 options::OPT_fno_constant_cfstrings) ||
5422 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5423 options::OPT_mno_constant_cfstrings))
5424 CmdArgs.push_back("-fno-constant-cfstrings");
5425
John Thompsoned4e2952009-11-05 20:14:16 +00005426 // -fshort-wchar default varies depending on platform; only
5427 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005428 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5429 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005430 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005431
Hans Wennborg28c96312013-07-31 23:39:13 +00005432 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005433 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005434 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005435 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005436
Daniel Dunbar096ed292011-10-05 21:04:55 +00005437 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5438 // -fno-pack-struct doesn't apply to -fpack-struct=.
5439 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005440 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005441 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005442 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005443 } else if (Args.hasFlag(options::OPT_fpack_struct,
5444 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005445 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005446 }
5447
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005448 // Handle -fmax-type-align=N and -fno-type-align
5449 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5450 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5451 if (!SkipMaxTypeAlign) {
5452 std::string MaxTypeAlignStr = "-fmax-type-align=";
5453 MaxTypeAlignStr += A->getValue();
5454 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5455 }
5456 } else if (getToolChain().getTriple().isOSDarwin()) {
5457 if (!SkipMaxTypeAlign) {
5458 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5459 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5460 }
5461 }
5462
John Brawna7b4ec02015-08-10 11:11:28 +00005463 // -fcommon is the default unless compiling kernel code or the target says so
5464 bool NoCommonDefault =
5465 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5466 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5467 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005468 CmdArgs.push_back("-fno-common");
5469
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005470 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005471 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005472 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005473 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005474 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005475 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005476
Daniel Dunbar6358d682010-10-15 22:30:42 +00005477 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005478 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005479 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005480 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005481
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005482 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005483 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5484 StringRef value = inputCharset->getValue();
5485 if (value != "UTF-8")
5486 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5487 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005488 }
5489
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005490 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005491 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5492 StringRef value = execCharset->getValue();
5493 if (value != "UTF-8")
5494 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5495 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005496 }
5497
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005498 // -fcaret-diagnostics is default.
5499 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5500 options::OPT_fno_caret_diagnostics, true))
5501 CmdArgs.push_back("-fno-caret-diagnostics");
5502
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005503 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005504 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005505 options::OPT_fno_diagnostics_fixit_info))
5506 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005507
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005508 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005509 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005510 options::OPT_fno_diagnostics_show_option))
5511 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005512
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005513 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005514 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005515 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005516 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005517 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005519 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005520 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005521 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005522 }
5523
Chandler Carruthb6766f02011-03-27 01:50:55 +00005524 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005525 options::OPT_fdiagnostics_show_note_include_stack,
5526 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005527 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005528 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005529 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5530 else
5531 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5532 }
5533
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005534 // Color diagnostics are the default, unless the terminal doesn't support
5535 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005536 // Support both clang's -f[no-]color-diagnostics and gcc's
5537 // -f[no-]diagnostics-colors[=never|always|auto].
5538 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005539 for (const auto &Arg : Args) {
5540 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005541 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5542 !O.matches(options::OPT_fdiagnostics_color) &&
5543 !O.matches(options::OPT_fno_color_diagnostics) &&
5544 !O.matches(options::OPT_fno_diagnostics_color) &&
5545 !O.matches(options::OPT_fdiagnostics_color_EQ))
5546 continue;
5547
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005548 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005549 if (O.matches(options::OPT_fcolor_diagnostics) ||
5550 O.matches(options::OPT_fdiagnostics_color)) {
5551 ShowColors = Colors_On;
5552 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5553 O.matches(options::OPT_fno_diagnostics_color)) {
5554 ShowColors = Colors_Off;
5555 } else {
5556 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005557 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005558 if (value == "always")
5559 ShowColors = Colors_On;
5560 else if (value == "never")
5561 ShowColors = Colors_Off;
5562 else if (value == "auto")
5563 ShowColors = Colors_Auto;
5564 else
5565 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005566 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005567 }
5568 }
5569 if (ShowColors == Colors_On ||
5570 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005571 CmdArgs.push_back("-fcolor-diagnostics");
5572
Nico Rieck7857d462013-09-11 00:38:02 +00005573 if (Args.hasArg(options::OPT_fansi_escape_codes))
5574 CmdArgs.push_back("-fansi-escape-codes");
5575
Daniel Dunbardb097022009-06-08 21:13:54 +00005576 if (!Args.hasFlag(options::OPT_fshow_source_location,
5577 options::OPT_fno_show_source_location))
5578 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005581 true))
5582 CmdArgs.push_back("-fno-show-column");
5583
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005584 if (!Args.hasFlag(options::OPT_fspell_checking,
5585 options::OPT_fno_spell_checking))
5586 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005587
Chad Rosierc8e56e82012-12-05 21:08:21 +00005588 // -fno-asm-blocks is default.
5589 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5590 false))
5591 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005592
Steven Wucb0d13f2015-01-16 23:05:28 +00005593 // -fgnu-inline-asm is default.
5594 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5595 options::OPT_fno_gnu_inline_asm, true))
5596 CmdArgs.push_back("-fno-gnu-inline-asm");
5597
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005598 // Enable vectorization per default according to the optimization level
5599 // selected. For optimization levels that want vectorization we use the alias
5600 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005601 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005602 OptSpecifier VectorizeAliasOption =
5603 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005604 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005605 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005606 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005607
Chad Rosier136d67d2014-04-28 19:30:57 +00005608 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005609 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005610 OptSpecifier SLPVectAliasOption =
5611 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005612 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005613 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005614 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005615
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005616 // -fno-slp-vectorize-aggressive is default.
5617 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005618 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005619 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005620
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005621 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5622 A->render(Args, CmdArgs);
5623
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005624 // -fdollars-in-identifiers default varies depending on platform and
5625 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005626 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005627 options::OPT_fno_dollars_in_identifiers)) {
5628 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005629 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005630 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005631 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005632 }
5633
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005634 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5635 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005636 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005637 options::OPT_fno_unit_at_a_time)) {
5638 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005639 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005640 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005641
Eli Friedman055c9702011-11-02 01:53:16 +00005642 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5643 options::OPT_fno_apple_pragma_pack, false))
5644 CmdArgs.push_back("-fapple-pragma-pack");
5645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005646 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005647 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5648 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005649 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005650 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005651 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005653// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5654//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005655// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005656#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005657 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005658 (getToolChain().getArch() == llvm::Triple::arm ||
5659 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005660 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5661 CmdArgs.push_back("-fno-builtin-strcat");
5662 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5663 CmdArgs.push_back("-fno-builtin-strcpy");
5664 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005665#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005666
Justin Bognera88f0122014-06-20 22:59:50 +00005667 // Enable rewrite includes if the user's asked for it or if we're generating
5668 // diagnostics.
5669 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5670 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005671 if (Args.hasFlag(options::OPT_frewrite_includes,
5672 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005673 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005674 CmdArgs.push_back("-frewrite-includes");
5675
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005676 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005677 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005678 options::OPT_traditional_cpp)) {
5679 if (isa<PreprocessJobAction>(JA))
5680 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005681 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005682 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005683 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005684
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005685 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005686 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005687
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005688 // Handle serialized diagnostics.
5689 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5690 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005691 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005692 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005693
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005694 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5695 CmdArgs.push_back("-fretain-comments-from-system-headers");
5696
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005697 // Forward -fcomment-block-commands to -cc1.
5698 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005699 // Forward -fparse-all-comments to -cc1.
5700 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005701
John Brawnad31ace2015-09-23 13:55:40 +00005702 // Turn -fplugin=name.so into -load name.so
5703 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5704 CmdArgs.push_back("-load");
5705 CmdArgs.push_back(A->getValue());
5706 A->claim();
5707 }
5708
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005709 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5710 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005711 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005712 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5713 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005714
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005715 // We translate this by hand to the -cc1 argument, since nightly test uses
5716 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005717 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005718 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005719 } else
Sean Silva14facf32015-06-09 01:57:17 +00005720 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005721 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005722
Bob Wilson23a55f12014-12-21 07:00:00 +00005723 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005724 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5725 // by the frontend.
5726 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5727 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005728
Daniel Dunbard67a3222009-03-30 06:36:42 +00005729 if (Output.getType() == types::TY_Dependencies) {
5730 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005731 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005732 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005733 CmdArgs.push_back(Output.getFilename());
5734 } else {
5735 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005736 }
5737
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005738 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005739
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005740 if (Input.isFilename())
5741 CmdArgs.push_back(Input.getFilename());
5742 else
5743 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005744
Chris Lattnere9d7d782009-11-03 19:50:27 +00005745 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5746
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005747 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005748
5749 // Optionally embed the -cc1 level arguments into the debug info, for build
5750 // analysis.
5751 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005752 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005753 for (const auto &Arg : Args)
5754 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005755
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005756 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005757 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005758 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005759 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005760 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005761 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005762 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005763 }
5764 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005765 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005766 }
5767
Eric Christopherd3804002013-02-22 20:12:52 +00005768 // Add the split debug info name to the command lines here so we
5769 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005770 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005771 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5772 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005773 const char *SplitDwarfOut;
5774 if (SplitDwarf) {
5775 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005776 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005777 CmdArgs.push_back(SplitDwarfOut);
5778 }
5779
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005780 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5781 // Include them with -fcuda-include-gpubinary.
5782 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005783 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005784 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005785 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005786 }
5787
Eric Christopherd3804002013-02-22 20:12:52 +00005788 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005789 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005790 Output.getType() == types::TY_Object &&
5791 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005792 auto CLCommand =
5793 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005794 C.addCommand(llvm::make_unique<FallbackCommand>(
5795 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005796 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5797 isa<PrecompileJobAction>(JA)) {
5798 // In /fallback builds, run the main compilation even if the pch generation
5799 // fails, so that the main compilation's fallback to cl.exe runs.
5800 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5801 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005802 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005803 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005804 }
5805
Eric Christopherf1545832013-02-22 23:50:16 +00005806 // Handle the debug info splitting at object creation time if we're
5807 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005808 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005809 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005810 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005811
Roman Divacky178e01602011-02-10 16:52:03 +00005812 if (Arg *A = Args.getLastArg(options::OPT_pg))
5813 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005814 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5815 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005816
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005817 // Claim some arguments which clang supports automatically.
5818
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005819 // -fpch-preprocess is used with gcc to add a special marker in the output to
5820 // include the PCH file. Clang's PTH solution is completely transparent, so we
5821 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005822 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005823
Daniel Dunbar17731772009-03-23 19:03:36 +00005824 // Claim some arguments which clang doesn't support, but we don't
5825 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005826 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5827 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005828
Rafael Espindolab0092d72013-09-04 19:37:35 +00005829 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005830 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005831}
5832
John McCall5fb5df92012-06-20 06:18:46 +00005833/// Add options related to the Objective-C runtime/ABI.
5834///
5835/// Returns true if the runtime is non-fragile.
5836ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5837 ArgStringList &cmdArgs,
5838 RewriteKind rewriteKind) const {
5839 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005840 Arg *runtimeArg =
5841 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5842 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005843
5844 // Just forward -fobjc-runtime= to the frontend. This supercedes
5845 // options about fragility.
5846 if (runtimeArg &&
5847 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5848 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005849 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005850 if (runtime.tryParse(value)) {
5851 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005852 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005853 }
5854
5855 runtimeArg->render(args, cmdArgs);
5856 return runtime;
5857 }
5858
5859 // Otherwise, we'll need the ABI "version". Version numbers are
5860 // slightly confusing for historical reasons:
5861 // 1 - Traditional "fragile" ABI
5862 // 2 - Non-fragile ABI, version 1
5863 // 3 - Non-fragile ABI, version 2
5864 unsigned objcABIVersion = 1;
5865 // If -fobjc-abi-version= is present, use that to set the version.
5866 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005867 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005868 if (value == "1")
5869 objcABIVersion = 1;
5870 else if (value == "2")
5871 objcABIVersion = 2;
5872 else if (value == "3")
5873 objcABIVersion = 3;
5874 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005875 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005876 } else {
5877 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 bool nonFragileABIIsDefault =
5879 (rewriteKind == RK_NonFragile ||
5880 (rewriteKind == RK_None &&
5881 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005882 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5883 options::OPT_fno_objc_nonfragile_abi,
5884 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005885// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005886#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5887 unsigned nonFragileABIVersion = 1;
5888#else
5889 unsigned nonFragileABIVersion = 2;
5890#endif
5891
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005892 if (Arg *abiArg =
5893 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005894 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005895 if (value == "1")
5896 nonFragileABIVersion = 1;
5897 else if (value == "2")
5898 nonFragileABIVersion = 2;
5899 else
5900 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005901 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005902 }
5903
5904 objcABIVersion = 1 + nonFragileABIVersion;
5905 } else {
5906 objcABIVersion = 1;
5907 }
5908 }
5909
5910 // We don't actually care about the ABI version other than whether
5911 // it's non-fragile.
5912 bool isNonFragile = objcABIVersion != 1;
5913
5914 // If we have no runtime argument, ask the toolchain for its default runtime.
5915 // However, the rewriter only really supports the Mac runtime, so assume that.
5916 ObjCRuntime runtime;
5917 if (!runtimeArg) {
5918 switch (rewriteKind) {
5919 case RK_None:
5920 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5921 break;
5922 case RK_Fragile:
5923 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5924 break;
5925 case RK_NonFragile:
5926 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5927 break;
5928 }
5929
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005930 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005931 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5932 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005933 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005934 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5935
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005936 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005937 } else {
5938 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5939 }
5940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005941 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005942 } else {
5943 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005944 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005945 // non-fragile mode or the GCC runtime in fragile mode.
5946 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005947 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005948 else
5949 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005950 }
5951
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005952 cmdArgs.push_back(
5953 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005954 return runtime;
5955}
5956
Reid Klecknerc542d372014-06-27 17:02:02 +00005957static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5958 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5959 I += HaveDash;
5960 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005961}
Reid Klecknerc542d372014-06-27 17:02:02 +00005962
Benjamin Kramere003ca22015-10-28 13:54:16 +00005963namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005964struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005965 bool Synch = false;
5966 bool Asynch = false;
5967 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005968};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005969} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005970
5971/// /EH controls whether to run destructor cleanups when exceptions are
5972/// thrown. There are three modifiers:
5973/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5974/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5975/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005976/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005977/// The default is /EHs-c-, meaning cleanups are disabled.
5978static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5979 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 std::vector<std::string> EHArgs =
5982 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005983 for (auto EHVal : EHArgs) {
5984 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5985 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005986 case 'a':
5987 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005988 if (EH.Asynch)
5989 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005990 continue;
5991 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005992 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005993 continue;
5994 case 's':
5995 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005996 if (EH.Synch)
5997 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005998 continue;
5999 default:
6000 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006001 }
6002 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6003 break;
6004 }
6005 }
David Majnemerb8809092016-02-20 09:23:44 +00006006 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006007 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006008 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006009 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6010 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006011 EH.Synch = true;
6012 EH.NoUnwindC = true;
6013 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006014
Reid Klecknerc542d372014-06-27 17:02:02 +00006015 return EH;
6016}
6017
David Majnemercd5855e2016-02-29 01:40:36 +00006018void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6019 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006020 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006021 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006022 unsigned RTOptionID = options::OPT__SLASH_MT;
6023
Hans Wennborgf1a74252013-09-10 20:18:04 +00006024 if (Args.hasArg(options::OPT__SLASH_LDd))
6025 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6026 // but defining _DEBUG is sticky.
6027 RTOptionID = options::OPT__SLASH_MTd;
6028
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006029 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006030 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006031
David Majnemere2afb472015-07-24 06:49:13 +00006032 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006033 switch (RTOptionID) {
6034 case options::OPT__SLASH_MD:
6035 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006036 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006037 CmdArgs.push_back("-D_MT");
6038 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006039 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006040 break;
6041 case options::OPT__SLASH_MDd:
6042 CmdArgs.push_back("-D_DEBUG");
6043 CmdArgs.push_back("-D_MT");
6044 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006045 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006046 break;
6047 case options::OPT__SLASH_MT:
6048 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006049 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006050 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006051 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006052 break;
6053 case options::OPT__SLASH_MTd:
6054 CmdArgs.push_back("-D_DEBUG");
6055 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006056 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006057 break;
6058 default:
6059 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006060 }
6061
David Majnemere2afb472015-07-24 06:49:13 +00006062 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6063 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6064 } else {
6065 CmdArgs.push_back(FlagForCRT.data());
6066
6067 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6068 // users want. The /Za flag to cl.exe turns this off, but it's not
6069 // implemented in clang.
6070 CmdArgs.push_back("--dependent-lib=oldnames");
6071 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006072
Hans Wennborg8858a032014-07-21 23:42:07 +00006073 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6074 // would produce interleaved output, so ignore /showIncludes in such cases.
6075 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6076 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6077 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006078
David Majnemerf6072342014-07-01 22:24:56 +00006079 // This controls whether or not we emit RTTI data for polymorphic types.
6080 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6081 /*default=*/false))
6082 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006083
Reid Kleckner124955a2015-08-05 18:51:13 +00006084 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006085 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006086 if (*EmitCodeView)
6087 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006088 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006089 CmdArgs.push_back("-gcodeview");
6090
Reid Klecknerc542d372014-06-27 17:02:02 +00006091 const Driver &D = getToolChain().getDriver();
6092 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006093 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006094 if (types::isCXX(InputType))
6095 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006096 CmdArgs.push_back("-fexceptions");
6097 }
David Majnemercd5855e2016-02-29 01:40:36 +00006098 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6099 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006100
Hans Wennborge50cec32014-06-13 20:59:54 +00006101 // /EP should expand to -E -P.
6102 if (Args.hasArg(options::OPT__SLASH_EP)) {
6103 CmdArgs.push_back("-E");
6104 CmdArgs.push_back("-P");
6105 }
6106
David Majnemera5b195a2015-02-14 01:35:12 +00006107 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006108 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6109 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006110 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6111 else
6112 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6113
6114 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6115 VolatileOptionID = A->getOption().getID();
6116
6117 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6118 CmdArgs.push_back("-fms-volatile");
6119
David Majnemer86c318f2014-02-11 21:05:00 +00006120 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6121 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6122 if (MostGeneralArg && BestCaseArg)
6123 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6124 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6125
6126 if (MostGeneralArg) {
6127 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6128 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6129 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6130
6131 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6132 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6133 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6134 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6135 << FirstConflict->getAsString(Args)
6136 << SecondConflict->getAsString(Args);
6137
6138 if (SingleArg)
6139 CmdArgs.push_back("-fms-memptr-rep=single");
6140 else if (MultipleArg)
6141 CmdArgs.push_back("-fms-memptr-rep=multiple");
6142 else
6143 CmdArgs.push_back("-fms-memptr-rep=virtual");
6144 }
6145
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006146 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6147 A->render(Args, CmdArgs);
6148
Hans Wennborg81f74482013-09-10 01:07:07 +00006149 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6150 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006151 if (Args.hasArg(options::OPT__SLASH_fallback))
6152 CmdArgs.push_back("msvc-fallback");
6153 else
6154 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006155 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006156}
6157
Douglas Katzman95354292015-06-23 20:42:09 +00006158visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006159 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006160 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006161 return CLFallback.get();
6162}
6163
Daniel Sanders7f933f42015-01-30 17:35:23 +00006164void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6165 ArgStringList &CmdArgs) const {
6166 StringRef CPUName;
6167 StringRef ABIName;
6168 const llvm::Triple &Triple = getToolChain().getTriple();
6169 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6170
6171 CmdArgs.push_back("-target-abi");
6172 CmdArgs.push_back(ABIName.data());
6173}
6174
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006175void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006176 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006177 const ArgList &Args,
6178 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006179 ArgStringList CmdArgs;
6180
6181 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6182 const InputInfo &Input = Inputs[0];
6183
James Y Knight2db38f32015-08-15 03:45:25 +00006184 std::string TripleStr =
6185 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6186 const llvm::Triple Triple(TripleStr);
6187
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006188 // Don't warn about "clang -w -c foo.s"
6189 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006190 // and "clang -emit-llvm -c foo.s"
6191 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006192
Rafael Espindola577637a2015-01-03 00:06:04 +00006193 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006194
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006195 // Invoke ourselves in -cc1as mode.
6196 //
6197 // FIXME: Implement custom jobs for internal actions.
6198 CmdArgs.push_back("-cc1as");
6199
6200 // Add the "effective" target triple.
6201 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006202 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6203
6204 // Set the output mode, we currently only expect to be used as a real
6205 // assembler.
6206 CmdArgs.push_back("-filetype");
6207 CmdArgs.push_back("obj");
6208
Eric Christopher45f2e712012-12-18 00:31:10 +00006209 // Set the main file name, so that debug info works even with
6210 // -save-temps or preprocessed assembly.
6211 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006212 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006213
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006214 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006215 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006216 if (!CPU.empty()) {
6217 CmdArgs.push_back("-target-cpu");
6218 CmdArgs.push_back(Args.MakeArgString(CPU));
6219 }
6220
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006221 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006222 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006223
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006224 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006225 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006226
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006227 // Pass along any -I options so we get proper .include search paths.
6228 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6229
Eric Christopherfc3ee562012-01-10 00:38:01 +00006230 // Determine the original source input.
6231 const Action *SourceAction = &JA;
6232 while (SourceAction->getKind() != Action::InputClass) {
6233 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6234 SourceAction = SourceAction->getInputs()[0];
6235 }
6236
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006237 // Forward -g and handle debug info related flags, assuming we are dealing
6238 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006239 bool WantDebug = false;
6240 unsigned DwarfVersion = 0;
6241 Args.ClaimAllArgs(options::OPT_g_Group);
6242 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6243 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6244 !A->getOption().matches(options::OPT_ggdb0);
6245 if (WantDebug)
6246 DwarfVersion = DwarfVersionNum(A->getSpelling());
6247 }
6248 if (DwarfVersion == 0)
6249 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6250
6251 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6252
Eric Christopherfc3ee562012-01-10 00:38:01 +00006253 if (SourceAction->getType() == types::TY_Asm ||
6254 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006255 // You might think that it would be ok to set DebugInfoKind outside of
6256 // the guard for source type, however there is a test which asserts
6257 // that some assembler invocation receives no -debug-info-kind,
6258 // and it's not clear whether that test is just overly restrictive.
6259 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6260 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006261 // Add the -fdebug-compilation-dir flag if needed.
6262 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006263
6264 // Set the AT_producer to the clang version when using the integrated
6265 // assembler on assembly source files.
6266 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006267 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6268 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006269
6270 // And pass along -I options
6271 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006272 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006273 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6274 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006275
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006276 // Handle -fPIC et al -- the relocation-model affects the assembler
6277 // for some targets.
6278 llvm::Reloc::Model RelocationModel;
6279 unsigned PICLevel;
6280 bool IsPIE;
6281 std::tie(RelocationModel, PICLevel, IsPIE) =
6282 ParsePICArgs(getToolChain(), Triple, Args);
6283
6284 const char *RMName = RelocationModelName(RelocationModel);
6285 if (RMName) {
6286 CmdArgs.push_back("-mrelocation-model");
6287 CmdArgs.push_back(RMName);
6288 }
6289
Kevin Enderby292dc082011-12-22 19:31:58 +00006290 // Optionally embed the -cc1as level arguments into the debug info, for build
6291 // analysis.
6292 if (getToolChain().UseDwarfDebugFlags()) {
6293 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006294 for (const auto &Arg : Args)
6295 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006296
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006297 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006298 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6299 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006300 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006301 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006302 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006303 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006304 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006305 }
6306 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006307 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006308 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006309
6310 // FIXME: Add -static support, once we have it.
6311
Daniel Sanders7f933f42015-01-30 17:35:23 +00006312 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006313 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006314 default:
6315 break;
6316
6317 case llvm::Triple::mips:
6318 case llvm::Triple::mipsel:
6319 case llvm::Triple::mips64:
6320 case llvm::Triple::mips64el:
6321 AddMIPSTargetArgs(Args, CmdArgs);
6322 break;
6323 }
6324
David Blaikie372d9502014-01-17 03:17:40 +00006325 // Consume all the warning flags. Usually this would be handled more
6326 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6327 // doesn't handle that so rather than warning about unused flags that are
6328 // actually used, we'll lie by omission instead.
6329 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006330 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006331
David Blaikie9260ed62013-07-25 21:19:01 +00006332 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6333 getToolChain().getDriver());
6334
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006335 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006336
6337 assert(Output.isFilename() && "Unexpected lipo output.");
6338 CmdArgs.push_back("-o");
6339 CmdArgs.push_back(Output.getFilename());
6340
Daniel Dunbarb440f562010-08-02 02:38:21 +00006341 assert(Input.isFilename() && "Invalid input.");
6342 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006343
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006344 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006345 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006346
6347 // Handle the debug info splitting at object creation time if we're
6348 // creating an object.
6349 // TODO: Currently only works on linux with newer objcopy.
6350 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006351 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006352 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006353 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006354}
6355
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006356void GnuTool::anchor() {}
6357
Daniel Dunbara3246a02009-03-18 08:07:30 +00006358void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006359 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006360 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006361 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006362 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006363 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006364
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006365 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006366 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006367 // It is unfortunate that we have to claim here, as this means
6368 // we will basically never report anything interesting for
6369 // platforms using a generic gcc, even if we are just using gcc
6370 // to get to the assembler.
6371 A->claim();
6372
Daniel Dunbar939c1212010-08-03 16:14:14 +00006373 // Don't forward any -g arguments to assembly steps.
6374 if (isa<AssembleJobAction>(JA) &&
6375 A->getOption().matches(options::OPT_g_Group))
6376 continue;
6377
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006378 // Don't forward any -W arguments to assembly and link steps.
6379 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6380 A->getOption().matches(options::OPT_W_Group))
6381 continue;
6382
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006383 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006384 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006385 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006386
Daniel Dunbar4e295052010-01-25 22:35:08 +00006387 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006388
6389 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006390 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006391 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006392 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006393 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006394 }
6395
Daniel Dunbar5716d872009-05-02 21:41:52 +00006396 // Try to force gcc to match the tool chain we want, if we recognize
6397 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006398 //
6399 // FIXME: The triple class should directly provide the information we want
6400 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006401 switch (getToolChain().getArch()) {
6402 default:
6403 break;
6404 case llvm::Triple::x86:
6405 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006406 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006407 break;
6408 case llvm::Triple::x86_64:
6409 case llvm::Triple::ppc64:
6410 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006411 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006412 break;
6413 case llvm::Triple::sparcel:
6414 CmdArgs.push_back("-EL");
6415 break;
6416 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006417
Daniel Dunbarb440f562010-08-02 02:38:21 +00006418 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006419 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006420 CmdArgs.push_back(Output.getFilename());
6421 } else {
6422 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006423 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006424 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006425
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006426 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006427
6428 // Only pass -x if gcc will understand it; otherwise hope gcc
6429 // understands the suffix correctly. The main use case this would go
6430 // wrong in is for linker inputs if they happened to have an odd
6431 // suffix; really the only way to get this to happen is a command
6432 // like '-x foobar a.c' which will treat a.c like a linker input.
6433 //
6434 // FIXME: For the linker case specifically, can we safely convert
6435 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006436 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006437 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006438 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006439 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006440 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006441 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006442 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006443 else if (II.getType() == types::TY_ModuleFile)
6444 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006445 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006446
Daniel Dunbara3246a02009-03-18 08:07:30 +00006447 if (types::canTypeBeUserSpecified(II.getType())) {
6448 CmdArgs.push_back("-x");
6449 CmdArgs.push_back(types::getTypeName(II.getType()));
6450 }
6451
Daniel Dunbarb440f562010-08-02 02:38:21 +00006452 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006453 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006454 else {
6455 const Arg &A = II.getInputArg();
6456
6457 // Reverse translate some rewritten options.
6458 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6459 CmdArgs.push_back("-lstdc++");
6460 continue;
6461 }
6462
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006463 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006464 A.render(Args, CmdArgs);
6465 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006466 }
6467
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006468 const std::string customGCCName = D.getCCCGenericGCCName();
6469 const char *GCCName;
6470 if (!customGCCName.empty())
6471 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006472 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006473 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006474 } else
6475 GCCName = "gcc";
6476
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006477 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006478 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006479}
6480
Douglas Katzman95354292015-06-23 20:42:09 +00006481void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6482 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006483 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006484}
6485
Douglas Katzman95354292015-06-23 20:42:09 +00006486void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6487 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006488 const Driver &D = getToolChain().getDriver();
6489
Eric Christophercc7ff502015-01-29 00:56:17 +00006490 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006491 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006492 case types::TY_LLVM_IR:
6493 case types::TY_LTO_IR:
6494 case types::TY_LLVM_BC:
6495 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006496 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006497 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006498 // We assume we've got an "integrated" assembler in that gcc will produce an
6499 // object file itself.
6500 case types::TY_Object:
6501 CmdArgs.push_back("-c");
6502 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006503 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006504 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006505 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006506 case types::TY_Nothing:
6507 CmdArgs.push_back("-fsyntax-only");
6508 break;
6509 default:
6510 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006511 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006512}
6513
Douglas Katzman95354292015-06-23 20:42:09 +00006514void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6515 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006516 // The types are (hopefully) good enough.
6517}
6518
Tony Linthicum76329bf2011-12-12 21:14:55 +00006519// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006520void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006521 ArgStringList &CmdArgs) const {
6522}
6523
Douglas Katzman95354292015-06-23 20:42:09 +00006524void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6525 const InputInfo &Output,
6526 const InputInfoList &Inputs,
6527 const ArgList &Args,
6528 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006529 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006530
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006531 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6532 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006533 ArgStringList CmdArgs;
6534
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006535 std::string MArchString = "-march=hexagon";
6536 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006537
6538 RenderExtraToolArgs(JA, CmdArgs);
6539
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006540 std::string AsName = "hexagon-llvm-mc";
6541 std::string MCpuString = "-mcpu=hexagon" +
6542 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6543 CmdArgs.push_back("-filetype=obj");
6544 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6545
Tony Linthicum76329bf2011-12-12 21:14:55 +00006546 if (Output.isFilename()) {
6547 CmdArgs.push_back("-o");
6548 CmdArgs.push_back(Output.getFilename());
6549 } else {
6550 assert(Output.isNothing() && "Unexpected output");
6551 CmdArgs.push_back("-fsyntax-only");
6552 }
6553
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006554 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6555 std::string N = llvm::utostr(G.getValue());
6556 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6557 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006558
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006559 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006560
Tony Linthicum76329bf2011-12-12 21:14:55 +00006561 // Only pass -x if gcc will understand it; otherwise hope gcc
6562 // understands the suffix correctly. The main use case this would go
6563 // wrong in is for linker inputs if they happened to have an odd
6564 // suffix; really the only way to get this to happen is a command
6565 // like '-x foobar a.c' which will treat a.c like a linker input.
6566 //
6567 // FIXME: For the linker case specifically, can we safely convert
6568 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006569 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006571 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006572 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006573 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006574 else if (II.getType() == types::TY_AST)
6575 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006576 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006577 else if (II.getType() == types::TY_ModuleFile)
6578 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006579 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006580
6581 if (II.isFilename())
6582 CmdArgs.push_back(II.getFilename());
6583 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006584 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006585 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006586 II.getInputArg().render(Args, CmdArgs);
6587 }
6588
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006590 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006591}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006592
Douglas Katzman95354292015-06-23 20:42:09 +00006593void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6594 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006595}
6596
Douglas Katzman54366072015-07-27 16:53:08 +00006597static void
6598constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006599 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006600 const InputInfo &Output, const InputInfoList &Inputs,
6601 const ArgList &Args, ArgStringList &CmdArgs,
6602 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006603
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006604 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006605
Matthew Curtise689b052012-12-06 15:46:07 +00006606 //----------------------------------------------------------------------------
6607 //
6608 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006609 bool IsStatic = Args.hasArg(options::OPT_static);
6610 bool IsShared = Args.hasArg(options::OPT_shared);
6611 bool IsPIE = Args.hasArg(options::OPT_pie);
6612 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6613 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6614 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6615 bool UseG0 = false;
6616 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006617
Matthew Curtise689b052012-12-06 15:46:07 +00006618 //----------------------------------------------------------------------------
6619 // Silence warnings for various options
6620 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006621 Args.ClaimAllArgs(options::OPT_g_Group);
6622 Args.ClaimAllArgs(options::OPT_emit_llvm);
6623 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6624 // handled somewhere else.
6625 Args.ClaimAllArgs(options::OPT_static_libgcc);
6626
6627 //----------------------------------------------------------------------------
6628 //
6629 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 if (Args.hasArg(options::OPT_s))
6631 CmdArgs.push_back("-s");
6632
6633 if (Args.hasArg(options::OPT_r))
6634 CmdArgs.push_back("-r");
6635
6636 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006637 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006638
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006639 CmdArgs.push_back("-march=hexagon");
6640 std::string CpuVer =
6641 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6642 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6643 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006644
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006646 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006647 // The following should be the default, but doing as hexagon-gcc does.
6648 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006649 }
6650
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006651 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006652 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006653
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006654 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006655 CmdArgs.push_back("-pie");
6656
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6658 std::string N = llvm::utostr(G.getValue());
6659 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6660 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006661 }
6662
Matthew Curtise689b052012-12-06 15:46:07 +00006663 //----------------------------------------------------------------------------
6664 //
6665 //----------------------------------------------------------------------------
6666 CmdArgs.push_back("-o");
6667 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006668
Matthew Curtise689b052012-12-06 15:46:07 +00006669 //----------------------------------------------------------------------------
6670 // moslib
6671 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006672 std::vector<std::string> OsLibs;
6673 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006674
Sean Silva14facf32015-06-09 01:57:17 +00006675 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6676 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006677 OsLibs.emplace_back(A->getValue());
6678 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006679 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006680 if (OsLibs.empty()) {
6681 OsLibs.push_back("standalone");
6682 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006683 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006684
Matthew Curtise689b052012-12-06 15:46:07 +00006685 //----------------------------------------------------------------------------
6686 // Start Files
6687 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006688 const std::string MCpuSuffix = "/" + CpuVer;
6689 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6690 const std::string RootDir =
6691 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6692 const std::string StartSubDir =
6693 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006694
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006695 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6696 const char *Name) -> std::string {
6697 std::string RelName = SubDir + Name;
6698 std::string P = HTC.GetFilePath(RelName.c_str());
6699 if (llvm::sys::fs::exists(P))
6700 return P;
6701 return RootDir + RelName;
6702 };
6703
6704 if (IncStdLib && IncStartFiles) {
6705 if (!IsShared) {
6706 if (HasStandalone) {
6707 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6708 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006709 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006710 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6711 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006712 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006713 std::string Init = UseShared
6714 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6715 : Find(RootDir, StartSubDir, "/init.o");
6716 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006717 }
6718
6719 //----------------------------------------------------------------------------
6720 // Library Search Paths
6721 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006722 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6723 for (const auto &LibPath : LibPaths)
6724 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006725
6726 //----------------------------------------------------------------------------
6727 //
6728 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006729 Args.AddAllArgs(CmdArgs,
6730 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6731 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006732
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006733 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006734
6735 //----------------------------------------------------------------------------
6736 // Libraries
6737 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006738 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006739 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006740 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006741 CmdArgs.push_back("-lm");
6742 }
6743
6744 CmdArgs.push_back("--start-group");
6745
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006746 if (!IsShared) {
6747 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006748 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006749 CmdArgs.push_back("-lc");
6750 }
6751 CmdArgs.push_back("-lgcc");
6752
6753 CmdArgs.push_back("--end-group");
6754 }
6755
6756 //----------------------------------------------------------------------------
6757 // End files
6758 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006759 if (IncStdLib && IncStartFiles) {
6760 std::string Fini = UseShared
6761 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6762 : Find(RootDir, StartSubDir, "/fini.o");
6763 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006764 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006765}
6766
Douglas Katzman95354292015-06-23 20:42:09 +00006767void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6768 const InputInfo &Output,
6769 const InputInfoList &Inputs,
6770 const ArgList &Args,
6771 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006772 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006773
6774 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006775 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006776 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006777
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006778 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006779 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006780 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006781}
6782// Hexagon tools end.
6783
Tom Stellard8fa33092015-07-18 01:49:05 +00006784void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6785 const InputInfo &Output,
6786 const InputInfoList &Inputs,
6787 const ArgList &Args,
6788 const char *LinkingOutput) const {
6789
6790 std::string Linker = getToolChain().GetProgramPath(getShortName());
6791 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006792 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006793 CmdArgs.push_back(Output.getFilename());
6794 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6795 CmdArgs, Inputs));
6796}
6797// AMDGPU tools end.
6798
Dan Gohman52816862015-12-16 23:30:41 +00006799wasm::Linker::Linker(const ToolChain &TC)
6800 : GnuTool("wasm::Linker", "lld", TC) {}
6801
6802bool wasm::Linker::isLinkJob() const {
6803 return true;
6804}
6805
6806bool wasm::Linker::hasIntegratedCPP() const {
6807 return false;
6808}
6809
6810void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6811 const InputInfo &Output,
6812 const InputInfoList &Inputs,
6813 const ArgList &Args,
6814 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006815
6816 const ToolChain &ToolChain = getToolChain();
6817 const Driver &D = ToolChain.getDriver();
6818 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006819 ArgStringList CmdArgs;
6820 CmdArgs.push_back("-flavor");
6821 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006822
6823 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006824 // size is of particular importance. This is significantly facilitated by
6825 // the enabling of -ffunction-sections and -fdata-sections in
6826 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006827 if (areOptimizationsEnabled(Args))
6828 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006829
Dan Gohman57b62c52016-02-22 19:26:15 +00006830 if (Args.hasArg(options::OPT_rdynamic))
6831 CmdArgs.push_back("-export-dynamic");
6832 if (Args.hasArg(options::OPT_s))
6833 CmdArgs.push_back("--strip-all");
6834 if (Args.hasArg(options::OPT_shared))
6835 CmdArgs.push_back("-shared");
6836 if (Args.hasArg(options::OPT_static))
6837 CmdArgs.push_back("-Bstatic");
6838
6839 Args.AddAllArgs(CmdArgs, options::OPT_L);
6840 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6841
6842 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6843 if (Args.hasArg(options::OPT_shared))
6844 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6845 else if (Args.hasArg(options::OPT_pie))
6846 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6847 else
6848 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6849
6850 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6851 }
6852
6853 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6854
6855 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6856 if (D.CCCIsCXX())
6857 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6858
6859 if (Args.hasArg(options::OPT_pthread))
6860 CmdArgs.push_back("-lpthread");
6861
6862 CmdArgs.push_back("-lc");
6863 CmdArgs.push_back("-lcompiler_rt");
6864 }
6865
6866 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6867 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6868
Dan Gohman52816862015-12-16 23:30:41 +00006869 CmdArgs.push_back("-o");
6870 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006871
Dan Gohman52816862015-12-16 23:30:41 +00006872 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6873}
6874
Renato Golin7c542b42015-07-27 23:44:45 +00006875const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006876 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006877 if (!Arch.empty())
6878 MArch = Arch;
6879 else
Bernard Ogden31561762013-12-12 13:27:11 +00006880 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006881 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006882
6883 // Handle -march=native.
6884 if (MArch == "native") {
6885 std::string CPU = llvm::sys::getHostCPUName();
6886 if (CPU != "generic") {
6887 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006888 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006889 // If there is no valid architecture suffix for this CPU we don't know how
6890 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006891 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006892 MArch = "";
6893 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006894 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006895 }
6896 }
6897
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006898 return MArch;
6899}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006900
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006901/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006902StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006903 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006904 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6905 // here means an -march=native that we can't handle, so instead return no CPU.
6906 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006907 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006908
John Brawna95c1a82015-05-08 12:52:18 +00006909 // We need to return an empty string here on invalid MArch values as the
6910 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006911 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006912}
6913
6914/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006915std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006916 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006917 // FIXME: Warn on inconsistent use of -mcpu and -march.
6918 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006919 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006920 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006921 // Handle -mcpu=native.
6922 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006923 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006924 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006925 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006926 }
6927
Renato Goline17c5802015-07-27 23:44:42 +00006928 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006929}
6930
6931/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006932/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006933// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006934StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6935 const llvm::Triple &Triple) {
6936 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006937 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006938 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006939 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006940 if (ArchKind == llvm::ARM::AK_INVALID)
6941 // In case of generic Arch, i.e. "arm",
6942 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006943 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006944 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006945 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6946 // armv7k triple if it's actually been specified via "-arch armv7k".
6947 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006948 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006949 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006950 }
Renato Golin3c007252015-05-28 15:05:53 +00006951 if (ArchKind == llvm::ARM::AK_INVALID)
6952 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006953 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006954}
6955
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006956void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006957 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006958 if (Args.hasArg(options::OPT_r))
6959 return;
6960
John Brawn94fd9632015-05-21 12:19:49 +00006961 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6962 // to generate BE-8 executables.
6963 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6964 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006965}
6966
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006967mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006968 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6969 // was first introduced in Release 3. However, other compilers have
6970 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006971 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6972 .Case("mips1", NanLegacy)
6973 .Case("mips2", NanLegacy)
6974 .Case("mips3", NanLegacy)
6975 .Case("mips4", NanLegacy)
6976 .Case("mips5", NanLegacy)
6977 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006978 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006979 .Case("mips32r3", NanLegacy | Nan2008)
6980 .Case("mips32r5", NanLegacy | Nan2008)
6981 .Case("mips32r6", Nan2008)
6982 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006983 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006984 .Case("mips64r3", NanLegacy | Nan2008)
6985 .Case("mips64r5", NanLegacy | Nan2008)
6986 .Case("mips64r6", Nan2008)
6987 .Default(NanLegacy);
6988}
6989
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006990bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6991 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6992 return A && (A->getValue() == StringRef(Value));
6993}
6994
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006995bool mips::isUCLibc(const ArgList &Args) {
6996 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006997 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006998}
6999
Daniel Sanders2bf13662014-07-10 14:40:57 +00007000bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007001 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7002 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007003 .Case("2008", true)
7004 .Case("legacy", false)
7005 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007006
7007 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007008 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007009 .Cases("mips32r6", "mips64r6", true)
7010 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007011
7012 return false;
7013}
7014
Daniel Sanders379d44b2014-07-16 11:52:23 +00007015bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007016 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007017 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00007018 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00007019 return false;
7020
7021 if (ABIName != "32")
7022 return false;
7023
Toma Tabacu94ea6862015-06-16 13:54:13 +00007024 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7025 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007026 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007027 return false;
7028
Daniel Sanders379d44b2014-07-16 11:52:23 +00007029 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007030 .Cases("mips2", "mips3", "mips4", "mips5", true)
7031 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7032 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7033 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007034}
7035
Toma Tabacu94ea6862015-06-16 13:54:13 +00007036bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7037 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007038 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007039 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7040
7041 // FPXX shouldn't be used if -msingle-float is present.
7042 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7043 options::OPT_mdouble_float))
7044 if (A->getOption().matches(options::OPT_msingle_float))
7045 UseFPXX = false;
7046
7047 return UseFPXX;
7048}
7049
Tim Northover157d9112014-01-16 08:48:16 +00007050llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007051 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7052 // archs which Darwin doesn't use.
7053
7054 // The matching this routine does is fairly pointless, since it is neither the
7055 // complete architecture list, nor a reasonable subset. The problem is that
7056 // historically the driver driver accepts this and also ties its -march=
7057 // handling to the architecture name, so we need to be careful before removing
7058 // support for it.
7059
7060 // This code must be kept in sync with Clang's Darwin specific argument
7061 // translation.
7062
7063 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007064 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7065 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7066 .Case("ppc64", llvm::Triple::ppc64)
7067 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7068 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7069 llvm::Triple::x86)
7070 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7071 // This is derived from the driver driver.
7072 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7073 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7074 .Cases("armv7s", "xscale", llvm::Triple::arm)
7075 .Case("arm64", llvm::Triple::aarch64)
7076 .Case("r600", llvm::Triple::r600)
7077 .Case("amdgcn", llvm::Triple::amdgcn)
7078 .Case("nvptx", llvm::Triple::nvptx)
7079 .Case("nvptx64", llvm::Triple::nvptx64)
7080 .Case("amdil", llvm::Triple::amdil)
7081 .Case("spir", llvm::Triple::spir)
7082 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007083}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007084
Tim Northover157d9112014-01-16 08:48:16 +00007085void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007086 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007087 T.setArch(Arch);
7088
7089 if (Str == "x86_64h")
7090 T.setArchName(Str);
7091 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7092 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007093 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007094 }
7095}
7096
Bob Wilsondecc03e2012-11-23 06:14:39 +00007097const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007098 const InputInfo &Input) {
7099 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007100}
7101
Bob Wilsondecc03e2012-11-23 06:14:39 +00007102const char *Clang::getBaseInputStem(const ArgList &Args,
7103 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007104 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007105
Chris Lattner906bb902011-01-16 08:14:11 +00007106 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007107 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007108
7109 return Str;
7110}
7111
Bob Wilsondecc03e2012-11-23 06:14:39 +00007112const char *Clang::getDependencyFileName(const ArgList &Args,
7113 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007114 // FIXME: Think about this more.
7115 std::string Res;
7116
7117 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007118 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007119 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007120 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007121 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007122 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007123 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007124}
7125
Douglas Katzman95354292015-06-23 20:42:09 +00007126void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7127 const InputInfo &Output,
7128 const InputInfoList &Inputs,
7129 const ArgList &Args,
7130 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007131 const ToolChain &ToolChain = getToolChain();
7132 const Driver &D = ToolChain.getDriver();
7133 ArgStringList CmdArgs;
7134
7135 // Silence warning for "clang -g foo.o -o foo"
7136 Args.ClaimAllArgs(options::OPT_g_Group);
7137 // and "clang -emit-llvm foo.o -o foo"
7138 Args.ClaimAllArgs(options::OPT_emit_llvm);
7139 // and for "clang -w foo.o -o foo". Other warning options are already
7140 // handled somewhere else.
7141 Args.ClaimAllArgs(options::OPT_w);
7142
7143 if (!D.SysRoot.empty())
7144 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7145
7146 // CloudABI only supports static linkage.
7147 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007148
7149 // CloudABI uses Position Independent Executables exclusively.
7150 CmdArgs.push_back("-pie");
7151 CmdArgs.push_back("--no-dynamic-linker");
7152 CmdArgs.push_back("-zrelro");
7153
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007154 CmdArgs.push_back("--eh-frame-hdr");
7155 CmdArgs.push_back("--gc-sections");
7156
7157 if (Output.isFilename()) {
7158 CmdArgs.push_back("-o");
7159 CmdArgs.push_back(Output.getFilename());
7160 } else {
7161 assert(Output.isNothing() && "Invalid output.");
7162 }
7163
Douglas Katzman78b37b02015-11-17 20:28:07 +00007164 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007165 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7166 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7167 }
7168
7169 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007170 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007171 Args.AddAllArgs(CmdArgs,
7172 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7173 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007174
Teresa Johnson945bc502015-10-15 20:35:53 +00007175 if (D.isUsingLTO())
7176 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007177
7178 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7179
Douglas Katzman78b37b02015-11-17 20:28:07 +00007180 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007181 if (D.CCCIsCXX())
7182 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7183 CmdArgs.push_back("-lc");
7184 CmdArgs.push_back("-lcompiler_rt");
7185 }
7186
Douglas Katzman78b37b02015-11-17 20:28:07 +00007187 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007188 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7189
7190 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007191 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007192}
7193
Douglas Katzman95354292015-06-23 20:42:09 +00007194void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7195 const InputInfo &Output,
7196 const InputInfoList &Inputs,
7197 const ArgList &Args,
7198 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007199 ArgStringList CmdArgs;
7200
7201 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7202 const InputInfo &Input = Inputs[0];
7203
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007204 // Determine the original source input.
7205 const Action *SourceAction = &JA;
7206 while (SourceAction->getKind() != Action::InputClass) {
7207 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7208 SourceAction = SourceAction->getInputs()[0];
7209 }
7210
Eric Christopherf5a8f492015-12-08 00:10:10 +00007211 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007212 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007213 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7214 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007215 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007216 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007217 const llvm::Triple &T(getToolChain().getTriple());
7218 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007219 CmdArgs.push_back("-Q");
7220 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007221
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007222 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007223 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007224 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007225 if (Args.hasArg(options::OPT_gstabs))
7226 CmdArgs.push_back("--gstabs");
7227 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007228 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007229 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007230
Daniel Dunbarbe220842009-03-20 16:06:39 +00007231 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007232 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007233
Daniel Dunbar6d484762010-07-22 01:47:22 +00007234 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007235 if (getToolChain().getArch() == llvm::Triple::x86 ||
7236 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007237 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7238 CmdArgs.push_back("-force_cpusubtype_ALL");
7239
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007240 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007241 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007242 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007243 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007244 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007245 CmdArgs.push_back("-static");
7246
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007247 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007248
7249 assert(Output.isFilename() && "Unexpected lipo output.");
7250 CmdArgs.push_back("-o");
7251 CmdArgs.push_back(Output.getFilename());
7252
Daniel Dunbarb440f562010-08-02 02:38:21 +00007253 assert(Input.isFilename() && "Invalid input.");
7254 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007255
7256 // asm_final spec is empty.
7257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007258 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007259 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007260}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007261
Tim Northover157d9112014-01-16 08:48:16 +00007262void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007263
Tim Northover157d9112014-01-16 08:48:16 +00007264void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7265 ArgStringList &CmdArgs) const {
7266 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007267
Daniel Dunbarc1964212009-03-26 16:23:12 +00007268 // Derived from darwin_arch spec.
7269 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007270 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007271
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007272 // FIXME: Is this needed anymore?
7273 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007274 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007275}
7276
Douglas Katzman95354292015-06-23 20:42:09 +00007277bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007278 // We only need to generate a temp path for LTO if we aren't compiling object
7279 // files. When compiling source files, we run 'dsymutil' after linking. We
7280 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007281 for (const auto &Input : Inputs)
7282 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007283 return true;
7284
7285 return false;
7286}
7287
Douglas Katzman95354292015-06-23 20:42:09 +00007288void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7289 ArgStringList &CmdArgs,
7290 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007291 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007292 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007293
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007294 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007295 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007296 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007297 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007298 }
7299
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007300 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007301 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007302 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7303 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007304
Bob Wilson3d27dad2013-08-02 22:25:34 +00007305 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7306 CmdArgs.push_back("-export_dynamic");
7307
Bob Wilsonb111ec92015-03-02 19:01:14 +00007308 // If we are using App Extension restrictions, pass a flag to the linker
7309 // telling it that the compiled code has been audited.
7310 if (Args.hasFlag(options::OPT_fapplication_extension,
7311 options::OPT_fno_application_extension, false))
7312 CmdArgs.push_back("-application_extension");
7313
Teresa Johnson945bc502015-10-15 20:35:53 +00007314 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007315 // If we are using LTO, then automatically create a temporary file path for
7316 // the linker to use, so that it's lifetime will extend past a possible
7317 // dsymutil step.
7318 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7319 const char *TmpPath = C.getArgs().MakeArgString(
7320 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7321 C.addTempFile(TmpPath);
7322 CmdArgs.push_back("-object_path_lto");
7323 CmdArgs.push_back(TmpPath);
7324 }
7325
7326 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7327 // it in clang installed libraries. If not found, the option is not used
7328 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7329 if (Version[0] >= 133) {
7330 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7331 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7332 SmallString<128> LibLTOPath(P);
7333 llvm::sys::path::append(LibLTOPath, "lib");
7334 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7335 if (llvm::sys::fs::exists(LibLTOPath)) {
7336 CmdArgs.push_back("-lto_library");
7337 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7338 } else {
7339 D.Diag(diag::warn_drv_lto_libpath);
7340 }
7341 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007342 }
7343
Daniel Dunbarc1964212009-03-26 16:23:12 +00007344 // Derived from the "link" spec.
7345 Args.AddAllArgs(CmdArgs, options::OPT_static);
7346 if (!Args.hasArg(options::OPT_static))
7347 CmdArgs.push_back("-dynamic");
7348 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7349 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7350 // here. How do we wish to handle such things?
7351 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007352
Daniel Dunbarc1964212009-03-26 16:23:12 +00007353 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007354 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007355 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007356 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007357
7358 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7359 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7360 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7361
7362 Arg *A;
7363 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7364 (A = Args.getLastArg(options::OPT_current__version)) ||
7365 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007366 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7367 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007368
7369 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7370 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7371 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7372 } else {
7373 CmdArgs.push_back("-dylib");
7374
7375 Arg *A;
7376 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7377 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7378 (A = Args.getLastArg(options::OPT_client__name)) ||
7379 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7380 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7381 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007382 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7383 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007384
Daniel Dunbarc1964212009-03-26 16:23:12 +00007385 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7386 "-dylib_compatibility_version");
7387 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7388 "-dylib_current_version");
7389
Tim Northover157d9112014-01-16 08:48:16 +00007390 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007391
7392 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7393 "-dylib_install_name");
7394 }
7395
7396 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7397 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7398 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007399 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007400 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007401 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7402 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7403 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7404 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7405 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7406 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007407 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007408 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7409 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7410 Args.AddAllArgs(CmdArgs, options::OPT_init);
7411
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007412 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007413 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007414
Daniel Dunbarc1964212009-03-26 16:23:12 +00007415 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7416 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7417 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7418 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7419 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007420
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007421 if (const Arg *A =
7422 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7423 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007424 if (A->getOption().matches(options::OPT_fpie) ||
7425 A->getOption().matches(options::OPT_fPIE))
7426 CmdArgs.push_back("-pie");
7427 else
7428 CmdArgs.push_back("-no_pie");
7429 }
Steven Wu574b0f22016-03-01 01:07:58 +00007430 // for embed-bitcode, use -bitcode_bundle in linker command
7431 if (C.getDriver().embedBitcodeEnabled() ||
7432 C.getDriver().embedBitcodeMarkerOnly()) {
7433 // Check if the toolchain supports bitcode build flow.
7434 if (MachOTC.SupportsEmbeddedBitcode())
7435 CmdArgs.push_back("-bitcode_bundle");
7436 else
7437 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7438 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007439
7440 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7441 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7442 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7443 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7444 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7445 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7446 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7447 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7448 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7449 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7450 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7451 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7452 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7453 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7454 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7455 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007456
Daniel Dunbar84384642011-05-02 21:03:47 +00007457 // Give --sysroot= preference, over the Apple specific behavior to also use
7458 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007459 StringRef sysroot = C.getSysRoot();
7460 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007461 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007462 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007463 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7464 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007465 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007466 }
7467
Daniel Dunbarc1964212009-03-26 16:23:12 +00007468 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7469 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7470 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7471 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7472 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007473 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007474 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7475 Args.AddAllArgs(CmdArgs, options::OPT_y);
7476 Args.AddLastArg(CmdArgs, options::OPT_w);
7477 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7478 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7479 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7480 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7481 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7482 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7483 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7484 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7485 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7486 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7487 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7488 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7489}
7490
Douglas Katzman95354292015-06-23 20:42:09 +00007491void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7492 const InputInfo &Output,
7493 const InputInfoList &Inputs,
7494 const ArgList &Args,
7495 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007496 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007497
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007498 // If the number of arguments surpasses the system limits, we will encode the
7499 // input files in a separate file, shortening the command line. To this end,
7500 // build a list of input file names that can be passed via a file with the
7501 // -filelist linker option.
7502 llvm::opt::ArgStringList InputFileList;
7503
Daniel Dunbarc1964212009-03-26 16:23:12 +00007504 // The logic here is derived from gcc's behavior; most of which
7505 // comes from specs (starting with link_command). Consult gcc for
7506 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007507 ArgStringList CmdArgs;
7508
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007509 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7510 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7511 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007512 for (const auto &Arg : Args)
7513 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007514 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007515 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007516 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007517 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007518 return;
7519 }
7520
Daniel Dunbarc1964212009-03-26 16:23:12 +00007521 // I'm not sure why this particular decomposition exists in gcc, but
7522 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007523 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007524
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007525 // It seems that the 'e' option is completely ignored for dynamic executables
7526 // (the default), and with static executables, the last one wins, as expected.
7527 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7528 options::OPT_Z_Flag, options::OPT_u_Group,
7529 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007530
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007531 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7532 // members of static archive libraries which implement Objective-C classes or
7533 // categories.
7534 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7535 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007536
Daniel Dunbarc1964212009-03-26 16:23:12 +00007537 CmdArgs.push_back("-o");
7538 CmdArgs.push_back(Output.getFilename());
7539
Douglas Katzman78b37b02015-11-17 20:28:07 +00007540 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007541 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007542
Peter Collingbournec4122c12015-06-15 21:08:13 +00007543 // SafeStack requires its own runtime libraries
7544 // These libraries should be linked first, to make sure the
7545 // __safestack_init constructor executes before everything else
7546 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7547 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7548 "libclang_rt.safestack_osx.a",
7549 /*AlwaysLink=*/true);
7550 }
7551
Daniel Dunbarc1964212009-03-26 16:23:12 +00007552 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007553
Douglas Gregor9295df02012-05-15 21:00:27 +00007554 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007555 // Build the input file for -filelist (list of linker input files) in case we
7556 // need it later
7557 for (const auto &II : Inputs) {
7558 if (!II.isFilename()) {
7559 // This is a linker input argument.
7560 // We cannot mix input arguments and file names in a -filelist input, thus
7561 // we prematurely stop our list (remaining files shall be passed as
7562 // arguments).
7563 if (InputFileList.size() > 0)
7564 break;
7565
7566 continue;
7567 }
7568
7569 InputFileList.push_back(II.getFilename());
7570 }
7571
Douglas Katzman78b37b02015-11-17 20:28:07 +00007572 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007573 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7574
Douglas Katzman78b37b02015-11-17 20:28:07 +00007575 if (isObjCRuntimeLinked(Args) &&
7576 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007577 // We use arclite library for both ARC and subscripting support.
7578 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7579
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007580 CmdArgs.push_back("-framework");
7581 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007582 // Link libobj.
7583 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007584 }
John McCall31168b02011-06-15 23:02:42 +00007585
Daniel Dunbarc1964212009-03-26 16:23:12 +00007586 if (LinkingOutput) {
7587 CmdArgs.push_back("-arch_multiple");
7588 CmdArgs.push_back("-final_output");
7589 CmdArgs.push_back(LinkingOutput);
7590 }
7591
Daniel Dunbarc1964212009-03-26 16:23:12 +00007592 if (Args.hasArg(options::OPT_fnested_functions))
7593 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007594
Justin Bognerc7701242015-05-12 05:44:36 +00007595 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7596
Douglas Katzman78b37b02015-11-17 20:28:07 +00007597 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007598 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007599 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007600
Daniel Dunbarc1964212009-03-26 16:23:12 +00007601 // link_ssp spec is empty.
7602
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007603 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007604 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007605 }
7606
Douglas Katzman78b37b02015-11-17 20:28:07 +00007607 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007608 // endfile_spec is empty.
7609 }
7610
7611 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7612 Args.AddAllArgs(CmdArgs, options::OPT_F);
7613
Steven Wu3ffb61b2015-02-06 18:08:29 +00007614 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007615 for (const Arg *A : Args.filtered(options::OPT_iframework))
7616 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007617
Douglas Katzman78b37b02015-11-17 20:28:07 +00007618 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007619 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7620 if (A->getValue() == StringRef("Accelerate")) {
7621 CmdArgs.push_back("-framework");
7622 CmdArgs.push_back("Accelerate");
7623 }
7624 }
7625 }
7626
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007627 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007628 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007629 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007630 Cmd->setInputFileList(std::move(InputFileList));
7631 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007632}
7633
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007634void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007635 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007636 const InputInfoList &Inputs,
7637 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007638 const char *LinkingOutput) const {
7639 ArgStringList CmdArgs;
7640
7641 CmdArgs.push_back("-create");
7642 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007643
7644 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007645 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007646
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007647 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007648 assert(II.isFilename() && "Unexpected lipo input.");
7649 CmdArgs.push_back(II.getFilename());
7650 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007651
7652 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007653 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007654}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007655
Daniel Dunbar88299622010-06-04 18:28:36 +00007656void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007657 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007658 const InputInfoList &Inputs,
7659 const ArgList &Args,
7660 const char *LinkingOutput) const {
7661 ArgStringList CmdArgs;
7662
Daniel Dunbareb86b042011-05-09 17:23:16 +00007663 CmdArgs.push_back("-o");
7664 CmdArgs.push_back(Output.getFilename());
7665
Daniel Dunbar88299622010-06-04 18:28:36 +00007666 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7667 const InputInfo &Input = Inputs[0];
7668 assert(Input.isFilename() && "Unexpected dsymutil input.");
7669 CmdArgs.push_back(Input.getFilename());
7670
Daniel Dunbar88299622010-06-04 18:28:36 +00007671 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007672 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007673 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007674}
7675
Eric Christopher551ef452011-08-23 17:56:55 +00007676void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007677 const InputInfo &Output,
7678 const InputInfoList &Inputs,
7679 const ArgList &Args,
7680 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007681 ArgStringList CmdArgs;
7682 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007683 CmdArgs.push_back("--debug-info");
7684 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007685 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007686
7687 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7688 const InputInfo &Input = Inputs[0];
7689 assert(Input.isFilename() && "Unexpected verify input");
7690
7691 // Grabbing the output of the earlier dsymutil run.
7692 CmdArgs.push_back(Input.getFilename());
7693
7694 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007695 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007696 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007697}
7698
Douglas Katzman95354292015-06-23 20:42:09 +00007699void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007700 const InputInfo &Output,
7701 const InputInfoList &Inputs,
7702 const ArgList &Args,
7703 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007704 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007705 ArgStringList CmdArgs;
7706
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007707 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007708
7709 CmdArgs.push_back("-o");
7710 CmdArgs.push_back(Output.getFilename());
7711
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007712 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007713 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007714
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007715 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007717}
7718
Douglas Katzman95354292015-06-23 20:42:09 +00007719void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7720 const InputInfo &Output,
7721 const InputInfoList &Inputs,
7722 const ArgList &Args,
7723 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007724 ArgStringList CmdArgs;
7725
David Chisnall272a0712012-02-29 15:06:12 +00007726 // Demangle C++ names in errors
7727 CmdArgs.push_back("-C");
7728
Douglas Katzman78b37b02015-11-17 20:28:07 +00007729 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007730 CmdArgs.push_back("-e");
7731 CmdArgs.push_back("_start");
7732 }
7733
7734 if (Args.hasArg(options::OPT_static)) {
7735 CmdArgs.push_back("-Bstatic");
7736 CmdArgs.push_back("-dn");
7737 } else {
7738 CmdArgs.push_back("-Bdynamic");
7739 if (Args.hasArg(options::OPT_shared)) {
7740 CmdArgs.push_back("-shared");
7741 } else {
7742 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007743 CmdArgs.push_back(
7744 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007745 }
7746 }
7747
7748 if (Output.isFilename()) {
7749 CmdArgs.push_back("-o");
7750 CmdArgs.push_back(Output.getFilename());
7751 } else {
7752 assert(Output.isNothing() && "Invalid output.");
7753 }
7754
Douglas Katzman78b37b02015-11-17 20:28:07 +00007755 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007756 if (!Args.hasArg(options::OPT_shared))
7757 CmdArgs.push_back(
7758 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7759
7760 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7761 CmdArgs.push_back(
7762 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7763 CmdArgs.push_back(
7764 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007765 }
7766
Douglas Katzman6059ef92015-11-17 17:41:23 +00007767 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007768
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007769 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7770 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007771
7772 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7773
Douglas Katzman78b37b02015-11-17 20:28:07 +00007774 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007775 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007776 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007777 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007778 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007779 if (!Args.hasArg(options::OPT_shared)) {
7780 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007781 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007782 }
David Chisnallf571cde2012-02-15 13:39:01 +00007783 }
7784
Douglas Katzman78b37b02015-11-17 20:28:07 +00007785 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007786 CmdArgs.push_back(
7787 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007788 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007789 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007790
Xinliang David Li69306c02015-10-22 06:15:31 +00007791 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007793 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007794 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007795}
7796
Douglas Katzman95354292015-06-23 20:42:09 +00007797void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7798 const InputInfo &Output,
7799 const InputInfoList &Inputs,
7800 const ArgList &Args,
7801 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007802 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007803 ArgStringList CmdArgs;
7804
Rafael Espindolacc126272014-02-28 01:55:21 +00007805 switch (getToolChain().getArch()) {
7806 case llvm::Triple::x86:
7807 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7808 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007809 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007810 break;
7811
7812 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007813 CmdArgs.push_back("-mppc");
7814 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007815 break;
7816
7817 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007818 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007819 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007820 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7821 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7822 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007823 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007824 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007825
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007826 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007827 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007828 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7829 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7830 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007831 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007832 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007833
7834 case llvm::Triple::mips64:
7835 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007836 StringRef CPUName;
7837 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007838 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007839
7840 CmdArgs.push_back("-mabi");
7841 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7842
7843 if (getToolChain().getArch() == llvm::Triple::mips64)
7844 CmdArgs.push_back("-EB");
7845 else
7846 CmdArgs.push_back("-EL");
7847
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007848 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007849 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007850 }
7851
Rafael Espindolacc126272014-02-28 01:55:21 +00007852 default:
7853 break;
7854 }
7855
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007856 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007857
7858 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007859 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007860
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007861 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007862 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007863
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007864 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007865 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007866}
7867
Douglas Katzman95354292015-06-23 20:42:09 +00007868void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7869 const InputInfo &Output,
7870 const InputInfoList &Inputs,
7871 const ArgList &Args,
7872 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007873 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007874 ArgStringList CmdArgs;
7875
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007876 // Silence warning for "clang -g foo.o -o foo"
7877 Args.ClaimAllArgs(options::OPT_g_Group);
7878 // and "clang -emit-llvm foo.o -o foo"
7879 Args.ClaimAllArgs(options::OPT_emit_llvm);
7880 // and for "clang -w foo.o -o foo". Other warning options are already
7881 // handled somewhere else.
7882 Args.ClaimAllArgs(options::OPT_w);
7883
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007884 if (getToolChain().getArch() == llvm::Triple::mips64)
7885 CmdArgs.push_back("-EB");
7886 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7887 CmdArgs.push_back("-EL");
7888
Douglas Katzman78b37b02015-11-17 20:28:07 +00007889 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007890 CmdArgs.push_back("-e");
7891 CmdArgs.push_back("__start");
7892 }
7893
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007894 if (Args.hasArg(options::OPT_static)) {
7895 CmdArgs.push_back("-Bstatic");
7896 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007897 if (Args.hasArg(options::OPT_rdynamic))
7898 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007899 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007900 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007901 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007902 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007903 } else {
7904 CmdArgs.push_back("-dynamic-linker");
7905 CmdArgs.push_back("/usr/libexec/ld.so");
7906 }
7907 }
7908
Rafael Espindola044f7832013-06-05 04:28:55 +00007909 if (Args.hasArg(options::OPT_nopie))
7910 CmdArgs.push_back("-nopie");
7911
Daniel Dunbarb440f562010-08-02 02:38:21 +00007912 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007913 CmdArgs.push_back("-o");
7914 CmdArgs.push_back(Output.getFilename());
7915 } else {
7916 assert(Output.isNothing() && "Invalid output.");
7917 }
7918
Douglas Katzman78b37b02015-11-17 20:28:07 +00007919 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007920 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007921 if (Args.hasArg(options::OPT_pg))
7922 CmdArgs.push_back(
7923 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007924 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007925 CmdArgs.push_back(
7926 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7927 CmdArgs.push_back(
7928 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007929 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007930 CmdArgs.push_back(
7931 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007932 }
7933 }
7934
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007935 std::string Triple = getToolChain().getTripleString();
7936 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007937 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007938 CmdArgs.push_back(
7939 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007940
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007941 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7942 options::OPT_e, options::OPT_s, options::OPT_t,
7943 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007944
Daniel Dunbar54423b22010-09-17 00:24:54 +00007945 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007946
Douglas Katzman78b37b02015-11-17 20:28:07 +00007947 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007948 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007949 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007950 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007951 CmdArgs.push_back("-lm_p");
7952 else
7953 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007954 }
7955
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007956 // FIXME: For some reason GCC passes -lgcc before adding
7957 // the default system libraries. Just mimic this for now.
7958 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007959
Eric Christopher17674ec2012-09-13 06:32:34 +00007960 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007961 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7962 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007963 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007964 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007965 }
7966
Chandler Carruth45661652011-12-17 22:32:42 +00007967 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007968 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007969 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007970 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007971 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007972 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007973
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007974 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007975 }
7976
Douglas Katzman78b37b02015-11-17 20:28:07 +00007977 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007978 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007979 CmdArgs.push_back(
7980 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007981 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007982 CmdArgs.push_back(
7983 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007984 }
7985
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007986 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007987 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007988}
Ed Schoutene33194b2009-04-02 19:13:12 +00007989
Douglas Katzman95354292015-06-23 20:42:09 +00007990void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7991 const InputInfo &Output,
7992 const InputInfoList &Inputs,
7993 const ArgList &Args,
7994 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007995 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007996 ArgStringList CmdArgs;
7997
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007998 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007999
8000 CmdArgs.push_back("-o");
8001 CmdArgs.push_back(Output.getFilename());
8002
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008003 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008004 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008005
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008006 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008007 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008008}
8009
Douglas Katzman95354292015-06-23 20:42:09 +00008010void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8011 const InputInfo &Output,
8012 const InputInfoList &Inputs,
8013 const ArgList &Args,
8014 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008015 const Driver &D = getToolChain().getDriver();
8016 ArgStringList CmdArgs;
8017
Douglas Katzman78b37b02015-11-17 20:28:07 +00008018 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008019 CmdArgs.push_back("-e");
8020 CmdArgs.push_back("__start");
8021 }
8022
8023 if (Args.hasArg(options::OPT_static)) {
8024 CmdArgs.push_back("-Bstatic");
8025 } else {
8026 if (Args.hasArg(options::OPT_rdynamic))
8027 CmdArgs.push_back("-export-dynamic");
8028 CmdArgs.push_back("--eh-frame-hdr");
8029 CmdArgs.push_back("-Bdynamic");
8030 if (Args.hasArg(options::OPT_shared)) {
8031 CmdArgs.push_back("-shared");
8032 } else {
8033 CmdArgs.push_back("-dynamic-linker");
8034 CmdArgs.push_back("/usr/libexec/ld.so");
8035 }
8036 }
8037
8038 if (Output.isFilename()) {
8039 CmdArgs.push_back("-o");
8040 CmdArgs.push_back(Output.getFilename());
8041 } else {
8042 assert(Output.isNothing() && "Invalid output.");
8043 }
8044
Douglas Katzman78b37b02015-11-17 20:28:07 +00008045 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008046 if (!Args.hasArg(options::OPT_shared)) {
8047 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008048 CmdArgs.push_back(
8049 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008050 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008051 CmdArgs.push_back(
8052 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8053 CmdArgs.push_back(
8054 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008055 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008056 CmdArgs.push_back(
8057 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008058 }
8059 }
8060
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008061 Args.AddAllArgs(CmdArgs,
8062 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008063
8064 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8065
Douglas Katzman78b37b02015-11-17 20:28:07 +00008066 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008067 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008068 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8069 if (Args.hasArg(options::OPT_pg))
8070 CmdArgs.push_back("-lm_p");
8071 else
8072 CmdArgs.push_back("-lm");
8073 }
8074
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008075 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008076 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008077 CmdArgs.push_back("-lpthread_p");
8078 else
8079 CmdArgs.push_back("-lpthread");
8080 }
8081
Eli Friedman9fa28852012-08-08 23:57:20 +00008082 if (!Args.hasArg(options::OPT_shared)) {
8083 if (Args.hasArg(options::OPT_pg))
8084 CmdArgs.push_back("-lc_p");
8085 else
8086 CmdArgs.push_back("-lc");
8087 }
8088
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008089 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008090 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008091 case llvm::Triple::arm:
8092 MyArch = "arm";
8093 break;
8094 case llvm::Triple::x86:
8095 MyArch = "i386";
8096 break;
8097 case llvm::Triple::x86_64:
8098 MyArch = "amd64";
8099 break;
8100 default:
8101 llvm_unreachable("Unsupported architecture");
8102 }
8103 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008104 }
8105
Douglas Katzman78b37b02015-11-17 20:28:07 +00008106 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008107 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008108 CmdArgs.push_back(
8109 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008110 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008111 CmdArgs.push_back(
8112 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008113 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008115 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008116 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008117}
8118
Douglas Katzman95354292015-06-23 20:42:09 +00008119void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8120 const InputInfo &Output,
8121 const InputInfoList &Inputs,
8122 const ArgList &Args,
8123 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008124 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008125 ArgStringList CmdArgs;
8126
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008127 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8128 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008129 switch (getToolChain().getArch()) {
8130 default:
8131 break;
8132 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008133 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008134 break;
8135 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008136 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008137 break;
8138 case llvm::Triple::mips:
8139 case llvm::Triple::mipsel:
8140 case llvm::Triple::mips64:
8141 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008142 StringRef CPUName;
8143 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008144 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008145
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008146 CmdArgs.push_back("-march");
8147 CmdArgs.push_back(CPUName.data());
8148
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008149 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008150 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008151
8152 if (getToolChain().getArch() == llvm::Triple::mips ||
8153 getToolChain().getArch() == llvm::Triple::mips64)
8154 CmdArgs.push_back("-EB");
8155 else
8156 CmdArgs.push_back("-EL");
8157
Dimitry Andric46f338c2015-12-27 10:36:44 +00008158 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8159 StringRef v = A->getValue();
8160 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8161 A->claim();
8162 }
8163
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008164 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008165 break;
8166 }
8167 case llvm::Triple::arm:
8168 case llvm::Triple::armeb:
8169 case llvm::Triple::thumb:
8170 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008171 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008172
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008173 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008174 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008175 else
Renato Golinf4421f72014-02-19 10:44:07 +00008176 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008177
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008178 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008179 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008180 case llvm::Triple::GNUEABI:
8181 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008182 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008183 break;
8184
8185 default:
8186 CmdArgs.push_back("-matpcs");
8187 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008188 break;
8189 }
8190 case llvm::Triple::sparc:
8191 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008192 case llvm::Triple::sparcv9: {
8193 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8194 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008195 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008196 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008197 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008198 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008199
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008201
8202 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008203 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008205 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008206 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008207
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008208 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008209 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008210}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008211
Douglas Katzman95354292015-06-23 20:42:09 +00008212void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8213 const InputInfo &Output,
8214 const InputInfoList &Inputs,
8215 const ArgList &Args,
8216 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008217 const toolchains::FreeBSD &ToolChain =
8218 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008219 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008220 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008221 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008222 !Args.hasArg(options::OPT_shared) &&
8223 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008224 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008225
8226 // Silence warning for "clang -g foo.o -o foo"
8227 Args.ClaimAllArgs(options::OPT_g_Group);
8228 // and "clang -emit-llvm foo.o -o foo"
8229 Args.ClaimAllArgs(options::OPT_emit_llvm);
8230 // and for "clang -w foo.o -o foo". Other warning options are already
8231 // handled somewhere else.
8232 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008233
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008234 if (!D.SysRoot.empty())
8235 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8236
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008237 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008238 CmdArgs.push_back("-pie");
8239
Ed Maste1bc232d2016-04-12 21:11:46 +00008240 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008241 if (Args.hasArg(options::OPT_static)) {
8242 CmdArgs.push_back("-Bstatic");
8243 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008244 if (Args.hasArg(options::OPT_rdynamic))
8245 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008246 if (Args.hasArg(options::OPT_shared)) {
8247 CmdArgs.push_back("-Bshareable");
8248 } else {
8249 CmdArgs.push_back("-dynamic-linker");
8250 CmdArgs.push_back("/libexec/ld-elf.so.1");
8251 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008252 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008253 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8254 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8255 CmdArgs.push_back("--hash-style=both");
8256 }
8257 }
8258 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008259 }
8260
8261 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8262 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008263 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008264 CmdArgs.push_back("-m");
8265 CmdArgs.push_back("elf_i386_fbsd");
8266 }
8267
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008268 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008269 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008270 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008271 }
8272
Dimitry Andric904895f2015-12-27 06:47:09 +00008273 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8274 if (ToolChain.getArch() == llvm::Triple::mips ||
8275 ToolChain.getArch() == llvm::Triple::mipsel ||
8276 ToolChain.getArch() == llvm::Triple::mips64 ||
8277 ToolChain.getArch() == llvm::Triple::mips64el) {
8278 StringRef v = A->getValue();
8279 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8280 A->claim();
8281 }
8282 }
8283
Daniel Dunbarb440f562010-08-02 02:38:21 +00008284 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008285 CmdArgs.push_back("-o");
8286 CmdArgs.push_back(Output.getFilename());
8287 } else {
8288 assert(Output.isNothing() && "Invalid output.");
8289 }
8290
Douglas Katzman78b37b02015-11-17 20:28:07 +00008291 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008292 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008293 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008294 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008295 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008296 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008297 crt1 = "Scrt1.o";
8298 else
8299 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008300 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008301 if (crt1)
8302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8303
8304 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8305
Craig Topper92fc2df2014-05-17 16:56:41 +00008306 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008307 if (Args.hasArg(options::OPT_static))
8308 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008309 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008310 crtbegin = "crtbeginS.o";
8311 else
8312 crtbegin = "crtbegin.o";
8313
8314 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008315 }
8316
8317 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008318 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008319 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8320 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008321 Args.AddAllArgs(CmdArgs, options::OPT_s);
8322 Args.AddAllArgs(CmdArgs, options::OPT_t);
8323 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8324 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008325
Teresa Johnson945bc502015-10-15 20:35:53 +00008326 if (D.isUsingLTO())
8327 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008328
Alexey Samsonov52550342014-09-15 19:58:40 +00008329 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008330 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008331
Douglas Katzman78b37b02015-11-17 20:28:07 +00008332 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008333 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008334 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008335 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008336 if (Args.hasArg(options::OPT_pg))
8337 CmdArgs.push_back("-lm_p");
8338 else
8339 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008340 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008341 if (NeedsSanitizerDeps)
8342 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008343 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8344 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008345 if (Args.hasArg(options::OPT_pg))
8346 CmdArgs.push_back("-lgcc_p");
8347 else
8348 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008349 if (Args.hasArg(options::OPT_static)) {
8350 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008351 } else if (Args.hasArg(options::OPT_pg)) {
8352 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008353 } else {
8354 CmdArgs.push_back("--as-needed");
8355 CmdArgs.push_back("-lgcc_s");
8356 CmdArgs.push_back("--no-as-needed");
8357 }
8358
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008359 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008360 if (Args.hasArg(options::OPT_pg))
8361 CmdArgs.push_back("-lpthread_p");
8362 else
8363 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008364 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008365
Roman Divacky66f22762011-02-10 16:59:40 +00008366 if (Args.hasArg(options::OPT_pg)) {
8367 if (Args.hasArg(options::OPT_shared))
8368 CmdArgs.push_back("-lc");
8369 else
8370 CmdArgs.push_back("-lc_p");
8371 CmdArgs.push_back("-lgcc_p");
8372 } else {
8373 CmdArgs.push_back("-lc");
8374 CmdArgs.push_back("-lgcc");
8375 }
8376
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008377 if (Args.hasArg(options::OPT_static)) {
8378 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008379 } else if (Args.hasArg(options::OPT_pg)) {
8380 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008381 } else {
8382 CmdArgs.push_back("--as-needed");
8383 CmdArgs.push_back("-lgcc_s");
8384 CmdArgs.push_back("--no-as-needed");
8385 }
8386 }
8387
Douglas Katzman78b37b02015-11-17 20:28:07 +00008388 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008389 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008390 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008391 else
8392 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008393 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008394 }
8395
Xinliang David Li69306c02015-10-22 06:15:31 +00008396 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008397
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008398 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008399 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008400}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008401
Douglas Katzman95354292015-06-23 20:42:09 +00008402void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008403 const InputInfo &Output,
8404 const InputInfoList &Inputs,
8405 const ArgList &Args,
8406 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008407 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008408 ArgStringList CmdArgs;
8409
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008410 // GNU as needs different flags for creating the correct output format
8411 // on architectures with different ABIs or optional feature sets.
8412 switch (getToolChain().getArch()) {
8413 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008414 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008415 break;
8416 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008417 case llvm::Triple::armeb:
8418 case llvm::Triple::thumb:
8419 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008420 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008421 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8422 std::string Arch =
8423 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008424 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008425 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008426 }
8427
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008428 case llvm::Triple::mips:
8429 case llvm::Triple::mipsel:
8430 case llvm::Triple::mips64:
8431 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008432 StringRef CPUName;
8433 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008434 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008435
8436 CmdArgs.push_back("-march");
8437 CmdArgs.push_back(CPUName.data());
8438
8439 CmdArgs.push_back("-mabi");
8440 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8441
8442 if (getToolChain().getArch() == llvm::Triple::mips ||
8443 getToolChain().getArch() == llvm::Triple::mips64)
8444 CmdArgs.push_back("-EB");
8445 else
8446 CmdArgs.push_back("-EL");
8447
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008448 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008449 break;
8450 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008451
8452 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008453 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008454 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008455 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8456 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008457 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008458 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008459 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008460
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008461 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008462 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008463 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8464 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008465 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008466 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008467 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008468
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008469 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008470 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008471 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008472
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008473 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008474
8475 CmdArgs.push_back("-o");
8476 CmdArgs.push_back(Output.getFilename());
8477
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008478 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008479 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008480
David Chisnallddbd68f2011-09-27 22:03:18 +00008481 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008482 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008483}
8484
Douglas Katzman95354292015-06-23 20:42:09 +00008485void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8486 const InputInfo &Output,
8487 const InputInfoList &Inputs,
8488 const ArgList &Args,
8489 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008490 const Driver &D = getToolChain().getDriver();
8491 ArgStringList CmdArgs;
8492
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008493 if (!D.SysRoot.empty())
8494 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8495
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008496 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008497 if (Args.hasArg(options::OPT_static)) {
8498 CmdArgs.push_back("-Bstatic");
8499 } else {
8500 if (Args.hasArg(options::OPT_rdynamic))
8501 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008502 if (Args.hasArg(options::OPT_shared)) {
8503 CmdArgs.push_back("-Bshareable");
8504 } else {
8505 CmdArgs.push_back("-dynamic-linker");
8506 CmdArgs.push_back("/libexec/ld.elf_so");
8507 }
8508 }
8509
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008510 // Many NetBSD architectures support more than one ABI.
8511 // Determine the correct emulation for ld.
8512 switch (getToolChain().getArch()) {
8513 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008514 CmdArgs.push_back("-m");
8515 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008516 break;
8517 case llvm::Triple::arm:
8518 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008519 CmdArgs.push_back("-m");
8520 switch (getToolChain().getTriple().getEnvironment()) {
8521 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008522 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008523 CmdArgs.push_back("armelf_nbsd_eabi");
8524 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008525 case llvm::Triple::EABIHF:
8526 case llvm::Triple::GNUEABIHF:
8527 CmdArgs.push_back("armelf_nbsd_eabihf");
8528 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008529 default:
8530 CmdArgs.push_back("armelf_nbsd");
8531 break;
8532 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008533 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008534 case llvm::Triple::armeb:
8535 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008536 arm::appendEBLinkFlags(
8537 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008538 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008539 CmdArgs.push_back("-m");
8540 switch (getToolChain().getTriple().getEnvironment()) {
8541 case llvm::Triple::EABI:
8542 case llvm::Triple::GNUEABI:
8543 CmdArgs.push_back("armelfb_nbsd_eabi");
8544 break;
8545 case llvm::Triple::EABIHF:
8546 case llvm::Triple::GNUEABIHF:
8547 CmdArgs.push_back("armelfb_nbsd_eabihf");
8548 break;
8549 default:
8550 CmdArgs.push_back("armelfb_nbsd");
8551 break;
8552 }
8553 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008554 case llvm::Triple::mips64:
8555 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008556 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008557 CmdArgs.push_back("-m");
8558 if (getToolChain().getArch() == llvm::Triple::mips64)
8559 CmdArgs.push_back("elf32btsmip");
8560 else
8561 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008562 } else if (mips::hasMipsAbiArg(Args, "64")) {
8563 CmdArgs.push_back("-m");
8564 if (getToolChain().getArch() == llvm::Triple::mips64)
8565 CmdArgs.push_back("elf64btsmip");
8566 else
8567 CmdArgs.push_back("elf64ltsmip");
8568 }
8569 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008570 case llvm::Triple::ppc:
8571 CmdArgs.push_back("-m");
8572 CmdArgs.push_back("elf32ppc_nbsd");
8573 break;
8574
8575 case llvm::Triple::ppc64:
8576 case llvm::Triple::ppc64le:
8577 CmdArgs.push_back("-m");
8578 CmdArgs.push_back("elf64ppc");
8579 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008580
8581 case llvm::Triple::sparc:
8582 CmdArgs.push_back("-m");
8583 CmdArgs.push_back("elf32_sparc");
8584 break;
8585
8586 case llvm::Triple::sparcv9:
8587 CmdArgs.push_back("-m");
8588 CmdArgs.push_back("elf64_sparc");
8589 break;
8590
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008591 default:
8592 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008593 }
8594
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008595 if (Output.isFilename()) {
8596 CmdArgs.push_back("-o");
8597 CmdArgs.push_back(Output.getFilename());
8598 } else {
8599 assert(Output.isNothing() && "Invalid output.");
8600 }
8601
Douglas Katzman78b37b02015-11-17 20:28:07 +00008602 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008603 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008604 CmdArgs.push_back(
8605 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8606 CmdArgs.push_back(
8607 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8608 CmdArgs.push_back(
8609 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008610 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008611 CmdArgs.push_back(
8612 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8613 CmdArgs.push_back(
8614 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008615 }
8616 }
8617
8618 Args.AddAllArgs(CmdArgs, options::OPT_L);
8619 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8620 Args.AddAllArgs(CmdArgs, options::OPT_e);
8621 Args.AddAllArgs(CmdArgs, options::OPT_s);
8622 Args.AddAllArgs(CmdArgs, options::OPT_t);
8623 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8624 Args.AddAllArgs(CmdArgs, options::OPT_r);
8625
8626 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8627
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008628 unsigned Major, Minor, Micro;
8629 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8630 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008631 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008632 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008633 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008634 case llvm::Triple::arm:
8635 case llvm::Triple::armeb:
8636 case llvm::Triple::thumb:
8637 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008638 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008639 case llvm::Triple::ppc64:
8640 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008641 case llvm::Triple::sparc:
8642 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008643 case llvm::Triple::x86:
8644 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008645 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008646 break;
8647 default:
8648 break;
8649 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008650 }
8651
Douglas Katzman78b37b02015-11-17 20:28:07 +00008652 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008653 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008654 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008655 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8656 CmdArgs.push_back("-lm");
8657 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008658 if (Args.hasArg(options::OPT_pthread))
8659 CmdArgs.push_back("-lpthread");
8660 CmdArgs.push_back("-lc");
8661
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008662 if (useLibgcc) {
8663 if (Args.hasArg(options::OPT_static)) {
8664 // libgcc_eh depends on libc, so resolve as much as possible,
8665 // pull in any new requirements from libc and then get the rest
8666 // of libgcc.
8667 CmdArgs.push_back("-lgcc_eh");
8668 CmdArgs.push_back("-lc");
8669 CmdArgs.push_back("-lgcc");
8670 } else {
8671 CmdArgs.push_back("-lgcc");
8672 CmdArgs.push_back("--as-needed");
8673 CmdArgs.push_back("-lgcc_s");
8674 CmdArgs.push_back("--no-as-needed");
8675 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008676 }
8677 }
8678
Douglas Katzman78b37b02015-11-17 20:28:07 +00008679 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008680 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008681 CmdArgs.push_back(
8682 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008683 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008684 CmdArgs.push_back(
8685 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8686 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008687 }
8688
Xinliang David Li69306c02015-10-22 06:15:31 +00008689 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008690
Logan Chieneb9162f2014-06-26 14:23:45 +00008691 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008692 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008693}
8694
Douglas Katzman95354292015-06-23 20:42:09 +00008695void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8696 const InputInfo &Output,
8697 const InputInfoList &Inputs,
8698 const ArgList &Args,
8699 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008700 claimNoWarnArgs(Args);
8701
James Y Knight2db38f32015-08-15 03:45:25 +00008702 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8703 llvm::Triple Triple = llvm::Triple(TripleStr);
8704
Rafael Espindola92b00932010-08-10 00:25:48 +00008705 ArgStringList CmdArgs;
8706
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008707 llvm::Reloc::Model RelocationModel;
8708 unsigned PICLevel;
8709 bool IsPIE;
8710 std::tie(RelocationModel, PICLevel, IsPIE) =
8711 ParsePICArgs(getToolChain(), Triple, Args);
8712
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008713 switch (getToolChain().getArch()) {
8714 default:
8715 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008716 // Add --32/--64 to make sure we get the format we want.
8717 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008718 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008719 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008720 break;
8721 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008722 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8723 CmdArgs.push_back("--x32");
8724 else
8725 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008726 break;
8727 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008728 CmdArgs.push_back("-a32");
8729 CmdArgs.push_back("-mppc");
8730 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008731 break;
8732 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008733 CmdArgs.push_back("-a64");
8734 CmdArgs.push_back("-mppc64");
8735 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008736 break;
8737 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008738 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008739 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008740 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008741 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008742 break;
8743 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008744 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008745 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008746 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8747 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8748 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008749 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008750 }
8751 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008752 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008753 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8754 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8755 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008756 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008757 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008758 case llvm::Triple::arm:
8759 case llvm::Triple::armeb:
8760 case llvm::Triple::thumb:
8761 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008762 const llvm::Triple &Triple2 = getToolChain().getTriple();
8763 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008764 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008765 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008766 break;
8767 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008768 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008769 break;
8770 default:
8771 break;
8772 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008773
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008774 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008775 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8776 case arm::FloatABI::Soft:
8777 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8778 break;
8779 case arm::FloatABI::SoftFP:
8780 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8781 break;
8782 case arm::FloatABI::Hard:
8783 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8784 break;
8785 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008786
8787 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008788
8789 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008790 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008791 // march from being picked in the absence of a cpu flag.
8792 Arg *A;
8793 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008794 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008795 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008796 else
8797 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008798 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008799 break;
8800 }
8801 case llvm::Triple::mips:
8802 case llvm::Triple::mipsel:
8803 case llvm::Triple::mips64:
8804 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008805 StringRef CPUName;
8806 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008807 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008808 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008809
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008810 CmdArgs.push_back("-march");
8811 CmdArgs.push_back(CPUName.data());
8812
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008813 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008814 CmdArgs.push_back(ABIName.data());
8815
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008816 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8817 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008818 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008819 CmdArgs.push_back("-mno-shared");
8820
Daniel Sanders379d44b2014-07-16 11:52:23 +00008821 // LLVM doesn't support -mplt yet and acts as if it is always given.
8822 // However, -mplt has no effect with the N64 ABI.
8823 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008824
8825 if (getToolChain().getArch() == llvm::Triple::mips ||
8826 getToolChain().getArch() == llvm::Triple::mips64)
8827 CmdArgs.push_back("-EB");
8828 else
8829 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008830
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008831 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8832 if (StringRef(A->getValue()) == "2008")
8833 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8834 }
8835
Daniel Sanders379d44b2014-07-16 11:52:23 +00008836 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8837 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8838 options::OPT_mfp64)) {
8839 A->claim();
8840 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008841 } else if (mips::shouldUseFPXX(
8842 Args, getToolChain().getTriple(), CPUName, ABIName,
8843 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008844 CmdArgs.push_back("-mfpxx");
8845
8846 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8847 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008848 if (Arg *A =
8849 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008850 if (A->getOption().matches(options::OPT_mips16)) {
8851 A->claim();
8852 A->render(Args, CmdArgs);
8853 } else {
8854 A->claim();
8855 CmdArgs.push_back("-no-mips16");
8856 }
8857 }
8858
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008859 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8860 options::OPT_mno_micromips);
8861 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8862 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8863
Simon Atanasyanbd986632013-11-26 11:58:04 +00008864 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8865 // Do not use AddLastArg because not all versions of MIPS assembler
8866 // support -mmsa / -mno-msa options.
8867 if (A->getOption().matches(options::OPT_mmsa))
8868 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8869 }
8870
Daniel Sanders379d44b2014-07-16 11:52:23 +00008871 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8872 options::OPT_msoft_float);
8873
Toma Tabacub36d6102015-06-11 12:13:18 +00008874 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8875 options::OPT_msingle_float);
8876
Daniel Sanders379d44b2014-07-16 11:52:23 +00008877 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8878 options::OPT_mno_odd_spreg);
8879
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008880 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008881 break;
8882 }
8883 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008884 // Always pass an -march option, since our default of z10 is later
8885 // than the GNU assembler's default.
8886 StringRef CPUName = getSystemZTargetCPU(Args);
8887 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008888 break;
8889 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008890 }
8891
Renato Golina74bbc72015-07-22 15:32:36 +00008892 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008893 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008894
8895 CmdArgs.push_back("-o");
8896 CmdArgs.push_back(Output.getFilename());
8897
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008898 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008899 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008900
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008901 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008902 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008903
8904 // Handle the debug info splitting at object creation time if we're
8905 // creating an object.
8906 // TODO: Currently only works on linux with newer objcopy.
8907 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008908 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008909 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008910 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008911}
8912
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008913static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008914 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008915 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008916 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008917 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8918 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008919 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008920 CmdArgs.push_back("-lgcc");
8921
Logan Chien3d3373c2012-11-19 12:04:11 +00008922 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008923 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008924 CmdArgs.push_back("-lgcc");
8925 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008926 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008927 CmdArgs.push_back("--as-needed");
8928 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008929 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008930 CmdArgs.push_back("--no-as-needed");
8931 }
8932
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008933 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008934 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008935 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008936 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008937
8938 // According to Android ABI, we have to link with libdl if we are
8939 // linking with non-static libgcc.
8940 //
8941 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8942 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8943 if (isAndroid && !StaticLibgcc)
8944 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008945}
8946
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008947static std::string getLinuxDynamicLinker(const ArgList &Args,
8948 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008949 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8950
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008951 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008952 if (ToolChain.getTriple().isArch64Bit())
8953 return "/system/bin/linker64";
8954 else
8955 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008956 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8957 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008958 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008959 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008960 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008961 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008962 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008963 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008964 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008965 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008966 return "/lib/ld-linux-armhf.so.3";
8967 else
8968 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008969 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8970 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008971 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008972 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008973 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008974 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008975 return "/lib/ld-linux.so.3";
8976 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8977 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008978 std::string LibDir =
8979 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008980 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008981 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008982 if (mips::isUCLibc(Args))
8983 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008984 else if (!ToolChain.getTriple().hasEnvironment()) {
8985 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8986 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8987 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8988 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008989 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008990
8991 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008992 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008993 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008994 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008995 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8996 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008997 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008998 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008999 if (ppc::hasPPCAbiArg(Args, "elfv1"))
9000 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00009001 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009002 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00009003 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009004 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00009005 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009006 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00009007 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
9008 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00009009 else
9010 return "/lib64/ld-linux-x86-64.so.2";
9011}
9012
Renato Golinc4b49242014-02-13 10:01:16 +00009013static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009014 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009015 // Make use of compiler-rt if --rtlib option is used
9016 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9017
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009018 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009019 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009020 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009021 default:
9022 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009023 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009024 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009025 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009026 break;
9027 }
Renato Golinc4b49242014-02-13 10:01:16 +00009028 break;
9029 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009030 // Make sure libgcc is not used under MSVC environment by default
9031 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9032 // Issue error diagnostic if libgcc is explicitly specified
9033 // through command line as --rtlib option argument.
9034 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9035 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9036 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9037 }
9038 } else
9039 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009040 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009041 }
9042}
9043
Rafael Espindola1e085772014-08-15 17:14:35 +00009044static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9045 switch (T.getArch()) {
9046 case llvm::Triple::x86:
9047 return "elf_i386";
9048 case llvm::Triple::aarch64:
9049 return "aarch64linux";
9050 case llvm::Triple::aarch64_be:
9051 return "aarch64_be_linux";
9052 case llvm::Triple::arm:
9053 case llvm::Triple::thumb:
9054 return "armelf_linux_eabi";
9055 case llvm::Triple::armeb:
9056 case llvm::Triple::thumbeb:
9057 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9058 case llvm::Triple::ppc:
9059 return "elf32ppclinux";
9060 case llvm::Triple::ppc64:
9061 return "elf64ppc";
9062 case llvm::Triple::ppc64le:
9063 return "elf64lppc";
9064 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009065 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009066 return "elf32_sparc";
9067 case llvm::Triple::sparcv9:
9068 return "elf64_sparc";
9069 case llvm::Triple::mips:
9070 return "elf32btsmip";
9071 case llvm::Triple::mipsel:
9072 return "elf32ltsmip";
9073 case llvm::Triple::mips64:
9074 if (mips::hasMipsAbiArg(Args, "n32"))
9075 return "elf32btsmipn32";
9076 return "elf64btsmip";
9077 case llvm::Triple::mips64el:
9078 if (mips::hasMipsAbiArg(Args, "n32"))
9079 return "elf32ltsmipn32";
9080 return "elf64ltsmip";
9081 case llvm::Triple::systemz:
9082 return "elf64_s390";
9083 case llvm::Triple::x86_64:
9084 if (T.getEnvironment() == llvm::Triple::GNUX32)
9085 return "elf32_x86_64";
9086 return "elf_x86_64";
9087 default:
9088 llvm_unreachable("Unexpected arch");
9089 }
9090}
9091
Douglas Katzman95354292015-06-23 20:42:09 +00009092void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9093 const InputInfo &Output,
9094 const InputInfoList &Inputs,
9095 const ArgList &Args,
9096 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009097 const toolchains::Linux &ToolChain =
9098 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009099 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009100
9101 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9102 llvm::Triple Triple = llvm::Triple(TripleStr);
9103
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009104 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009105 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009106 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009107 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9108 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009109 const bool HasCRTBeginEndFiles =
9110 ToolChain.getTriple().hasEnvironment() ||
9111 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009112
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009113 ArgStringList CmdArgs;
9114
Rafael Espindolad1002f62010-11-15 18:28:16 +00009115 // Silence warning for "clang -g foo.o -o foo"
9116 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009117 // and "clang -emit-llvm foo.o -o foo"
9118 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009119 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009120 // handled somewhere else.
9121 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009122
Peter Collingbourne39719a72015-11-20 20:49:39 +00009123 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9124 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009125 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009126 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009127 CmdArgs.push_back("-target");
9128 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9129 }
9130
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009131 if (!D.SysRoot.empty())
9132 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009133
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009134 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009135 CmdArgs.push_back("-pie");
9136
Rafael Espindola1c76c592010-11-07 22:57:16 +00009137 if (Args.hasArg(options::OPT_rdynamic))
9138 CmdArgs.push_back("-export-dynamic");
9139
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009140 if (Args.hasArg(options::OPT_s))
9141 CmdArgs.push_back("-s");
9142
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009143 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009144 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009145
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009146 for (const auto &Opt : ToolChain.ExtraOpts)
9147 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009148
9149 if (!Args.hasArg(options::OPT_static)) {
9150 CmdArgs.push_back("--eh-frame-hdr");
9151 }
9152
9153 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009154 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009155
9156 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009157 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9158 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009159 CmdArgs.push_back("-Bstatic");
9160 else
9161 CmdArgs.push_back("-static");
9162 } else if (Args.hasArg(options::OPT_shared)) {
9163 CmdArgs.push_back("-shared");
9164 }
9165
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009166 if (!Args.hasArg(options::OPT_static)) {
9167 if (Args.hasArg(options::OPT_rdynamic))
9168 CmdArgs.push_back("-export-dynamic");
9169
9170 if (!Args.hasArg(options::OPT_shared)) {
9171 const std::string Loader =
9172 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9173 CmdArgs.push_back("-dynamic-linker");
9174 CmdArgs.push_back(Args.MakeArgString(Loader));
9175 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009176 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009177
9178 CmdArgs.push_back("-o");
9179 CmdArgs.push_back(Output.getFilename());
9180
Douglas Katzman78b37b02015-11-17 20:28:07 +00009181 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009182 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009183 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009184 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009185 if (Args.hasArg(options::OPT_pg))
9186 crt1 = "gcrt1.o";
9187 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009188 crt1 = "Scrt1.o";
9189 else
9190 crt1 = "crt1.o";
9191 }
9192 if (crt1)
9193 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009194
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009195 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9196 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009197
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009198 const char *crtbegin;
9199 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009200 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009201 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009202 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009203 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009204 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009205 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009206 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009207
9208 if (HasCRTBeginEndFiles)
9209 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009210
9211 // Add crtfastmath.o if available and fast math is enabled.
9212 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009213 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009214
9215 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009216 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009217
Douglas Katzman6059ef92015-11-17 17:41:23 +00009218 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009219
Teresa Johnson945bc502015-10-15 20:35:53 +00009220 if (D.isUsingLTO())
9221 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009222
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009223 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9224 CmdArgs.push_back("--no-demangle");
9225
Alexey Samsonov52550342014-09-15 19:58:40 +00009226 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009227 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009228 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009229 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009230
Douglas Katzman78b37b02015-11-17 20:28:07 +00009231 if (D.CCCIsCXX() &&
9232 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009233 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009234 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009235 if (OnlyLibstdcxxStatic)
9236 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009237 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009238 if (OnlyLibstdcxxStatic)
9239 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009240 CmdArgs.push_back("-lm");
9241 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009242 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9243 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009244
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009245 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009246 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9247 if (Args.hasArg(options::OPT_static))
9248 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009249
Alexey Samsonov52550342014-09-15 19:58:40 +00009250 if (NeedsSanitizerDeps)
9251 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9252
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009253 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9254 Args.hasArg(options::OPT_pthreads);
9255
9256 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9257 options::OPT_fno_openmp, false)) {
9258 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9259 // FIXME: Does this really make sense for all GNU toolchains?
9260 WantPthread = true;
9261
9262 // Also link the particular OpenMP runtimes.
9263 switch (getOpenMPRuntime(ToolChain, Args)) {
9264 case OMPRT_OMP:
9265 CmdArgs.push_back("-lomp");
9266 break;
9267 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009268 CmdArgs.push_back("-lgomp");
9269
9270 // FIXME: Exclude this for platforms with libgomp that don't require
9271 // librt. Most modern Linux platforms require it, but some may not.
9272 CmdArgs.push_back("-lrt");
9273 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009274 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009275 CmdArgs.push_back("-liomp5");
9276 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009277 case OMPRT_Unknown:
9278 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009279 break;
9280 }
Chandler Carruth01538002013-01-17 13:19:29 +00009281 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009282
Renato Golinc4b49242014-02-13 10:01:16 +00009283 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009284
Richard Smith31d1de22015-05-20 22:48:44 +00009285 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009286 CmdArgs.push_back("-lpthread");
9287
Rafael Espindolab17bc532016-01-25 18:29:16 +00009288 if (Args.hasArg(options::OPT_fsplit_stack))
9289 CmdArgs.push_back("--wrap=pthread_create");
9290
Chandler Carruth94a32012012-05-14 18:31:18 +00009291 CmdArgs.push_back("-lc");
9292
9293 if (Args.hasArg(options::OPT_static))
9294 CmdArgs.push_back("--end-group");
9295 else
Renato Golinc4b49242014-02-13 10:01:16 +00009296 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009297 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009298
Rafael Espindola81937ec2010-12-01 01:52:43 +00009299 if (!Args.hasArg(options::OPT_nostartfiles)) {
9300 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009301 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009302 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009303 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009304 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009305 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009306 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009307
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009308 if (HasCRTBeginEndFiles)
9309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009310 if (!isAndroid)
9311 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009312 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009313 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009314
Peter Collingbourne39719a72015-11-20 20:49:39 +00009315 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009316}
9317
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009318// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9319// for the various SFI requirements like register masking. The assembly tool
9320// inserts the file containing the macros as an input into all the assembly
9321// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009322void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9323 const InputInfo &Output,
9324 const InputInfoList &Inputs,
9325 const ArgList &Args,
9326 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009327 const toolchains::NaClToolChain &ToolChain =
9328 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009329 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009330 "nacl-arm-macros.s");
9331 InputInfoList NewInputs;
9332 NewInputs.push_back(NaClMacros);
9333 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009334 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9335 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009336}
9337
Douglas Katzman750cfc52015-06-29 18:42:16 +00009338// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009339// we use static by default, do not yet support sanitizers or LTO, and a few
9340// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009341// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009342void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9343 const InputInfo &Output,
9344 const InputInfoList &Inputs,
9345 const ArgList &Args,
9346 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009347
Douglas Katzman54366072015-07-27 16:53:08 +00009348 const toolchains::NaClToolChain &ToolChain =
9349 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009350 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009351 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009352 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009353 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009354
9355 ArgStringList CmdArgs;
9356
9357 // Silence warning for "clang -g foo.o -o foo"
9358 Args.ClaimAllArgs(options::OPT_g_Group);
9359 // and "clang -emit-llvm foo.o -o foo"
9360 Args.ClaimAllArgs(options::OPT_emit_llvm);
9361 // and for "clang -w foo.o -o foo". Other warning options are already
9362 // handled somewhere else.
9363 Args.ClaimAllArgs(options::OPT_w);
9364
9365 if (!D.SysRoot.empty())
9366 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9367
9368 if (Args.hasArg(options::OPT_rdynamic))
9369 CmdArgs.push_back("-export-dynamic");
9370
9371 if (Args.hasArg(options::OPT_s))
9372 CmdArgs.push_back("-s");
9373
Douglas Katzman54366072015-07-27 16:53:08 +00009374 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9375 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009376 CmdArgs.push_back("--build-id");
9377
9378 if (!IsStatic)
9379 CmdArgs.push_back("--eh-frame-hdr");
9380
9381 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009382 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009383 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009384 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009385 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009386 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009387 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009388 else if (Arch == llvm::Triple::mipsel)
9389 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009390 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009391 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9392 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009393
9394 if (IsStatic)
9395 CmdArgs.push_back("-static");
9396 else if (Args.hasArg(options::OPT_shared))
9397 CmdArgs.push_back("-shared");
9398
9399 CmdArgs.push_back("-o");
9400 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009401 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009402 if (!Args.hasArg(options::OPT_shared))
9403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9404 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9405
9406 const char *crtbegin;
9407 if (IsStatic)
9408 crtbegin = "crtbeginT.o";
9409 else if (Args.hasArg(options::OPT_shared))
9410 crtbegin = "crtbeginS.o";
9411 else
9412 crtbegin = "crtbegin.o";
9413 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9414 }
9415
9416 Args.AddAllArgs(CmdArgs, options::OPT_L);
9417 Args.AddAllArgs(CmdArgs, options::OPT_u);
9418
Douglas Katzman6059ef92015-11-17 17:41:23 +00009419 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009420
9421 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9422 CmdArgs.push_back("--no-demangle");
9423
9424 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9425
Douglas Katzman78b37b02015-11-17 20:28:07 +00009426 if (D.CCCIsCXX() &&
9427 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009428 bool OnlyLibstdcxxStatic =
9429 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009430 if (OnlyLibstdcxxStatic)
9431 CmdArgs.push_back("-Bstatic");
9432 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9433 if (OnlyLibstdcxxStatic)
9434 CmdArgs.push_back("-Bdynamic");
9435 CmdArgs.push_back("-lm");
9436 }
9437
9438 if (!Args.hasArg(options::OPT_nostdlib)) {
9439 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9440 // Always use groups, since it has no effect on dynamic libraries.
9441 CmdArgs.push_back("--start-group");
9442 CmdArgs.push_back("-lc");
9443 // NaCl's libc++ currently requires libpthread, so just always include it
9444 // in the group for C++.
9445 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009446 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009447 // Gold, used by Mips, handles nested groups differently than ld, and
9448 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9449 // which is not a desired behaviour here.
9450 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9451 if (getToolChain().getArch() == llvm::Triple::mipsel)
9452 CmdArgs.push_back("-lnacl");
9453
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009454 CmdArgs.push_back("-lpthread");
9455 }
9456
9457 CmdArgs.push_back("-lgcc");
9458 CmdArgs.push_back("--as-needed");
9459 if (IsStatic)
9460 CmdArgs.push_back("-lgcc_eh");
9461 else
9462 CmdArgs.push_back("-lgcc_s");
9463 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009464
9465 // Mips needs to create and use pnacl_legacy library that contains
9466 // definitions from bitcode/pnaclmm.c and definitions for
9467 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9468 if (getToolChain().getArch() == llvm::Triple::mipsel)
9469 CmdArgs.push_back("-lpnacl_legacy");
9470
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009471 CmdArgs.push_back("--end-group");
9472 }
9473
9474 if (!Args.hasArg(options::OPT_nostartfiles)) {
9475 const char *crtend;
9476 if (Args.hasArg(options::OPT_shared))
9477 crtend = "crtendS.o";
9478 else
9479 crtend = "crtend.o";
9480
9481 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9482 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9483 }
9484 }
9485
Peter Collingbourne39719a72015-11-20 20:49:39 +00009486 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9487 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009488}
9489
Douglas Katzman95354292015-06-23 20:42:09 +00009490void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9491 const InputInfo &Output,
9492 const InputInfoList &Inputs,
9493 const ArgList &Args,
9494 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009495 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009496 ArgStringList CmdArgs;
9497
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009498 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009499
9500 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009501 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009503 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009504 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009505
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009506 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009507 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009508}
9509
Douglas Katzman95354292015-06-23 20:42:09 +00009510void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9511 const InputInfo &Output,
9512 const InputInfoList &Inputs,
9513 const ArgList &Args,
9514 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009515 const Driver &D = getToolChain().getDriver();
9516 ArgStringList CmdArgs;
9517
Daniel Dunbarb440f562010-08-02 02:38:21 +00009518 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009519 CmdArgs.push_back("-o");
9520 CmdArgs.push_back(Output.getFilename());
9521 } else {
9522 assert(Output.isNothing() && "Invalid output.");
9523 }
9524
Douglas Katzman78b37b02015-11-17 20:28:07 +00009525 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009526 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9527 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9528 CmdArgs.push_back(
9529 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9530 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009531 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009532
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009533 Args.AddAllArgs(CmdArgs,
9534 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009535
Daniel Dunbar54423b22010-09-17 00:24:54 +00009536 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009537
Xinliang David Li69306c02015-10-22 06:15:31 +00009538 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009539
Douglas Katzman78b37b02015-11-17 20:28:07 +00009540 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009541 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009542 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009543 CmdArgs.push_back("-lm");
9544 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009545 }
9546
Douglas Katzman78b37b02015-11-17 20:28:07 +00009547 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009548 if (Args.hasArg(options::OPT_pthread))
9549 CmdArgs.push_back("-lpthread");
9550 CmdArgs.push_back("-lc");
9551 CmdArgs.push_back("-lCompilerRT-Generic");
9552 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9553 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009554 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009555 }
9556
Logan Chieneb9162f2014-06-26 14:23:45 +00009557 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009558 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009559}
9560
Daniel Dunbarcc912342009-05-02 18:28:39 +00009561/// DragonFly Tools
9562
9563// For now, DragonFly Assemble does just about the same as for
9564// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009565void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9566 const InputInfo &Output,
9567 const InputInfoList &Inputs,
9568 const ArgList &Args,
9569 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009570 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009571 ArgStringList CmdArgs;
9572
9573 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9574 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009575 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009576 CmdArgs.push_back("--32");
9577
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009578 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009579
9580 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009581 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009582
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009583 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009584 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009586 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009587 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009588}
9589
Douglas Katzman95354292015-06-23 20:42:09 +00009590void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9591 const InputInfo &Output,
9592 const InputInfoList &Inputs,
9593 const ArgList &Args,
9594 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009595 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009596 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009597
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009598 if (!D.SysRoot.empty())
9599 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9600
John McCall65b8da02013-04-11 22:55:55 +00009601 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009602 if (Args.hasArg(options::OPT_static)) {
9603 CmdArgs.push_back("-Bstatic");
9604 } else {
John McCall65b8da02013-04-11 22:55:55 +00009605 if (Args.hasArg(options::OPT_rdynamic))
9606 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009607 if (Args.hasArg(options::OPT_shared))
9608 CmdArgs.push_back("-Bshareable");
9609 else {
9610 CmdArgs.push_back("-dynamic-linker");
9611 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9612 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009613 CmdArgs.push_back("--hash-style=gnu");
9614 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009615 }
9616
9617 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9618 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009619 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009620 CmdArgs.push_back("-m");
9621 CmdArgs.push_back("elf_i386");
9622 }
9623
Daniel Dunbarb440f562010-08-02 02:38:21 +00009624 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009625 CmdArgs.push_back("-o");
9626 CmdArgs.push_back(Output.getFilename());
9627 } else {
9628 assert(Output.isNothing() && "Invalid output.");
9629 }
9630
Douglas Katzman78b37b02015-11-17 20:28:07 +00009631 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009632 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009633 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009634 CmdArgs.push_back(
9635 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009636 else {
9637 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009638 CmdArgs.push_back(
9639 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009640 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009641 CmdArgs.push_back(
9642 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009643 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009644 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009645 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009646 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009647 CmdArgs.push_back(
9648 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009649 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009650 CmdArgs.push_back(
9651 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009652 }
9653
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009654 Args.AddAllArgs(CmdArgs,
9655 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009656
Daniel Dunbar54423b22010-09-17 00:24:54 +00009657 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009658
Douglas Katzman78b37b02015-11-17 20:28:07 +00009659 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009660 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009661
9662 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009663 CmdArgs.push_back("-rpath");
9664 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009665 }
9666
Hans Wennborg70850d82013-07-18 20:29:38 +00009667 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009668 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009669 CmdArgs.push_back("-lm");
9670 }
9671
Daniel Dunbarcc912342009-05-02 18:28:39 +00009672 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009673 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009674
9675 if (!Args.hasArg(options::OPT_nolibc)) {
9676 CmdArgs.push_back("-lc");
9677 }
9678
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009679 if (Args.hasArg(options::OPT_static) ||
9680 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009681 CmdArgs.push_back("-lgcc");
9682 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009683 } else {
9684 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009685 CmdArgs.push_back("-lgcc_pic");
9686 if (!Args.hasArg(options::OPT_shared))
9687 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009688 } else {
John McCall65b8da02013-04-11 22:55:55 +00009689 CmdArgs.push_back("-lgcc");
9690 CmdArgs.push_back("--as-needed");
9691 CmdArgs.push_back("-lgcc_pic");
9692 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009693 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009694 }
9695 }
9696
Douglas Katzman78b37b02015-11-17 20:28:07 +00009697 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009698 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009699 CmdArgs.push_back(
9700 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009701 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009702 CmdArgs.push_back(
9703 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9704 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009705 }
9706
Xinliang David Li69306c02015-10-22 06:15:31 +00009707 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009708
Logan Chieneb9162f2014-06-26 14:23:45 +00009709 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009710 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009711}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009712
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009713// Try to find Exe from a Visual Studio distribution. This first tries to find
9714// an installed copy of Visual Studio and, failing that, looks in the PATH,
9715// making sure that whatever executable that's found is not a same-named exe
9716// from clang itself to prevent clang from falling back to itself.
9717static std::string FindVisualStudioExecutable(const ToolChain &TC,
9718 const char *Exe,
9719 const char *ClangProgramPath) {
9720 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9721 std::string visualStudioBinDir;
9722 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9723 visualStudioBinDir)) {
9724 SmallString<128> FilePath(visualStudioBinDir);
9725 llvm::sys::path::append(FilePath, Exe);
9726 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9727 return FilePath.str();
9728 }
9729
9730 return Exe;
9731}
9732
Douglas Katzman95354292015-06-23 20:42:09 +00009733void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9734 const InputInfo &Output,
9735 const InputInfoList &Inputs,
9736 const ArgList &Args,
9737 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009738 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009739 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009740
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009741 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9742 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009743 CmdArgs.push_back(
9744 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009745
Douglas Katzman78b37b02015-11-17 20:28:07 +00009746 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9747 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009748 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009749
Zachary Turner10d75b22014-10-22 20:40:43 +00009750 if (!llvm::sys::Process::GetEnv("LIB")) {
9751 // If the VC environment hasn't been configured (perhaps because the user
9752 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009753 // the environment variable is set however, assume the user knows what
9754 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009755 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009756 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009757 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9758 SmallString<128> LibDir(VisualStudioDir);
9759 llvm::sys::path::append(LibDir, "VC", "lib");
9760 switch (MSVC.getArch()) {
9761 case llvm::Triple::x86:
9762 // x86 just puts the libraries directly in lib
9763 break;
9764 case llvm::Triple::x86_64:
9765 llvm::sys::path::append(LibDir, "amd64");
9766 break;
9767 case llvm::Triple::arm:
9768 llvm::sys::path::append(LibDir, "arm");
9769 break;
9770 default:
9771 break;
9772 }
9773 CmdArgs.push_back(
9774 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009775
9776 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9777 std::string UniversalCRTLibPath;
9778 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9779 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9780 UniversalCRTLibPath.c_str()));
9781 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009782 }
9783
9784 std::string WindowsSdkLibPath;
9785 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9786 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9787 WindowsSdkLibPath.c_str()));
9788 }
9789
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009790 CmdArgs.push_back("-nologo");
9791
Reid Kleckner124955a2015-08-05 18:51:13 +00009792 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009793 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009794
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009795 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009796 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009797 if (DLL) {
9798 CmdArgs.push_back(Args.MakeArgString("-dll"));
9799
9800 SmallString<128> ImplibName(Output.getFilename());
9801 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009802 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009803 }
9804
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009805 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009806 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009807 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009808 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009809 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9810 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009811 // Make sure the dynamic runtime thunk is not optimized out at link time
9812 // to ensure proper SEH handling.
9813 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009814 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009815 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009816 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009817 for (const auto &Lib : {"asan", "asan_cxx"})
9818 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009819 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009820 }
9821
Hans Wennborg2e274592013-08-13 23:38:57 +00009822 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009823
Alexey Bataevc7e84352015-08-19 04:49:01 +00009824 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9825 options::OPT_fno_openmp, false)) {
9826 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9827 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9828 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9829 TC.getDriver().Dir + "/../lib"));
9830 switch (getOpenMPRuntime(getToolChain(), Args)) {
9831 case OMPRT_OMP:
9832 CmdArgs.push_back("-defaultlib:libomp.lib");
9833 break;
9834 case OMPRT_IOMP5:
9835 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9836 break;
9837 case OMPRT_GOMP:
9838 break;
9839 case OMPRT_Unknown:
9840 // Already diagnosed.
9841 break;
9842 }
9843 }
9844
Andrey Turetskiya4868572016-03-14 11:19:43 +00009845 // Add compiler-rt lib in case if it was explicitly
9846 // specified as an argument for --rtlib option.
9847 if (!Args.hasArg(options::OPT_nostdlib)) {
9848 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9849 }
9850
Reid Kleckner337188f2014-09-16 19:22:00 +00009851 // Add filenames, libraries, and other linker inputs.
9852 for (const auto &Input : Inputs) {
9853 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009854 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009855 continue;
9856 }
9857
9858 const Arg &A = Input.getInputArg();
9859
9860 // Render -l options differently for the MSVC linker.
9861 if (A.getOption().matches(options::OPT_l)) {
9862 StringRef Lib = A.getValue();
9863 const char *LinkLibArg;
9864 if (Lib.endswith(".lib"))
9865 LinkLibArg = Args.MakeArgString(Lib);
9866 else
9867 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9868 CmdArgs.push_back(LinkLibArg);
9869 continue;
9870 }
9871
9872 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9873 // or -L. Render it, even if MSVC doesn't understand it.
9874 A.renderAsInput(Args, CmdArgs);
9875 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009876
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009877 TC.addProfileRTLibs(Args, CmdArgs);
9878
Zachary Turner719f58c2014-12-01 23:06:47 +00009879 // We need to special case some linker paths. In the case of lld, we need to
9880 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9881 // linker, we need to use a special search algorithm.
9882 llvm::SmallString<128> linkPath;
9883 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9884 if (Linker.equals_lower("lld"))
9885 Linker = "lld-link";
9886
9887 if (Linker.equals_lower("link")) {
9888 // If we're using the MSVC linker, it's not sufficient to just use link
9889 // from the program PATH, because other environments like GnuWin32 install
9890 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009891 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009892 C.getDriver().getClangProgramPath());
9893 } else {
9894 linkPath = Linker;
9895 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009896 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009897 }
9898
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009899 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009900 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009901}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009902
Douglas Katzman95354292015-06-23 20:42:09 +00009903void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9904 const InputInfo &Output,
9905 const InputInfoList &Inputs,
9906 const ArgList &Args,
9907 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009908 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9909}
9910
Douglas Katzman95354292015-06-23 20:42:09 +00009911std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009912 Compilation &C, const JobAction &JA, const InputInfo &Output,
9913 const InputInfoList &Inputs, const ArgList &Args,
9914 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009915 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009916 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009917 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009918 CmdArgs.push_back("/W0"); // No warnings.
9919
9920 // The goal is to be able to invoke this tool correctly based on
9921 // any flag accepted by clang-cl.
9922
9923 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009924 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009925
9926 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009927 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9928 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9929 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009930 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9931 if (A->getOption().getID() == options::OPT_O0) {
9932 CmdArgs.push_back("/Od");
9933 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009934 CmdArgs.push_back("/Og");
9935
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009936 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009937 if (OptLevel == "s" || OptLevel == "z")
9938 CmdArgs.push_back("/Os");
9939 else
9940 CmdArgs.push_back("/Ot");
9941
9942 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009943 }
9944 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009945 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9946 options::OPT_fno_omit_frame_pointer))
9947 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9948 ? "/Oy"
9949 : "/Oy-");
9950 if (!Args.hasArg(options::OPT_fwritable_strings))
9951 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009952
Nico Weber3f8dafb2015-03-12 19:37:10 +00009953 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009954 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9955
David Majnemerf6072342014-07-01 22:24:56 +00009956 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9957 /*default=*/false))
9958 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009959 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9960 options::OPT_fno_function_sections))
9961 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9962 ? "/Gy"
9963 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009964 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9965 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009966 CmdArgs.push_back(
9967 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009968 if (Args.hasArg(options::OPT_fsyntax_only))
9969 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009970 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9971 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009972 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009973
Nico Weber3f8dafb2015-03-12 19:37:10 +00009974 std::vector<std::string> Includes =
9975 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009976 for (const auto &Include : Includes)
9977 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009978
Hans Wennborg87cfa712013-09-19 20:32:16 +00009979 // Flags that can simply be passed through.
9980 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9981 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009982 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9983 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009984 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009985 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009986
9987 // The order of these flags is relevant, so pick the last one.
9988 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9989 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9990 A->render(Args, CmdArgs);
9991
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009992 // Pass through all unknown arguments so that the fallback command can see
9993 // them too.
9994 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9995
Hans Wennborg87cfa712013-09-19 20:32:16 +00009996 // Input filename.
9997 assert(Inputs.size() == 1);
9998 const InputInfo &II = Inputs[0];
9999 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10000 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10001 if (II.isFilename())
10002 CmdArgs.push_back(II.getFilename());
10003 else
10004 II.getInputArg().renderAsInput(Args, CmdArgs);
10005
10006 // Output filename.
10007 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010008 const char *Fo =
10009 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010010 CmdArgs.push_back(Fo);
10011
Hans Wennborg188382e2013-09-20 18:16:35 +000010012 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010013 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10014 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010015 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010016 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010017}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010018
Yaron Keren1c0070c2015-07-02 04:45:27 +000010019/// MinGW Tools
10020void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10021 const InputInfo &Output,
10022 const InputInfoList &Inputs,
10023 const ArgList &Args,
10024 const char *LinkingOutput) const {
10025 claimNoWarnArgs(Args);
10026 ArgStringList CmdArgs;
10027
10028 if (getToolChain().getArch() == llvm::Triple::x86) {
10029 CmdArgs.push_back("--32");
10030 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10031 CmdArgs.push_back("--64");
10032 }
10033
10034 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10035
10036 CmdArgs.push_back("-o");
10037 CmdArgs.push_back(Output.getFilename());
10038
10039 for (const auto &II : Inputs)
10040 CmdArgs.push_back(II.getFilename());
10041
10042 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010043 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010044
10045 if (Args.hasArg(options::OPT_gsplit_dwarf))
10046 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10047 SplitDebugName(Args, Inputs[0]));
10048}
10049
10050void MinGW::Linker::AddLibGCC(const ArgList &Args,
10051 ArgStringList &CmdArgs) const {
10052 if (Args.hasArg(options::OPT_mthreads))
10053 CmdArgs.push_back("-lmingwthrd");
10054 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010055
Yaron Kerenaa281332015-08-09 00:24:07 +000010056 // Make use of compiler-rt if --rtlib option is used
10057 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10058 if (RLT == ToolChain::RLT_Libgcc) {
10059 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10060 Args.hasArg(options::OPT_static);
10061 bool Shared = Args.hasArg(options::OPT_shared);
10062 bool CXX = getToolChain().getDriver().CCCIsCXX();
10063
10064 if (Static || (!CXX && !Shared)) {
10065 CmdArgs.push_back("-lgcc");
10066 CmdArgs.push_back("-lgcc_eh");
10067 } else {
10068 CmdArgs.push_back("-lgcc_s");
10069 CmdArgs.push_back("-lgcc");
10070 }
10071 } else {
10072 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10073 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010074
Yaron Keren1c0070c2015-07-02 04:45:27 +000010075 CmdArgs.push_back("-lmoldname");
10076 CmdArgs.push_back("-lmingwex");
10077 CmdArgs.push_back("-lmsvcrt");
10078}
10079
10080void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10081 const InputInfo &Output,
10082 const InputInfoList &Inputs,
10083 const ArgList &Args,
10084 const char *LinkingOutput) const {
10085 const ToolChain &TC = getToolChain();
10086 const Driver &D = TC.getDriver();
10087 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10088
10089 ArgStringList CmdArgs;
10090
10091 // Silence warning for "clang -g foo.o -o foo"
10092 Args.ClaimAllArgs(options::OPT_g_Group);
10093 // and "clang -emit-llvm foo.o -o foo"
10094 Args.ClaimAllArgs(options::OPT_emit_llvm);
10095 // and for "clang -w foo.o -o foo". Other warning options are already
10096 // handled somewhere else.
10097 Args.ClaimAllArgs(options::OPT_w);
10098
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010099 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10100 if (LinkerName.equals_lower("lld")) {
10101 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010102 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010103 } else if (!LinkerName.equals_lower("ld")) {
10104 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010105 }
10106
Yaron Keren1c0070c2015-07-02 04:45:27 +000010107 if (!D.SysRoot.empty())
10108 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10109
10110 if (Args.hasArg(options::OPT_s))
10111 CmdArgs.push_back("-s");
10112
10113 CmdArgs.push_back("-m");
10114 if (TC.getArch() == llvm::Triple::x86)
10115 CmdArgs.push_back("i386pe");
10116 if (TC.getArch() == llvm::Triple::x86_64)
10117 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010118 if (TC.getArch() == llvm::Triple::arm)
10119 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010120
10121 if (Args.hasArg(options::OPT_mwindows)) {
10122 CmdArgs.push_back("--subsystem");
10123 CmdArgs.push_back("windows");
10124 } else if (Args.hasArg(options::OPT_mconsole)) {
10125 CmdArgs.push_back("--subsystem");
10126 CmdArgs.push_back("console");
10127 }
10128
10129 if (Args.hasArg(options::OPT_static))
10130 CmdArgs.push_back("-Bstatic");
10131 else {
10132 if (Args.hasArg(options::OPT_mdll))
10133 CmdArgs.push_back("--dll");
10134 else if (Args.hasArg(options::OPT_shared))
10135 CmdArgs.push_back("--shared");
10136 CmdArgs.push_back("-Bdynamic");
10137 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10138 CmdArgs.push_back("-e");
10139 if (TC.getArch() == llvm::Triple::x86)
10140 CmdArgs.push_back("_DllMainCRTStartup@12");
10141 else
10142 CmdArgs.push_back("DllMainCRTStartup");
10143 CmdArgs.push_back("--enable-auto-image-base");
10144 }
10145 }
10146
10147 CmdArgs.push_back("-o");
10148 CmdArgs.push_back(Output.getFilename());
10149
10150 Args.AddAllArgs(CmdArgs, options::OPT_e);
10151 // FIXME: add -N, -n flags
10152 Args.AddLastArg(CmdArgs, options::OPT_r);
10153 Args.AddLastArg(CmdArgs, options::OPT_s);
10154 Args.AddLastArg(CmdArgs, options::OPT_t);
10155 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10156 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10157
Douglas Katzman78b37b02015-11-17 20:28:07 +000010158 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010159 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10160 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10161 } else {
10162 if (Args.hasArg(options::OPT_municode))
10163 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10164 else
10165 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10166 }
10167 if (Args.hasArg(options::OPT_pg))
10168 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10169 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10170 }
10171
10172 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010173 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010174 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10175
10176 // TODO: Add ASan stuff here
10177
10178 // TODO: Add profile stuff here
10179
Douglas Katzman78b37b02015-11-17 20:28:07 +000010180 if (D.CCCIsCXX() &&
10181 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010182 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10183 !Args.hasArg(options::OPT_static);
10184 if (OnlyLibstdcxxStatic)
10185 CmdArgs.push_back("-Bstatic");
10186 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10187 if (OnlyLibstdcxxStatic)
10188 CmdArgs.push_back("-Bdynamic");
10189 }
10190
10191 if (!Args.hasArg(options::OPT_nostdlib)) {
10192 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10193 if (Args.hasArg(options::OPT_static))
10194 CmdArgs.push_back("--start-group");
10195
10196 if (Args.hasArg(options::OPT_fstack_protector) ||
10197 Args.hasArg(options::OPT_fstack_protector_strong) ||
10198 Args.hasArg(options::OPT_fstack_protector_all)) {
10199 CmdArgs.push_back("-lssp_nonshared");
10200 CmdArgs.push_back("-lssp");
10201 }
10202 if (Args.hasArg(options::OPT_fopenmp))
10203 CmdArgs.push_back("-lgomp");
10204
10205 AddLibGCC(Args, CmdArgs);
10206
10207 if (Args.hasArg(options::OPT_pg))
10208 CmdArgs.push_back("-lgmon");
10209
Yaron Kerenadce68e2015-07-06 18:52:19 +000010210 if (Args.hasArg(options::OPT_pthread))
10211 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010212
10213 // add system libraries
10214 if (Args.hasArg(options::OPT_mwindows)) {
10215 CmdArgs.push_back("-lgdi32");
10216 CmdArgs.push_back("-lcomdlg32");
10217 }
10218 CmdArgs.push_back("-ladvapi32");
10219 CmdArgs.push_back("-lshell32");
10220 CmdArgs.push_back("-luser32");
10221 CmdArgs.push_back("-lkernel32");
10222
10223 if (Args.hasArg(options::OPT_static))
10224 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010225 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010226 AddLibGCC(Args, CmdArgs);
10227 }
10228
10229 if (!Args.hasArg(options::OPT_nostartfiles)) {
10230 // Add crtfastmath.o if available and fast math is enabled.
10231 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10232
10233 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10234 }
10235 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010236 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010237 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010238}
10239
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010240/// XCore Tools
10241// We pass assemble and link construction to the xcc tool.
10242
Douglas Katzman95354292015-06-23 20:42:09 +000010243void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10244 const InputInfo &Output,
10245 const InputInfoList &Inputs,
10246 const ArgList &Args,
10247 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010248 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010249 ArgStringList CmdArgs;
10250
10251 CmdArgs.push_back("-o");
10252 CmdArgs.push_back(Output.getFilename());
10253
10254 CmdArgs.push_back("-c");
10255
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010256 if (Args.hasArg(options::OPT_v))
10257 CmdArgs.push_back("-v");
10258
Robert Lytton894d25c2014-05-02 09:33:25 +000010259 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10260 if (!A->getOption().matches(options::OPT_g0))
10261 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010262
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010263 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10264 false))
10265 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010266
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010267 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010268
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010269 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010270 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010271
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010272 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010273 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010274}
10275
Douglas Katzman95354292015-06-23 20:42:09 +000010276void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10277 const InputInfo &Output,
10278 const InputInfoList &Inputs,
10279 const ArgList &Args,
10280 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010281 ArgStringList CmdArgs;
10282
10283 if (Output.isFilename()) {
10284 CmdArgs.push_back("-o");
10285 CmdArgs.push_back(Output.getFilename());
10286 } else {
10287 assert(Output.isNothing() && "Invalid output.");
10288 }
10289
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010290 if (Args.hasArg(options::OPT_v))
10291 CmdArgs.push_back("-v");
10292
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010293 // Pass -fexceptions through to the linker if it was present.
10294 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10295 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010296 CmdArgs.push_back("-fexceptions");
10297
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010298 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10299
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010300 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010301 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010302}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010303
Douglas Katzman95354292015-06-23 20:42:09 +000010304void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10305 const InputInfo &Output,
10306 const InputInfoList &Inputs,
10307 const ArgList &Args,
10308 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010309 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010310 const auto &TC =
10311 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10312 ArgStringList CmdArgs;
10313 const char *Exec;
10314
10315 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010316 default:
10317 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010318 case llvm::Triple::arm:
10319 case llvm::Triple::thumb:
10320 break;
10321 case llvm::Triple::x86:
10322 CmdArgs.push_back("--32");
10323 break;
10324 case llvm::Triple::x86_64:
10325 CmdArgs.push_back("--64");
10326 break;
10327 }
10328
10329 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10330
10331 CmdArgs.push_back("-o");
10332 CmdArgs.push_back(Output.getFilename());
10333
10334 for (const auto &Input : Inputs)
10335 CmdArgs.push_back(Input.getFilename());
10336
10337 const std::string Assembler = TC.GetProgramPath("as");
10338 Exec = Args.MakeArgString(Assembler);
10339
Justin Bognerd3371d82015-07-17 03:35:54 +000010340 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010341}
10342
Douglas Katzman95354292015-06-23 20:42:09 +000010343void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10344 const InputInfo &Output,
10345 const InputInfoList &Inputs,
10346 const ArgList &Args,
10347 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010348 const auto &TC =
10349 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10350 const llvm::Triple &T = TC.getTriple();
10351 const Driver &D = TC.getDriver();
10352 SmallString<128> EntryPoint;
10353 ArgStringList CmdArgs;
10354 const char *Exec;
10355
10356 // Silence warning for "clang -g foo.o -o foo"
10357 Args.ClaimAllArgs(options::OPT_g_Group);
10358 // and "clang -emit-llvm foo.o -o foo"
10359 Args.ClaimAllArgs(options::OPT_emit_llvm);
10360 // and for "clang -w foo.o -o foo"
10361 Args.ClaimAllArgs(options::OPT_w);
10362 // Other warning options are already handled somewhere else.
10363
10364 if (!D.SysRoot.empty())
10365 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10366
10367 if (Args.hasArg(options::OPT_pie))
10368 CmdArgs.push_back("-pie");
10369 if (Args.hasArg(options::OPT_rdynamic))
10370 CmdArgs.push_back("-export-dynamic");
10371 if (Args.hasArg(options::OPT_s))
10372 CmdArgs.push_back("--strip-all");
10373
10374 CmdArgs.push_back("-m");
10375 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010376 default:
10377 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010378 case llvm::Triple::arm:
10379 case llvm::Triple::thumb:
10380 // FIXME: this is incorrect for WinCE
10381 CmdArgs.push_back("thumb2pe");
10382 break;
10383 case llvm::Triple::x86:
10384 CmdArgs.push_back("i386pe");
10385 EntryPoint.append("_");
10386 break;
10387 case llvm::Triple::x86_64:
10388 CmdArgs.push_back("i386pep");
10389 break;
10390 }
10391
10392 if (Args.hasArg(options::OPT_shared)) {
10393 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010394 default:
10395 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010396 case llvm::Triple::arm:
10397 case llvm::Triple::thumb:
10398 case llvm::Triple::x86_64:
10399 EntryPoint.append("_DllMainCRTStartup");
10400 break;
10401 case llvm::Triple::x86:
10402 EntryPoint.append("_DllMainCRTStartup@12");
10403 break;
10404 }
10405
10406 CmdArgs.push_back("-shared");
10407 CmdArgs.push_back("-Bdynamic");
10408
10409 CmdArgs.push_back("--enable-auto-image-base");
10410
10411 CmdArgs.push_back("--entry");
10412 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10413 } else {
10414 EntryPoint.append("mainCRTStartup");
10415
10416 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10417 : "-Bdynamic");
10418
Douglas Katzman78b37b02015-11-17 20:28:07 +000010419 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010420 CmdArgs.push_back("--entry");
10421 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10422 }
10423
10424 // FIXME: handle subsystem
10425 }
10426
10427 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010428 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010429
10430 CmdArgs.push_back("-o");
10431 CmdArgs.push_back(Output.getFilename());
10432
10433 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10434 SmallString<261> ImpLib(Output.getFilename());
10435 llvm::sys::path::replace_extension(ImpLib, ".lib");
10436
10437 CmdArgs.push_back("--out-implib");
10438 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10439 }
10440
Douglas Katzman78b37b02015-11-17 20:28:07 +000010441 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010442 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10443 const char *CRTBegin;
10444
10445 CRTBegin =
10446 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10447 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10448 }
10449
10450 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010451 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010452 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10453
10454 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10455 !Args.hasArg(options::OPT_nodefaultlibs)) {
10456 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10457 !Args.hasArg(options::OPT_static);
10458 if (StaticCXX)
10459 CmdArgs.push_back("-Bstatic");
10460 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10461 if (StaticCXX)
10462 CmdArgs.push_back("-Bdynamic");
10463 }
10464
10465 if (!Args.hasArg(options::OPT_nostdlib)) {
10466 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10467 // TODO handle /MT[d] /MD[d]
10468 CmdArgs.push_back("-lmsvcrt");
10469 AddRunTimeLibs(TC, D, CmdArgs, Args);
10470 }
10471 }
10472
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010473 if (TC.getSanitizerArgs().needsAsanRt()) {
10474 // TODO handle /MT[d] /MD[d]
10475 if (Args.hasArg(options::OPT_shared)) {
10476 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10477 } else {
10478 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10479 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10480 // Make sure the dynamic runtime thunk is not optimized out at link time
10481 // to ensure proper SEH handling.
10482 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10483 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10484 ? "___asan_seh_interceptor"
10485 : "__asan_seh_interceptor"));
10486 }
10487 }
10488
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010489 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010490
Justin Bognerd3371d82015-07-17 03:35:54 +000010491 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010492}
Douglas Katzman84a75642015-06-19 14:55:19 +000010493
Douglas Katzman95354292015-06-23 20:42:09 +000010494void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10495 const InputInfo &Output,
10496 const InputInfoList &Inputs,
10497 const ArgList &Args,
10498 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010499 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010500 assert(Inputs.size() == 1);
10501 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010502 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10503 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010504
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010505 if (JA.getKind() == Action::PreprocessJobClass) {
10506 Args.ClaimAllArgs();
10507 CmdArgs.push_back("-E");
10508 } else {
10509 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10510 CmdArgs.push_back("-S");
10511 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10512 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010513 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010514
Douglas Katzmanf6071112015-08-03 14:34:22 +000010515 // Append all -I, -iquote, -isystem paths, defines/undefines,
10516 // 'f' flags, optimize flags, and warning options.
10517 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010518 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010519 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010520 options::OPT_f_Group, options::OPT_f_clang_Group,
10521 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010522 options::OPT_O_Group, options::OPT_W_Group,
10523 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010524
10525 // If we're producing a dependency file, and assembly is the final action,
10526 // then the name of the target in the dependency file should be the '.o'
10527 // file, not the '.s' file produced by this step. For example, instead of
10528 // /tmp/mumble.s: mumble.c .../someheader.h
10529 // the filename on the lefthand side should be "mumble.o"
10530 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10531 C.getActions().size() == 1 &&
10532 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10533 Arg *A = Args.getLastArg(options::OPT_o);
10534 if (A) {
10535 CmdArgs.push_back("-MT");
10536 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10537 }
10538 }
10539
Douglas Katzman84a75642015-06-19 14:55:19 +000010540 CmdArgs.push_back(II.getFilename());
10541 CmdArgs.push_back("-o");
10542 CmdArgs.push_back(Output.getFilename());
10543
10544 std::string Exec =
10545 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010546 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10547 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010548}
10549
Douglas Katzman95354292015-06-23 20:42:09 +000010550void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10551 const InputInfo &Output,
10552 const InputInfoList &Inputs,
10553 const ArgList &Args,
10554 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010555 ArgStringList CmdArgs;
10556
10557 assert(Inputs.size() == 1);
10558 const InputInfo &II = Inputs[0];
10559 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10560 assert(Output.getType() == types::TY_Object);
10561
10562 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010563 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10564 if (CPUArg)
10565 CmdArgs.push_back(
10566 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010567 CmdArgs.push_back("-noSPrefixing");
10568 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010569 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10570 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10571 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010572 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010573 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010574 }
10575 CmdArgs.push_back("-elf"); // Output format.
10576 CmdArgs.push_back(II.getFilename());
10577 CmdArgs.push_back(
10578 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10579
10580 std::string Exec =
10581 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010582 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10583 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010584}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010585
10586void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10587 const InputInfo &Output,
10588 const InputInfoList &Inputs,
10589 const ArgList &Args,
10590 const char *LinkingOutput) const {
10591 const auto &TC =
10592 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10593 const llvm::Triple &T = TC.getTriple();
10594 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010595 bool UseStartfiles =
10596 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010597 bool UseDefaultLibs =
10598 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010599
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010600 if (T.getArch() == llvm::Triple::sparc)
10601 CmdArgs.push_back("-EB");
10602 else // SHAVE assumes little-endian, and sparcel is expressly so.
10603 CmdArgs.push_back("-EL");
10604
10605 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10606 // but we never pass through a --sysroot option and various other bits.
10607 // For example, there are no sanitizers (yet) nor gold linker.
10608
10609 // Eat some arguments that may be present but have no effect.
10610 Args.ClaimAllArgs(options::OPT_g_Group);
10611 Args.ClaimAllArgs(options::OPT_w);
10612 Args.ClaimAllArgs(options::OPT_static_libgcc);
10613
10614 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10615 CmdArgs.push_back("-s");
10616
10617 CmdArgs.push_back("-o");
10618 CmdArgs.push_back(Output.getFilename());
10619
10620 if (UseStartfiles) {
10621 // If you want startfiles, it means you want the builtin crti and crtbegin,
10622 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010623 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10624 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010625 }
10626
10627 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10628 options::OPT_e, options::OPT_s, options::OPT_t,
10629 options::OPT_Z_Flag, options::OPT_r});
10630
Douglas Katzman674a3122015-11-18 16:24:46 +000010631 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010632
10633 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10634
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010635 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010636 if (C.getDriver().CCCIsCXX())
10637 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010638 if (T.getOS() == llvm::Triple::RTEMS) {
10639 CmdArgs.push_back("--start-group");
10640 CmdArgs.push_back("-lc");
10641 // You must provide your own "-L" option to enable finding these.
10642 CmdArgs.push_back("-lrtemscpu");
10643 CmdArgs.push_back("-lrtemsbsp");
10644 CmdArgs.push_back("--end-group");
10645 } else {
10646 CmdArgs.push_back("-lc");
10647 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010648 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010649 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010650 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010651 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10652 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010653 }
10654
10655 std::string Exec =
10656 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10657 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10658 CmdArgs, Inputs));
10659}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010660
10661void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10662 const InputInfo &Output,
10663 const InputInfoList &Inputs,
10664 const ArgList &Args,
10665 const char *LinkingOutput) const {
10666 claimNoWarnArgs(Args);
10667 ArgStringList CmdArgs;
10668
10669 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10670
10671 CmdArgs.push_back("-o");
10672 CmdArgs.push_back(Output.getFilename());
10673
10674 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10675 const InputInfo &Input = Inputs[0];
10676 assert(Input.isFilename() && "Invalid input.");
10677 CmdArgs.push_back(Input.getFilename());
10678
10679 const char *Exec =
10680 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10681 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10682}
10683
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010684static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10685 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10686 if (SanArgs.needsUbsanRt()) {
10687 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10688 }
10689 if (SanArgs.needsAsanRt()) {
10690 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10691 }
10692}
10693
10694static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10695 const JobAction &JA, const InputInfo &Output,
10696 const InputInfoList &Inputs,
10697 const ArgList &Args,
10698 const char *LinkingOutput) {
10699 const toolchains::FreeBSD &ToolChain =
10700 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10701 const Driver &D = ToolChain.getDriver();
10702 ArgStringList CmdArgs;
10703
10704 // Silence warning for "clang -g foo.o -o foo"
10705 Args.ClaimAllArgs(options::OPT_g_Group);
10706 // and "clang -emit-llvm foo.o -o foo"
10707 Args.ClaimAllArgs(options::OPT_emit_llvm);
10708 // and for "clang -w foo.o -o foo". Other warning options are already
10709 // handled somewhere else.
10710 Args.ClaimAllArgs(options::OPT_w);
10711
10712 if (!D.SysRoot.empty())
10713 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10714
10715 if (Args.hasArg(options::OPT_pie))
10716 CmdArgs.push_back("-pie");
10717
10718 if (Args.hasArg(options::OPT_rdynamic))
10719 CmdArgs.push_back("-export-dynamic");
10720 if (Args.hasArg(options::OPT_shared))
10721 CmdArgs.push_back("--oformat=so");
10722
10723 if (Output.isFilename()) {
10724 CmdArgs.push_back("-o");
10725 CmdArgs.push_back(Output.getFilename());
10726 } else {
10727 assert(Output.isNothing() && "Invalid output.");
10728 }
10729
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010730 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10731
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010732 Args.AddAllArgs(CmdArgs, options::OPT_L);
10733 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10734 Args.AddAllArgs(CmdArgs, options::OPT_e);
10735 Args.AddAllArgs(CmdArgs, options::OPT_s);
10736 Args.AddAllArgs(CmdArgs, options::OPT_t);
10737 Args.AddAllArgs(CmdArgs, options::OPT_r);
10738
10739 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10740 CmdArgs.push_back("--no-demangle");
10741
10742 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10743
10744 if (Args.hasArg(options::OPT_pthread)) {
10745 CmdArgs.push_back("-lpthread");
10746 }
10747
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010748 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10749
10750 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10751}
10752
10753static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10754 const JobAction &JA, const InputInfo &Output,
10755 const InputInfoList &Inputs,
10756 const ArgList &Args,
10757 const char *LinkingOutput) {
10758 const toolchains::FreeBSD &ToolChain =
10759 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10760 const Driver &D = ToolChain.getDriver();
10761 ArgStringList CmdArgs;
10762
10763 // Silence warning for "clang -g foo.o -o foo"
10764 Args.ClaimAllArgs(options::OPT_g_Group);
10765 // and "clang -emit-llvm foo.o -o foo"
10766 Args.ClaimAllArgs(options::OPT_emit_llvm);
10767 // and for "clang -w foo.o -o foo". Other warning options are already
10768 // handled somewhere else.
10769 Args.ClaimAllArgs(options::OPT_w);
10770
10771 if (!D.SysRoot.empty())
10772 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10773
10774 if (Args.hasArg(options::OPT_pie))
10775 CmdArgs.push_back("-pie");
10776
10777 if (Args.hasArg(options::OPT_static)) {
10778 CmdArgs.push_back("-Bstatic");
10779 } else {
10780 if (Args.hasArg(options::OPT_rdynamic))
10781 CmdArgs.push_back("-export-dynamic");
10782 CmdArgs.push_back("--eh-frame-hdr");
10783 if (Args.hasArg(options::OPT_shared)) {
10784 CmdArgs.push_back("-Bshareable");
10785 } else {
10786 CmdArgs.push_back("-dynamic-linker");
10787 CmdArgs.push_back("/libexec/ld-elf.so.1");
10788 }
10789 CmdArgs.push_back("--enable-new-dtags");
10790 }
10791
10792 if (Output.isFilename()) {
10793 CmdArgs.push_back("-o");
10794 CmdArgs.push_back(Output.getFilename());
10795 } else {
10796 assert(Output.isNothing() && "Invalid output.");
10797 }
10798
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010799 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10800
Douglas Katzman78b37b02015-11-17 20:28:07 +000010801 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010802 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010803 if (!Args.hasArg(options::OPT_shared)) {
10804 if (Args.hasArg(options::OPT_pg))
10805 crt1 = "gcrt1.o";
10806 else if (Args.hasArg(options::OPT_pie))
10807 crt1 = "Scrt1.o";
10808 else
10809 crt1 = "crt1.o";
10810 }
10811 if (crt1)
10812 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10813
10814 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10815
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010816 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010817 if (Args.hasArg(options::OPT_static))
10818 crtbegin = "crtbeginT.o";
10819 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10820 crtbegin = "crtbeginS.o";
10821 else
10822 crtbegin = "crtbegin.o";
10823
10824 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10825 }
10826
10827 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010828 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010829 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10830 Args.AddAllArgs(CmdArgs, options::OPT_e);
10831 Args.AddAllArgs(CmdArgs, options::OPT_s);
10832 Args.AddAllArgs(CmdArgs, options::OPT_t);
10833 Args.AddAllArgs(CmdArgs, options::OPT_r);
10834
10835 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10836 CmdArgs.push_back("--no-demangle");
10837
10838 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10839
Douglas Katzman78b37b02015-11-17 20:28:07 +000010840 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010841 // For PS4, we always want to pass libm, libstdc++ and libkernel
10842 // libraries for both C and C++ compilations.
10843 CmdArgs.push_back("-lkernel");
10844 if (D.CCCIsCXX()) {
10845 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10846 if (Args.hasArg(options::OPT_pg))
10847 CmdArgs.push_back("-lm_p");
10848 else
10849 CmdArgs.push_back("-lm");
10850 }
10851 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10852 // the default system libraries. Just mimic this for now.
10853 if (Args.hasArg(options::OPT_pg))
10854 CmdArgs.push_back("-lgcc_p");
10855 else
10856 CmdArgs.push_back("-lcompiler_rt");
10857 if (Args.hasArg(options::OPT_static)) {
10858 CmdArgs.push_back("-lstdc++");
10859 } else if (Args.hasArg(options::OPT_pg)) {
10860 CmdArgs.push_back("-lgcc_eh_p");
10861 } else {
10862 CmdArgs.push_back("--as-needed");
10863 CmdArgs.push_back("-lstdc++");
10864 CmdArgs.push_back("--no-as-needed");
10865 }
10866
10867 if (Args.hasArg(options::OPT_pthread)) {
10868 if (Args.hasArg(options::OPT_pg))
10869 CmdArgs.push_back("-lpthread_p");
10870 else
10871 CmdArgs.push_back("-lpthread");
10872 }
10873
10874 if (Args.hasArg(options::OPT_pg)) {
10875 if (Args.hasArg(options::OPT_shared))
10876 CmdArgs.push_back("-lc");
10877 else {
10878 if (Args.hasArg(options::OPT_static)) {
10879 CmdArgs.push_back("--start-group");
10880 CmdArgs.push_back("-lc_p");
10881 CmdArgs.push_back("-lpthread_p");
10882 CmdArgs.push_back("--end-group");
10883 } else {
10884 CmdArgs.push_back("-lc_p");
10885 }
10886 }
10887 CmdArgs.push_back("-lgcc_p");
10888 } else {
10889 if (Args.hasArg(options::OPT_static)) {
10890 CmdArgs.push_back("--start-group");
10891 CmdArgs.push_back("-lc");
10892 CmdArgs.push_back("-lpthread");
10893 CmdArgs.push_back("--end-group");
10894 } else {
10895 CmdArgs.push_back("-lc");
10896 }
10897 CmdArgs.push_back("-lcompiler_rt");
10898 }
10899
10900 if (Args.hasArg(options::OPT_static)) {
10901 CmdArgs.push_back("-lstdc++");
10902 } else if (Args.hasArg(options::OPT_pg)) {
10903 CmdArgs.push_back("-lgcc_eh_p");
10904 } else {
10905 CmdArgs.push_back("--as-needed");
10906 CmdArgs.push_back("-lstdc++");
10907 CmdArgs.push_back("--no-as-needed");
10908 }
10909 }
10910
Douglas Katzman78b37b02015-11-17 20:28:07 +000010911 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010912 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10913 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10914 else
10915 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10916 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10917 }
10918
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010919 const char *Exec =
10920#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010921 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010922#else
10923 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10924#endif
10925
10926 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10927}
10928
10929void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10930 const InputInfo &Output,
10931 const InputInfoList &Inputs,
10932 const ArgList &Args,
10933 const char *LinkingOutput) const {
10934 const toolchains::FreeBSD &ToolChain =
10935 static_cast<const toolchains::FreeBSD &>(getToolChain());
10936 const Driver &D = ToolChain.getDriver();
10937 bool PS4Linker;
10938 StringRef LinkerOptName;
10939 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10940 LinkerOptName = A->getValue();
10941 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10942 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10943 }
10944
10945 if (LinkerOptName == "gold")
10946 PS4Linker = false;
10947 else if (LinkerOptName == "ps4")
10948 PS4Linker = true;
10949 else
10950 PS4Linker = !Args.hasArg(options::OPT_shared);
10951
10952 if (PS4Linker)
10953 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10954 else
10955 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10956}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010957
10958void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10959 const InputInfo &Output,
10960 const InputInfoList &Inputs,
10961 const ArgList &Args,
10962 const char *LinkingOutput) const {
10963 const auto &TC =
10964 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010965 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010966
10967 std::vector<std::string> gpu_archs =
10968 Args.getAllArgValues(options::OPT_march_EQ);
10969 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10970 const std::string& gpu_arch = gpu_archs[0];
10971
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010972 ArgStringList CmdArgs;
10973 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000010974 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
10975 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010976 // ptxas does not accept -g option if optimization is enabled, so
10977 // we ignore the compiler's -O* options if we want debug info.
10978 CmdArgs.push_back("-g");
10979 CmdArgs.push_back("--dont-merge-basicblocks");
10980 CmdArgs.push_back("--return-at-end");
10981 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10982 // Map the -O we received to -O{0,1,2,3}.
10983 //
10984 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10985 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010986
Justin Lebar2836dcd2016-01-19 19:52:21 +000010987 // -O3 seems like the least-bad option when -Osomething is specified to
10988 // clang but it isn't handled below.
10989 StringRef OOpt = "3";
10990 if (A->getOption().matches(options::OPT_O4) ||
10991 A->getOption().matches(options::OPT_Ofast))
10992 OOpt = "3";
10993 else if (A->getOption().matches(options::OPT_O0))
10994 OOpt = "0";
10995 else if (A->getOption().matches(options::OPT_O)) {
10996 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10997 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10998 .Case("1", "1")
10999 .Case("2", "2")
11000 .Case("3", "3")
11001 .Case("s", "2")
11002 .Case("z", "2")
11003 .Default("2");
11004 }
11005 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11006 } else {
11007 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11008 // to no optimizations, but ptxas's default is -O3.
11009 CmdArgs.push_back("-O0");
11010 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011011
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011012 CmdArgs.push_back("--gpu-name");
11013 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11014 CmdArgs.push_back("--output-file");
11015 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11016 for (const auto& II : Inputs)
11017 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11018
11019 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11020 CmdArgs.push_back(Args.MakeArgString(A));
11021
11022 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11023 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11024}
11025
11026// All inputs to this linker must be from CudaDeviceActions, as we need to look
11027// at the Inputs' Actions in order to figure out which GPU architecture they
11028// correspond to.
11029void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11030 const InputInfo &Output,
11031 const InputInfoList &Inputs,
11032 const ArgList &Args,
11033 const char *LinkingOutput) const {
11034 const auto &TC =
11035 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011036 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011037
11038 ArgStringList CmdArgs;
11039 CmdArgs.push_back("--cuda");
11040 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11041 CmdArgs.push_back(Args.MakeArgString("--create"));
11042 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11043
11044 for (const auto& II : Inputs) {
11045 auto* A = cast<const CudaDeviceAction>(II.getAction());
11046 // We need to pass an Arch of the form "sm_XX" for cubin files and
11047 // "compute_XX" for ptx.
11048 const char *Arch = (II.getType() == types::TY_PP_Asm)
11049 ? A->getComputeArchName()
11050 : A->getGpuArchName();
11051 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11052 Arch + ",file=" + II.getFilename()));
11053 }
11054
11055 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11056 CmdArgs.push_back(Args.MakeArgString(A));
11057
11058 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11059 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11060}