blob: 74bfc6ebde5ef18d132f20f1df9ac254913178f6 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000806 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000807 if (Triple.getOS() != llvm::Triple::UnknownOS ||
808 !Triple.isOSBinFormatMachO())
809 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000810 break;
811 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000812 }
813 }
814
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000815 assert(ABI != FloatABI::Invalid && "must select an ABI");
816 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000817}
818
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000819static void getARMTargetFeatures(const ToolChain &TC,
820 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000821 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000822 std::vector<const char *> &Features,
823 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824 const Driver &D = TC.getDriver();
825
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000826 bool KernelOrKext =
827 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000828 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000829 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
830 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
831
Nico Weber6e0ebae2015-04-29 21:16:40 +0000832 if (!ForAS) {
833 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
834 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
835 // stripped out by the ARM target. We should probably pass this a new
836 // -target-option, which is handled by the -cc1/-cc1as invocation.
837 //
838 // FIXME2: For consistency, it would be ideal if we set up the target
839 // machine state the same when using the frontend or the assembler. We don't
840 // currently do that for the assembler, we pass the options directly to the
841 // backend and never even instantiate the frontend TargetInfo. If we did,
842 // and used its handleTargetFeatures hook, then we could ensure the
843 // assembler and the frontend behave the same.
844
845 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000846 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000847 Features.push_back("+soft-float");
848
849 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000850 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000851 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000852 } else {
853 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
854 // to the assembler correctly.
855 for (const Arg *A :
856 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
857 StringRef Value = A->getValue();
858 if (Value.startswith("-mfpu=")) {
859 WaFPU = A;
860 } else if (Value.startswith("-mcpu=")) {
861 WaCPU = A;
862 } else if (Value.startswith("-mhwdiv=")) {
863 WaHDiv = A;
864 } else if (Value.startswith("-march=")) {
865 WaArch = A;
866 }
867 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000868 }
869
Renato Golin7c542b42015-07-27 23:44:45 +0000870 // Check -march. ClangAs gives preference to -Wa,-march=.
871 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000872 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000873 if (WaArch) {
874 if (ArchArg)
875 D.Diag(clang::diag::warn_drv_unused_argument)
876 << ArchArg->getAsString(Args);
877 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000878 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000879 // FIXME: Set Arch.
880 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
881 } else if (ArchArg) {
882 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000884 }
885
Renato Golin7c542b42015-07-27 23:44:45 +0000886 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
887 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000888 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000889 if (WaCPU) {
890 if (CPUArg)
891 D.Diag(clang::diag::warn_drv_unused_argument)
892 << CPUArg->getAsString(Args);
893 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000895 } else if (CPUArg) {
896 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000897 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000898 }
John Brawna95c1a82015-05-08 12:52:18 +0000899
Renato Golin23459c62015-07-30 16:40:17 +0000900 // Add CPU features for generic CPUs
901 if (CPUName == "native") {
902 llvm::StringMap<bool> HostFeatures;
903 if (llvm::sys::getHostCPUFeatures(HostFeatures))
904 for (auto &F : HostFeatures)
905 Features.push_back(
906 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
907 }
908
909 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
910 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
911 if (WaFPU) {
912 if (FPUArg)
913 D.Diag(clang::diag::warn_drv_unused_argument)
914 << FPUArg->getAsString(Args);
915 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
916 Features);
917 } else if (FPUArg) {
918 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
919 }
920
921 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
922 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
923 if (WaHDiv) {
924 if (HDivArg)
925 D.Diag(clang::diag::warn_drv_unused_argument)
926 << HDivArg->getAsString(Args);
927 getARMHWDivFeatures(D, WaHDiv, Args,
928 StringRef(WaHDiv->getValue()).substr(8), Features);
929 } else if (HDivArg)
930 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
931
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 // Setting -msoft-float effectively disables NEON because of the GCC
933 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000934 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000935 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000936 // Also need to explicitly disable features which imply NEON.
937 Features.push_back("-crypto");
938 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000939
Eric Christopher269c2a22015-04-04 03:34:43 +0000940 // En/disable crc code generation.
941 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000942 if (A->getOption().matches(options::OPT_mcrc))
943 Features.push_back("+crc");
944 else
945 Features.push_back("-crc");
946 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000947
Akira Hatanakac2694822015-07-07 08:28:42 +0000948 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
949 // neither options are specified, see if we are compiling for kernel/kext and
950 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000951 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
952 options::OPT_mno_long_calls)) {
953 if (A->getOption().matches(options::OPT_mlong_calls))
954 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000955 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
956 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000957 Features.push_back("+long-calls");
958 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000959
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000960 // Kernel code has more strict alignment requirements.
961 if (KernelOrKext)
962 Features.push_back("+strict-align");
963 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
964 options::OPT_munaligned_access)) {
965 if (A->getOption().matches(options::OPT_munaligned_access)) {
966 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
967 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
968 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000969 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
970 // access either.
971 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
972 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000973 } else
974 Features.push_back("+strict-align");
975 } else {
976 // Assume pre-ARMv6 doesn't support unaligned accesses.
977 //
978 // ARMv6 may or may not support unaligned accesses depending on the
979 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
980 // Darwin and NetBSD targets support unaligned accesses, and others don't.
981 //
982 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
983 // which raises an alignment fault on unaligned accesses. Linux
984 // defaults this bit to 0 and handles it as a system-wide (not
985 // per-process) setting. It is therefore safe to assume that ARMv7+
986 // Linux targets support unaligned accesses. The same goes for NaCl.
987 //
988 // The above behavior is consistent with GCC.
989 int VersionNum = getARMSubArchVersionNumber(Triple);
990 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000991 if (VersionNum < 6 ||
992 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000993 Features.push_back("+strict-align");
994 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
995 if (VersionNum < 7)
996 Features.push_back("+strict-align");
997 } else
998 Features.push_back("+strict-align");
999 }
1000
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001001 // llvm does not support reserving registers in general. There is support
1002 // for reserving r9 on ARM though (defined as a platform-specific register
1003 // in ARM EABI).
1004 if (Args.hasArg(options::OPT_ffixed_r9))
1005 Features.push_back("+reserve-r9");
1006
Dimitry Andric08107392016-01-06 07:42:18 +00001007 // The kext linker doesn't know how to deal with movw/movt.
1008 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001009 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001010}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001012void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1013 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001014 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001015 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001016 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001017 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001018 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001019 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001020 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001021 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001022 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001023 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001024 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001025 } else {
1026 ABIName = "apcs-gnu";
1027 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001028 } else if (Triple.isOSWindows()) {
1029 // FIXME: this is invalid for WindowsCE
1030 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001031 } else {
1032 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001034 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001035 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001036 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001037 ABIName = "aapcs-linux";
1038 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001039 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::EABI:
1041 ABIName = "aapcs";
1042 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001043 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001044 if (Triple.getOS() == llvm::Triple::NetBSD)
1045 ABIName = "apcs-gnu";
1046 else
1047 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001049 }
1050 }
1051 CmdArgs.push_back("-target-abi");
1052 CmdArgs.push_back(ABIName);
1053
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001055 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001056 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001057 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001058 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001059 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001060 CmdArgs.push_back("-mfloat-abi");
1061 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001062 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001064 CmdArgs.push_back("-mfloat-abi");
1065 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001066 } else {
1067 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001068 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001072
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1075 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001076 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001077 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 CmdArgs.push_back("-arm-global-merge=false");
1079 else
1080 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001081 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001082
Bob Wilson9c8af452013-04-11 18:53:25 +00001083 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001085 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001086}
Renato Goline17c5802015-07-27 23:44:42 +00001087// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001088
Tim Northover573cbee2014-05-24 12:52:07 +00001089/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1090/// targeting.
1091static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001092 Arg *A;
1093 std::string CPU;
1094 // If we have -mtune or -mcpu, use that.
1095 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001096 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001098 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001099 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001100 }
1101
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 // Handle CPU name is 'native'.
1103 if (CPU == "native")
1104 return llvm::sys::getHostCPUName();
1105 else if (CPU.size())
1106 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001107
James Molloy9b1586b2014-04-17 12:51:17 +00001108 // Make sure we pick "cyclone" if -arch is used.
1109 // FIXME: Should this be picked by checking the target triple instead?
1110 if (Args.getLastArg(options::OPT_arch))
1111 return "cyclone";
1112
1113 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001114}
1115
Tim Northover573cbee2014-05-24 12:52:07 +00001116void Clang::AddAArch64TargetArgs(const ArgList &Args,
1117 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001118 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1119 llvm::Triple Triple(TripleStr);
1120
1121 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1122 Args.hasArg(options::OPT_mkernel) ||
1123 Args.hasArg(options::OPT_fapple_kext))
1124 CmdArgs.push_back("-disable-red-zone");
1125
1126 if (!Args.hasFlag(options::OPT_mimplicit_float,
1127 options::OPT_mno_implicit_float, true))
1128 CmdArgs.push_back("-no-implicit-float");
1129
Craig Topper92fc2df2014-05-17 16:56:41 +00001130 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001131 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1132 ABIName = A->getValue();
1133 else if (Triple.isOSDarwin())
1134 ABIName = "darwinpcs";
1135 else
1136 ABIName = "aapcs";
1137
1138 CmdArgs.push_back("-target-abi");
1139 CmdArgs.push_back(ABIName);
1140
Bradley Smith9ff64332014-10-13 10:16:06 +00001141 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1142 options::OPT_mno_fix_cortex_a53_835769)) {
1143 CmdArgs.push_back("-backend-option");
1144 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1145 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1146 else
1147 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001148 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001149 // Enabled A53 errata (835769) workaround by default on android
1150 CmdArgs.push_back("-backend-option");
1151 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001152 }
1153
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001154 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1156 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001157 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001158 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 CmdArgs.push_back("-aarch64-global-merge=false");
1160 else
1161 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001162 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001163}
1164
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001165// Get CPU and ABI names. They are not independent
1166// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001167void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1168 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001169 const char *DefMips32CPU = "mips32r2";
1170 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001171
Daniel Sanders2bf13662014-07-10 14:40:57 +00001172 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1173 // default for mips64(el)?-img-linux-gnu.
1174 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1175 Triple.getEnvironment() == llvm::Triple::GNU) {
1176 DefMips32CPU = "mips32r6";
1177 DefMips64CPU = "mips64r6";
1178 }
Renato Golin7c542b42015-07-27 23:44:45 +00001179
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001180 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001181 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001182 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001183
Brad Smithba26f582015-01-06 02:53:17 +00001184 // MIPS3 is the default for mips64*-unknown-openbsd.
1185 if (Triple.getOS() == llvm::Triple::OpenBSD)
1186 DefMips64CPU = "mips3";
1187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001188 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001189 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001190
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001191 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001192 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001193 // Convert a GNU style Mips ABI name to the name
1194 // accepted by LLVM Mips backend.
1195 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001196 .Case("32", "o32")
1197 .Case("64", "n64")
1198 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001199 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001200
1201 // Setup default CPU and ABI names.
1202 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001203 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001204 default:
1205 llvm_unreachable("Unexpected triple arch name");
1206 case llvm::Triple::mips:
1207 case llvm::Triple::mipsel:
1208 CPUName = DefMips32CPU;
1209 break;
1210 case llvm::Triple::mips64:
1211 case llvm::Triple::mips64el:
1212 CPUName = DefMips64CPU;
1213 break;
1214 }
1215 }
1216
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001217 if (ABIName.empty()) {
1218 // Deduce ABI name from the target triple.
1219 if (Triple.getArch() == llvm::Triple::mips ||
1220 Triple.getArch() == llvm::Triple::mipsel)
1221 ABIName = "o32";
1222 else
1223 ABIName = "n64";
1224 }
1225
1226 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001227 // Deduce CPU name from ABI name.
1228 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001229 .Cases("o32", "eabi", DefMips32CPU)
1230 .Cases("n32", "n64", DefMips64CPU)
1231 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001233
1234 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001235}
1236
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001237std::string mips::getMipsABILibSuffix(const ArgList &Args,
1238 const llvm::Triple &Triple) {
1239 StringRef CPUName, ABIName;
1240 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1241 return llvm::StringSwitch<std::string>(ABIName)
1242 .Case("o32", "")
1243 .Case("n32", "32")
1244 .Case("n64", "64");
1245}
1246
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001247// Convert ABI name to the GNU tools acceptable variant.
1248static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1249 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001250 .Case("o32", "32")
1251 .Case("n64", "64")
1252 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001253}
1254
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001255// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1256// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001257static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1258 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001259 if (Arg *A =
1260 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1261 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001262 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001263 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001264 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001265 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001266 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001267 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1268 .Case("soft", mips::FloatABI::Soft)
1269 .Case("hard", mips::FloatABI::Hard)
1270 .Default(mips::FloatABI::Invalid);
1271 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001272 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001273 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001274 }
1275 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001276 }
1277
1278 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001279 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001280 // Assume "hard", because it's a default value used by gcc.
1281 // When we start to recognize specific target MIPS processors,
1282 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001283 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001284 }
1285
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001286 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1287 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001288}
1289
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001291 std::vector<const char *> &Features,
1292 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001293 StringRef FeatureName) {
1294 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001297 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001298 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001299 }
1300}
1301
Daniel Sanders379d44b2014-07-16 11:52:23 +00001302static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1303 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305 StringRef CPUName;
1306 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001307 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001308 ABIName = getGnuCompatibleMipsABIName(ABIName);
1309
Daniel Sandersfeb61302014-08-08 15:47:17 +00001310 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1311 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001312
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001313 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1314 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001315 // FIXME: Note, this is a hack. We need to pass the selected float
1316 // mode to the MipsTargetInfoBase to define appropriate macros there.
1317 // Now it is the only method.
1318 Features.push_back("+soft-float");
1319 }
1320
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001321 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001322 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001323 if (Val == "2008") {
1324 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1325 Features.push_back("+nan2008");
1326 else {
1327 Features.push_back("-nan2008");
1328 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1329 }
1330 } else if (Val == "legacy") {
1331 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1332 Features.push_back("-nan2008");
1333 else {
1334 Features.push_back("+nan2008");
1335 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1336 }
1337 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001338 D.Diag(diag::err_drv_unsupported_option_argument)
1339 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001340 }
1341
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001342 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1343 options::OPT_mdouble_float, "single-float");
1344 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1345 "mips16");
1346 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1347 options::OPT_mno_micromips, "micromips");
1348 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1349 "dsp");
1350 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1351 "dspr2");
1352 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1353 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001354
1355 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1356 // pass -mfpxx
1357 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1358 options::OPT_mfp64)) {
1359 if (A->getOption().matches(options::OPT_mfp32))
1360 Features.push_back(Args.MakeArgString("-fp64"));
1361 else if (A->getOption().matches(options::OPT_mfpxx)) {
1362 Features.push_back(Args.MakeArgString("+fpxx"));
1363 Features.push_back(Args.MakeArgString("+nooddspreg"));
1364 } else
1365 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001366 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001370
Daniel Sanders28e5d392014-07-10 10:39:51 +00001371 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1372 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001373}
1374
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001375void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001376 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001377 const Driver &D = getToolChain().getDriver();
1378 StringRef CPUName;
1379 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001380 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001381 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382
1383 CmdArgs.push_back("-target-abi");
1384 CmdArgs.push_back(ABIName.data());
1385
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001386 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1387 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001388 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001389 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001390 CmdArgs.push_back("-mfloat-abi");
1391 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001392 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001393 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001394 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001397 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001398
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001399 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1400 if (A->getOption().matches(options::OPT_mxgot)) {
1401 CmdArgs.push_back("-mllvm");
1402 CmdArgs.push_back("-mxgot");
1403 }
1404 }
1405
Simon Atanasyanc580b322013-05-11 06:33:44 +00001406 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1407 options::OPT_mno_ldc1_sdc1)) {
1408 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1409 CmdArgs.push_back("-mllvm");
1410 CmdArgs.push_back("-mno-ldc1-sdc1");
1411 }
1412 }
1413
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001414 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1415 options::OPT_mno_check_zero_division)) {
1416 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1417 CmdArgs.push_back("-mllvm");
1418 CmdArgs.push_back("-mno-check-zero-division");
1419 }
1420 }
1421
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001422 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001423 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001424 CmdArgs.push_back("-mllvm");
1425 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1426 A->claim();
1427 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001428}
1429
Hal Finkel8eb59282012-06-11 22:35:19 +00001430/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1431static std::string getPPCTargetCPU(const ArgList &Args) {
1432 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001433 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001434
1435 if (CPUName == "native") {
1436 std::string CPU = llvm::sys::getHostCPUName();
1437 if (!CPU.empty() && CPU != "generic")
1438 return CPU;
1439 else
1440 return "";
1441 }
1442
1443 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 .Case("common", "generic")
1445 .Case("440", "440")
1446 .Case("440fp", "440")
1447 .Case("450", "450")
1448 .Case("601", "601")
1449 .Case("602", "602")
1450 .Case("603", "603")
1451 .Case("603e", "603e")
1452 .Case("603ev", "603ev")
1453 .Case("604", "604")
1454 .Case("604e", "604e")
1455 .Case("620", "620")
1456 .Case("630", "pwr3")
1457 .Case("G3", "g3")
1458 .Case("7400", "7400")
1459 .Case("G4", "g4")
1460 .Case("7450", "7450")
1461 .Case("G4+", "g4+")
1462 .Case("750", "750")
1463 .Case("970", "970")
1464 .Case("G5", "g5")
1465 .Case("a2", "a2")
1466 .Case("a2q", "a2q")
1467 .Case("e500mc", "e500mc")
1468 .Case("e5500", "e5500")
1469 .Case("power3", "pwr3")
1470 .Case("power4", "pwr4")
1471 .Case("power5", "pwr5")
1472 .Case("power5x", "pwr5x")
1473 .Case("power6", "pwr6")
1474 .Case("power6x", "pwr6x")
1475 .Case("power7", "pwr7")
1476 .Case("power8", "pwr8")
1477 .Case("pwr3", "pwr3")
1478 .Case("pwr4", "pwr4")
1479 .Case("pwr5", "pwr5")
1480 .Case("pwr5x", "pwr5x")
1481 .Case("pwr6", "pwr6")
1482 .Case("pwr6x", "pwr6x")
1483 .Case("pwr7", "pwr7")
1484 .Case("pwr8", "pwr8")
1485 .Case("powerpc", "ppc")
1486 .Case("powerpc64", "ppc64")
1487 .Case("powerpc64le", "ppc64le")
1488 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001489 }
1490
1491 return "";
1492}
1493
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001494static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1495 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001496 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001497 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1500 if (FloatABI == ppc::FloatABI::Soft &&
1501 !(Triple.getArch() == llvm::Triple::ppc64 ||
1502 Triple.getArch() == llvm::Triple::ppc64le))
1503 Features.push_back("+soft-float");
1504 else if (FloatABI == ppc::FloatABI::Soft &&
1505 (Triple.getArch() == llvm::Triple::ppc64 ||
1506 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001507 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001508 << "soft float is not supported for ppc64";
1509
Eric Christopher643bb6a2013-10-16 20:40:08 +00001510 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001511 AddTargetFeature(Args, Features, options::OPT_faltivec,
1512 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001513}
1514
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001515ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1516 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1517 if (Arg *A =
1518 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1519 options::OPT_mfloat_abi_EQ)) {
1520 if (A->getOption().matches(options::OPT_msoft_float))
1521 ABI = ppc::FloatABI::Soft;
1522 else if (A->getOption().matches(options::OPT_mhard_float))
1523 ABI = ppc::FloatABI::Hard;
1524 else {
1525 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1526 .Case("soft", ppc::FloatABI::Soft)
1527 .Case("hard", ppc::FloatABI::Hard)
1528 .Default(ppc::FloatABI::Invalid);
1529 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1530 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1531 ABI = ppc::FloatABI::Hard;
1532 }
1533 }
1534 }
1535
1536 // If unspecified, choose the default based on the platform.
1537 if (ABI == ppc::FloatABI::Invalid) {
1538 ABI = ppc::FloatABI::Hard;
1539 }
1540
1541 return ABI;
1542}
1543
Ulrich Weigand8afad612014-07-28 13:17:52 +00001544void Clang::AddPPCTargetArgs(const ArgList &Args,
1545 ArgStringList &CmdArgs) const {
1546 // Select the ABI to use.
1547 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001548 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001549 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001550 case llvm::Triple::ppc64: {
1551 // When targeting a processor that supports QPX, or if QPX is
1552 // specifically enabled, default to using the ABI that supports QPX (so
1553 // long as it is not specifically disabled).
1554 bool HasQPX = false;
1555 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1556 HasQPX = A->getValue() == StringRef("a2q");
1557 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1558 if (HasQPX) {
1559 ABIName = "elfv1-qpx";
1560 break;
1561 }
1562
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 ABIName = "elfv1";
1564 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001565 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001566 case llvm::Triple::ppc64le:
1567 ABIName = "elfv2";
1568 break;
1569 default:
1570 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001571 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001572
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001573 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1574 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1575 // the option if given as we don't have backend support for any targets
1576 // that don't use the altivec abi.
1577 if (StringRef(A->getValue()) != "altivec")
1578 ABIName = A->getValue();
1579
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001580 ppc::FloatABI FloatABI =
1581 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1582
1583 if (FloatABI == ppc::FloatABI::Soft) {
1584 // Floating point operations and argument passing are soft.
1585 CmdArgs.push_back("-msoft-float");
1586 CmdArgs.push_back("-mfloat-abi");
1587 CmdArgs.push_back("soft");
1588 } else {
1589 // Floating point operations and argument passing are hard.
1590 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("hard");
1593 }
1594
Ulrich Weigand8afad612014-07-28 13:17:52 +00001595 if (ABIName) {
1596 CmdArgs.push_back("-target-abi");
1597 CmdArgs.push_back(ABIName);
1598 }
1599}
1600
1601bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1602 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1603 return A && (A->getValue() == StringRef(Value));
1604}
1605
Tom Stellard6674c702013-04-01 20:56:53 +00001606/// Get the (LLVM) name of the R600 gpu we are targeting.
1607static std::string getR600TargetGPU(const ArgList &Args) {
1608 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001609 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001610 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001611 .Cases("rv630", "rv635", "r600")
1612 .Cases("rv610", "rv620", "rs780", "rs880")
1613 .Case("rv740", "rv770")
1614 .Case("palm", "cedar")
1615 .Cases("sumo", "sumo2", "sumo")
1616 .Case("hemlock", "cypress")
1617 .Case("aruba", "cayman")
1618 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001619 }
1620 return "";
1621}
1622
Jacques Pienaard964cc22016-03-28 21:02:54 +00001623static std::string getLanaiTargetCPU(const ArgList &Args) {
1624 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1625 return A->getValue();
1626 }
1627 return "";
1628}
1629
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001631 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001632 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001633 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001634
James Y Knightb2406522015-06-15 20:51:24 +00001635 bool SoftFloatABI = false;
1636 if (Arg *A =
1637 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001638 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001639 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001640 }
1641
James Y Knightb2406522015-06-15 20:51:24 +00001642 // Only the hard-float ABI on Sparc is standardized, and it is the
1643 // default. GCC also supports a nonstandard soft-float ABI mode, and
1644 // perhaps LLVM should implement that, too. However, since llvm
1645 // currently does not support Sparc soft-float, at all, display an
1646 // error if it's requested.
1647 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001648 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1649 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001650 }
1651}
1652
Richard Sandiford4652d892013-07-19 16:51:51 +00001653static const char *getSystemZTargetCPU(const ArgList &Args) {
1654 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1655 return A->getValue();
1656 return "z10";
1657}
1658
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001659static void getSystemZTargetFeatures(const ArgList &Args,
1660 std::vector<const char *> &Features) {
1661 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001662 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001663 if (A->getOption().matches(options::OPT_mhtm))
1664 Features.push_back("+transactional-execution");
1665 else
1666 Features.push_back("-transactional-execution");
1667 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001668 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001669 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001670 if (A->getOption().matches(options::OPT_mvx))
1671 Features.push_back("+vector");
1672 else
1673 Features.push_back("-vector");
1674 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001675}
1676
Chandler Carruth953fb082013-01-13 11:46:33 +00001677static const char *getX86TargetCPU(const ArgList &Args,
1678 const llvm::Triple &Triple) {
1679 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001680 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001681 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001682 return "core-avx2";
1683
Chandler Carruth953fb082013-01-13 11:46:33 +00001684 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001686
1687 // FIXME: Reject attempts to use -march=native unless the target matches
1688 // the host.
1689 //
1690 // FIXME: We should also incorporate the detected target features for use
1691 // with -native.
1692 std::string CPU = llvm::sys::getHostCPUName();
1693 if (!CPU.empty() && CPU != "generic")
1694 return Args.MakeArgString(CPU);
1695 }
1696
Reid Kleckner3123eff2015-06-30 16:32:04 +00001697 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1698 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1699 StringRef Arch = A->getValue();
1700 const char *CPU;
1701 if (Triple.getArch() == llvm::Triple::x86) {
1702 CPU = llvm::StringSwitch<const char *>(Arch)
1703 .Case("IA32", "i386")
1704 .Case("SSE", "pentium3")
1705 .Case("SSE2", "pentium4")
1706 .Case("AVX", "sandybridge")
1707 .Case("AVX2", "haswell")
1708 .Default(nullptr);
1709 } else {
1710 CPU = llvm::StringSwitch<const char *>(Arch)
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 }
1715 if (CPU)
1716 return CPU;
1717 }
1718
Chandler Carruth953fb082013-01-13 11:46:33 +00001719 // Select the default CPU if none was given (or detection failed).
1720
1721 if (Triple.getArch() != llvm::Triple::x86_64 &&
1722 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001723 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001724
1725 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1726
1727 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001728 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001729 if (Triple.getArchName() == "x86_64h")
1730 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001731 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001732 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001733
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001734 // Set up default CPU name for PS4 compilers.
1735 if (Triple.isPS4CPU())
1736 return "btver2";
1737
Alexey Bataev286d1b92014-01-31 04:07:13 +00001738 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001739 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001740 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001741
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001742 // Everything else goes to x86-64 in 64-bit mode.
1743 if (Is64Bit)
1744 return "x86-64";
1745
1746 switch (Triple.getOS()) {
1747 case llvm::Triple::FreeBSD:
1748 case llvm::Triple::NetBSD:
1749 case llvm::Triple::OpenBSD:
1750 return "i486";
1751 case llvm::Triple::Haiku:
1752 return "i586";
1753 case llvm::Triple::Bitrig:
1754 return "i686";
1755 default:
1756 // Fallback to p4.
1757 return "pentium4";
1758 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001759}
1760
Dan Gohmanc2853072015-09-03 22:51:53 +00001761/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1762static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1763 // If we have -mcpu=, use that.
1764 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1765 StringRef CPU = A->getValue();
1766
1767#ifdef __wasm__
1768 // Handle "native" by examining the host. "native" isn't meaningful when
1769 // cross compiling, so only support this when the host is also WebAssembly.
1770 if (CPU == "native")
1771 return llvm::sys::getHostCPUName();
1772#endif
1773
1774 return CPU;
1775 }
1776
1777 return "generic";
1778}
1779
Renato Golin7c542b42015-07-27 23:44:45 +00001780static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1781 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001782 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001783 default:
1784 return "";
1785
Amara Emerson703da2e2013-10-31 09:32:33 +00001786 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001787 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001788 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001789
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001790 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001791 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001792 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001793 case llvm::Triple::thumbeb: {
1794 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001795 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001796 return arm::getARMTargetCPU(MCPU, MArch, T);
1797 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001798 case llvm::Triple::mips:
1799 case llvm::Triple::mipsel:
1800 case llvm::Triple::mips64:
1801 case llvm::Triple::mips64el: {
1802 StringRef CPUName;
1803 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001804 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001805 return CPUName;
1806 }
1807
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001808 case llvm::Triple::nvptx:
1809 case llvm::Triple::nvptx64:
1810 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1811 return A->getValue();
1812 return "";
1813
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001814 case llvm::Triple::ppc:
1815 case llvm::Triple::ppc64:
1816 case llvm::Triple::ppc64le: {
1817 std::string TargetCPUName = getPPCTargetCPU(Args);
1818 // LLVM may default to generating code for the native CPU,
1819 // but, like gcc, we default to a more generic option for
1820 // each architecture. (except on Darwin)
1821 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1822 if (T.getArch() == llvm::Triple::ppc64)
1823 TargetCPUName = "ppc64";
1824 else if (T.getArch() == llvm::Triple::ppc64le)
1825 TargetCPUName = "ppc64le";
1826 else
1827 TargetCPUName = "ppc";
1828 }
1829 return TargetCPUName;
1830 }
1831
1832 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001833 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001834 case llvm::Triple::sparcv9:
1835 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001836 return A->getValue();
1837 return "";
1838
1839 case llvm::Triple::x86:
1840 case llvm::Triple::x86_64:
1841 return getX86TargetCPU(Args, T);
1842
1843 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001844 return "hexagon" +
1845 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001846
Jacques Pienaard964cc22016-03-28 21:02:54 +00001847 case llvm::Triple::lanai:
1848 return getLanaiTargetCPU(Args);
1849
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001850 case llvm::Triple::systemz:
1851 return getSystemZTargetCPU(Args);
1852
1853 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001854 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001856
1857 case llvm::Triple::wasm32:
1858 case llvm::Triple::wasm64:
1859 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 }
1861}
1862
Alp Tokerce365ca2013-12-02 12:43:03 +00001863static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001864 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001865 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1866 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1867 // forward.
1868 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 std::string Plugin =
1870 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001871 CmdArgs.push_back(Args.MakeArgString(Plugin));
1872
1873 // Try to pass driver level flags relevant to LTO code generation down to
1874 // the plugin.
1875
1876 // Handle flags for selecting CPU variants.
1877 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1878 if (!CPU.empty())
1879 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001880
James Molloyf97fdae2015-12-21 10:44:36 +00001881 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1882 StringRef OOpt;
1883 if (A->getOption().matches(options::OPT_O4) ||
1884 A->getOption().matches(options::OPT_Ofast))
1885 OOpt = "3";
1886 else if (A->getOption().matches(options::OPT_O))
1887 OOpt = A->getValue();
1888 else if (A->getOption().matches(options::OPT_O0))
1889 OOpt = "0";
1890 if (!OOpt.empty())
1891 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1892 }
1893
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001894 if (IsThinLTO)
1895 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001896
1897 // If an explicit debugger tuning argument appeared, pass it along.
1898 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1899 options::OPT_ggdbN_Group)) {
1900 if (A->getOption().matches(options::OPT_glldb))
1901 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1902 else if (A->getOption().matches(options::OPT_gsce))
1903 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1904 else
1905 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1906 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001907}
1908
Sanjay Patel2987c292015-06-11 14:53:41 +00001909/// This is a helper function for validating the optional refinement step
1910/// parameter in reciprocal argument strings. Return false if there is an error
1911/// parsing the refinement step. Otherwise, return true and set the Position
1912/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001913static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001915 const char RefinementStepToken = ':';
1916 Position = In.find(RefinementStepToken);
1917 if (Position != StringRef::npos) {
1918 StringRef Option = A.getOption().getName();
1919 StringRef RefStep = In.substr(Position + 1);
1920 // Allow exactly one numeric character for the additional refinement
1921 // step parameter. This is reasonable for all currently-supported
1922 // operations and architectures because we would expect that a larger value
1923 // of refinement steps would cause the estimate "optimization" to
1924 // under-perform the native operation. Also, if the estimate does not
1925 // converge quickly, it probably will not ever converge, so further
1926 // refinement steps will not produce a better answer.
1927 if (RefStep.size() != 1) {
1928 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1929 return false;
1930 }
1931 char RefStepChar = RefStep[0];
1932 if (RefStepChar < '0' || RefStepChar > '9') {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 }
1937 return true;
1938}
1939
1940/// The -mrecip flag requires processing of many optional parameters.
1941static void ParseMRecip(const Driver &D, const ArgList &Args,
1942 ArgStringList &OutStrings) {
1943 StringRef DisabledPrefixIn = "!";
1944 StringRef DisabledPrefixOut = "!";
1945 StringRef EnabledPrefixOut = "";
1946 StringRef Out = "-mrecip=";
1947
1948 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1949 if (!A)
1950 return;
1951
1952 unsigned NumOptions = A->getNumValues();
1953 if (NumOptions == 0) {
1954 // No option is the same as "all".
1955 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1956 return;
1957 }
1958
1959 // Pass through "all", "none", or "default" with an optional refinement step.
1960 if (NumOptions == 1) {
1961 StringRef Val = A->getValue(0);
1962 size_t RefStepLoc;
1963 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1964 return;
1965 StringRef ValBase = Val.slice(0, RefStepLoc);
1966 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1967 OutStrings.push_back(Args.MakeArgString(Out + Val));
1968 return;
1969 }
1970 }
1971
1972 // Each reciprocal type may be enabled or disabled individually.
1973 // Check each input value for validity, concatenate them all back together,
1974 // and pass through.
1975
1976 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 OptionStrings.insert(std::make_pair("divd", false));
1978 OptionStrings.insert(std::make_pair("divf", false));
1979 OptionStrings.insert(std::make_pair("vec-divd", false));
1980 OptionStrings.insert(std::make_pair("vec-divf", false));
1981 OptionStrings.insert(std::make_pair("sqrtd", false));
1982 OptionStrings.insert(std::make_pair("sqrtf", false));
1983 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1984 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001985
1986 for (unsigned i = 0; i != NumOptions; ++i) {
1987 StringRef Val = A->getValue(i);
1988
1989 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1990 // Ignore the disablement token for string matching.
1991 if (IsDisabled)
1992 Val = Val.substr(1);
1993
1994 size_t RefStep;
1995 if (!getRefinementStep(Val, D, *A, RefStep))
1996 return;
1997
1998 StringRef ValBase = Val.slice(0, RefStep);
1999 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2000 if (OptionIter == OptionStrings.end()) {
2001 // Try again specifying float suffix.
2002 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2003 if (OptionIter == OptionStrings.end()) {
2004 // The input name did not match any known option string.
2005 D.Diag(diag::err_drv_unknown_argument) << Val;
2006 return;
2007 }
2008 // The option was specified without a float or double suffix.
2009 // Make sure that the double entry was not already specified.
2010 // The float entry will be checked below.
2011 if (OptionStrings[ValBase.str() + 'd']) {
2012 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2013 return;
2014 }
2015 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002016
Sanjay Patel2987c292015-06-11 14:53:41 +00002017 if (OptionIter->second == true) {
2018 // Duplicate option specified.
2019 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2020 return;
2021 }
2022
2023 // Mark the matched option as found. Do not allow duplicate specifiers.
2024 OptionIter->second = true;
2025
2026 // If the precision was not specified, also mark the double entry as found.
2027 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2028 OptionStrings[ValBase.str() + 'd'] = true;
2029
2030 // Build the output string.
2031 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2032 Out = Args.MakeArgString(Out + Prefix + Val);
2033 if (i != NumOptions - 1)
2034 Out = Args.MakeArgString(Out + ",");
2035 }
2036
2037 OutStrings.push_back(Args.MakeArgString(Out));
2038}
2039
Eric Christopherc54920a2015-03-23 19:26:05 +00002040static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002041 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002042 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002043 // If -march=native, autodetect the feature list.
2044 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2045 if (StringRef(A->getValue()) == "native") {
2046 llvm::StringMap<bool> HostFeatures;
2047 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2048 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002049 Features.push_back(
2050 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002051 }
2052 }
2053
Jim Grosbach82eee262013-11-16 00:53:35 +00002054 if (Triple.getArchName() == "x86_64h") {
2055 // x86_64h implies quite a few of the more modern subtarget features
2056 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2057 Features.push_back("-rdrnd");
2058 Features.push_back("-aes");
2059 Features.push_back("-pclmul");
2060 Features.push_back("-rtm");
2061 Features.push_back("-hle");
2062 Features.push_back("-fsgsbase");
2063 }
2064
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002065 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002066 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002067 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002068 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002069 Features.push_back("+sse4.2");
2070 Features.push_back("+popcnt");
2071 } else
2072 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002073 }
2074
Eric Christopherc54920a2015-03-23 19:26:05 +00002075 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002076 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2077 StringRef Arch = A->getValue();
2078 bool ArchUsed = false;
2079 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002080 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arch == "AVX" || Arch == "AVX2") {
2082 ArchUsed = true;
2083 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2084 }
2085 }
2086 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002087 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002088 if (Arch == "IA32") {
2089 ArchUsed = true;
2090 } else if (Arch == "SSE" || Arch == "SSE2") {
2091 ArchUsed = true;
2092 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2093 }
2094 }
2095 if (!ArchUsed)
2096 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2097 }
2098
Jim Grosbach82eee262013-11-16 00:53:35 +00002099 // Now add any that the user explicitly requested on the command line,
2100 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002101 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002102}
2103
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002104void Clang::AddX86TargetArgs(const ArgList &Args,
2105 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002106 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002107 Args.hasArg(options::OPT_mkernel) ||
2108 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002109 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002110
Bob Wilson2616e2e2013-02-10 16:01:41 +00002111 // Default to avoid implicit floating-point for kernel/kext code, but allow
2112 // that to be overridden with -mno-soft-float.
2113 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2114 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002115 if (Arg *A = Args.getLastArg(
2116 options::OPT_msoft_float, options::OPT_mno_soft_float,
2117 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002118 const Option &O = A->getOption();
2119 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2120 O.matches(options::OPT_msoft_float));
2121 }
2122 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002123 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002124
2125 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2126 StringRef Value = A->getValue();
2127 if (Value == "intel" || Value == "att") {
2128 CmdArgs.push_back("-mllvm");
2129 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2130 } else {
2131 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2132 << A->getOption().getName() << Value;
2133 }
2134 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002135}
2136
Tony Linthicum76329bf2011-12-12 21:14:55 +00002137void Clang::AddHexagonTargetArgs(const ArgList &Args,
2138 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002139 CmdArgs.push_back("-mqdsp6-compat");
2140 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002141
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002142 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2143 std::string N = llvm::utostr(G.getValue());
2144 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002146 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002147 }
2148
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002149 if (!Args.hasArg(options::OPT_fno_short_enums))
2150 CmdArgs.push_back("-fshort-enums");
2151 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 CmdArgs.push_back("-mllvm");
2153 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002154 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 CmdArgs.push_back("-mllvm");
2156 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002157}
2158
Jacques Pienaard964cc22016-03-28 21:02:54 +00002159void Clang::AddLanaiTargetArgs(const ArgList &Args,
2160 ArgStringList &CmdArgs) const {
2161 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2162 StringRef CPUName = A->getValue();
2163
2164 CmdArgs.push_back("-target-cpu");
2165 CmdArgs.push_back(Args.MakeArgString(CPUName));
2166 }
2167 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2168 StringRef Value = A->getValue();
2169 // Only support mregparm=4 to support old usage. Report error for all other
2170 // cases.
2171 int Mregparm;
2172 if (Value.getAsInteger(10, Mregparm)) {
2173 if (Mregparm != 4) {
2174 getToolChain().getDriver().Diag(
2175 diag::err_drv_unsupported_option_argument)
2176 << A->getOption().getName() << Value;
2177 }
2178 }
2179 }
2180}
2181
Dan Gohmane3d71e12016-01-07 01:00:21 +00002182void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2183 ArgStringList &CmdArgs) const {
2184 // Default to "hidden" visibility.
2185 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2186 options::OPT_fvisibility_ms_compat)) {
2187 CmdArgs.push_back("-fvisibility");
2188 CmdArgs.push_back("hidden");
2189 }
2190}
2191
Kevin Qin110db6f2014-07-18 07:03:22 +00002192// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002193static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002194 std::vector<const char *> &Features) {
2195 SmallVector<StringRef, 8> Split;
2196 text.split(Split, StringRef("+"), -1, false);
2197
Benjamin Kramer72e64312015-09-24 14:48:49 +00002198 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002199 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002200 .Case("fp", "+fp-armv8")
2201 .Case("simd", "+neon")
2202 .Case("crc", "+crc")
2203 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002204 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002205 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 .Case("nofp", "-fp-armv8")
2207 .Case("nosimd", "-neon")
2208 .Case("nocrc", "-crc")
2209 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002210 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002211 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 .Default(nullptr);
2213 if (result)
2214 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002215 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002216 D.Diag(diag::err_drv_no_neon_modifier);
2217 else
2218 return false;
2219 }
2220 return true;
2221}
2222
2223// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2224// decode CPU and feature.
2225static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2226 std::vector<const char *> &Features) {
2227 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2228 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002229 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002230 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2231 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002232 Features.push_back("+neon");
2233 Features.push_back("+crc");
2234 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002235 } else if (CPU == "cyclone") {
2236 Features.push_back("+neon");
2237 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002238 } else if (CPU == "generic") {
2239 Features.push_back("+neon");
2240 } else {
2241 return false;
2242 }
2243
2244 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2245 return false;
2246
2247 return true;
2248}
2249
2250static bool
2251getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2252 const ArgList &Args,
2253 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002254 std::string MarchLowerCase = March.lower();
2255 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002256
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002257 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002258 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002259 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002260 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002261 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2262 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002263 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002264 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002265 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002266
2267 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2268 return false;
2269
2270 return true;
2271}
2272
2273static bool
2274getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2275 const ArgList &Args,
2276 std::vector<const char *> &Features) {
2277 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002278 std::string McpuLowerCase = Mcpu.lower();
2279 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002280 return false;
2281
2282 return true;
2283}
2284
2285static bool
2286getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2287 const ArgList &Args,
2288 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002289 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002290 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002291 if (MtuneLowerCase == "native")
2292 MtuneLowerCase = llvm::sys::getHostCPUName();
2293 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002294 Features.push_back("+zcm");
2295 Features.push_back("+zcz");
2296 }
2297 return true;
2298}
2299
2300static bool
2301getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2302 const ArgList &Args,
2303 std::vector<const char *> &Features) {
2304 StringRef CPU;
2305 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002306 std::string McpuLowerCase = Mcpu.lower();
2307 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002308 return false;
2309
2310 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2311}
2312
Justin Bognerf9052562015-11-13 23:07:31 +00002313static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002314 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002315 Arg *A;
2316 bool success = true;
2317 // Enable NEON by default.
2318 Features.push_back("+neon");
2319 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2320 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2321 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2322 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002323 else if (Args.hasArg(options::OPT_arch))
2324 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2325 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002326
2327 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2328 success =
2329 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2330 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2331 success =
2332 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002333 else if (Args.hasArg(options::OPT_arch))
2334 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2335 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002336
2337 if (!success)
2338 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002339
2340 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2341 Features.push_back("-fp-armv8");
2342 Features.push_back("-crypto");
2343 Features.push_back("-neon");
2344 }
Bradley Smith418c5932014-05-02 15:17:51 +00002345
2346 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002347 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002348 if (A->getOption().matches(options::OPT_mcrc))
2349 Features.push_back("+crc");
2350 else
2351 Features.push_back("-crc");
2352 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002353
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002354 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2355 options::OPT_munaligned_access))
2356 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2357 Features.push_back("+strict-align");
2358
Justin Bognerf9052562015-11-13 23:07:31 +00002359 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002360 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002361}
2362
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002363static void getHexagonTargetFeatures(const ArgList &Args,
2364 std::vector<const char *> &Features) {
2365 bool HasHVX = false, HasHVXD = false;
2366
Eric Christopher49062a52015-12-22 03:12:34 +00002367 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2368 // doing dependent option handling here rather than in initFeatureMap or a
2369 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002370 for (auto &A : Args) {
2371 auto &Opt = A->getOption();
2372 if (Opt.matches(options::OPT_mhexagon_hvx))
2373 HasHVX = true;
2374 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2375 HasHVXD = HasHVX = false;
2376 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2377 HasHVXD = HasHVX = true;
2378 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2379 HasHVXD = false;
2380 else
2381 continue;
2382 A->claim();
2383 }
2384
2385 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2386 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2387}
2388
Dan Gohmanc2853072015-09-03 22:51:53 +00002389static void getWebAssemblyTargetFeatures(const ArgList &Args,
2390 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002391 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002392}
2393
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002394static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2395 std::vector<const char *> &Features) {
2396 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2397 StringRef value = dAbi->getValue();
2398 if (value == "1.0") {
2399 Features.push_back("+amdgpu-debugger-insert-nops");
2400 Features.push_back("+amdgpu-debugger-reserve-trap-regs");
2401 } else {
2402 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2403 }
2404 }
2405
2406 handleTargetFeaturesGroup(
2407 Args, Features, options::OPT_m_amdgpu_Features_Group);
2408}
2409
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002410static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002411 const ArgList &Args, ArgStringList &CmdArgs,
2412 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002413 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002414 std::vector<const char *> Features;
2415 switch (Triple.getArch()) {
2416 default:
2417 break;
2418 case llvm::Triple::mips:
2419 case llvm::Triple::mipsel:
2420 case llvm::Triple::mips64:
2421 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002422 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002423 break;
2424
2425 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002426 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002427 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002428 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002429 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002430 break;
2431
2432 case llvm::Triple::ppc:
2433 case llvm::Triple::ppc64:
2434 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002435 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002436 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002437 case llvm::Triple::systemz:
2438 getSystemZTargetFeatures(Args, Features);
2439 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002440 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002441 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002442 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002443 break;
2444 case llvm::Triple::x86:
2445 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002446 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002447 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002448 case llvm::Triple::hexagon:
2449 getHexagonTargetFeatures(Args, Features);
2450 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002451 case llvm::Triple::wasm32:
2452 case llvm::Triple::wasm64:
2453 getWebAssemblyTargetFeatures(Args, Features);
2454 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002455 case llvm::Triple::r600:
2456 case llvm::Triple::amdgcn:
2457 getAMDGPUTargetFeatures(D, Args, Features);
2458 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002459 }
Rafael Espindola43964802013-08-21 17:34:32 +00002460
2461 // Find the last of each feature.
2462 llvm::StringMap<unsigned> LastOpt;
2463 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2464 const char *Name = Features[I];
2465 assert(Name[0] == '-' || Name[0] == '+');
2466 LastOpt[Name + 1] = I;
2467 }
2468
2469 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2470 // If this feature was overridden, ignore it.
2471 const char *Name = Features[I];
2472 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2473 assert(LastI != LastOpt.end());
2474 unsigned Last = LastI->second;
2475 if (Last != I)
2476 continue;
2477
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002478 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002479 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002480 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002481}
2482
David Majnemerae394812014-12-09 00:12:30 +00002483static bool
2484shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2485 const llvm::Triple &Triple) {
2486 // We use the zero-cost exception tables for Objective-C if the non-fragile
2487 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2488 // later.
2489 if (runtime.isNonFragile())
2490 return true;
2491
2492 if (!Triple.isMacOSX())
2493 return false;
2494
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002495 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002496 (Triple.getArch() == llvm::Triple::x86_64 ||
2497 Triple.getArch() == llvm::Triple::arm));
2498}
2499
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002500/// Adds exception related arguments to the driver command arguments. There's a
2501/// master flag, -fexceptions and also language specific flags to enable/disable
2502/// C++ and Objective-C exceptions. This makes it possible to for example
2503/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002504static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002505 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002506 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002507 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002508 const Driver &D = TC.getDriver();
2509 const llvm::Triple &Triple = TC.getTriple();
2510
Chad Rosier4fab82c2012-03-26 22:04:46 +00002511 if (KernelOrKext) {
2512 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2513 // arguments now to avoid warnings about unused arguments.
2514 Args.ClaimAllArgs(options::OPT_fexceptions);
2515 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2516 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2517 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2518 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2519 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002520 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002521 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002522
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002523 // See if the user explicitly enabled exceptions.
2524 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2525 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002526
David Majnemerae394812014-12-09 00:12:30 +00002527 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2528 // is not necessarily sensible, but follows GCC.
2529 if (types::isObjC(InputType) &&
2530 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002531 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002532 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002533
David Majnemerae394812014-12-09 00:12:30 +00002534 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002535 }
2536
2537 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002538 // Disable C++ EH by default on XCore and PS4.
2539 bool CXXExceptionsEnabled =
2540 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002541 Arg *ExceptionArg = Args.getLastArg(
2542 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2543 options::OPT_fexceptions, options::OPT_fno_exceptions);
2544 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002545 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002546 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2547 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002548
2549 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002550 if (Triple.isPS4CPU()) {
2551 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2552 assert(ExceptionArg &&
2553 "On the PS4 exceptions should only be enabled if passing "
2554 "an argument");
2555 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2556 const Arg *RTTIArg = TC.getRTTIArg();
2557 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2558 D.Diag(diag::err_drv_argument_not_allowed_with)
2559 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2560 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2561 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2562 } else
2563 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2564
Anders Carlssone96ab552011-02-28 02:27:16 +00002565 CmdArgs.push_back("-fcxx-exceptions");
2566
David Majnemer8de68642014-12-05 08:11:58 +00002567 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002568 }
2569 }
2570
David Majnemer8de68642014-12-05 08:11:58 +00002571 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002572 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002573}
2574
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002575static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002576 bool Default = true;
2577 if (TC.getTriple().isOSDarwin()) {
2578 // The native darwin assembler doesn't support the linker_option directives,
2579 // so we disable them if we think the .s file will be passed to it.
2580 Default = TC.useIntegratedAs();
2581 }
2582 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2583 Default);
2584}
2585
Ted Kremenek62093662013-03-12 17:02:12 +00002586static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2587 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002588 bool UseDwarfDirectory =
2589 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2590 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002591 return !UseDwarfDirectory;
2592}
2593
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002594/// \brief Check whether the given input tree contains any compilation actions.
2595static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002596 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002597 return true;
2598
Nico Weber5a459f82016-02-23 19:30:43 +00002599 for (const auto &AI : A->inputs())
2600 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002601 return true;
2602
2603 return false;
2604}
2605
2606/// \brief Check if -relax-all should be passed to the internal assembler.
2607/// This is done by default when compiling non-assembler source with -O0.
2608static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2609 bool RelaxDefault = true;
2610
2611 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2612 RelaxDefault = A->getOption().matches(options::OPT_O0);
2613
2614 if (RelaxDefault) {
2615 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002616 for (const auto &Act : C.getActions()) {
2617 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002618 RelaxDefault = true;
2619 break;
2620 }
2621 }
2622 }
2623
2624 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002625 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002626}
2627
Paul Robinson0334a042015-12-19 19:41:48 +00002628// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2629// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002630static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002631 assert(A.getOption().matches(options::OPT_gN_Group) &&
2632 "Not a -g option that specifies a debug-info level");
2633 if (A.getOption().matches(options::OPT_g0) ||
2634 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002635 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002636 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2637 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002638 return codegenoptions::DebugLineTablesOnly;
2639 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002640}
2641
Douglas Katzman3459ce22015-10-08 04:24:12 +00002642// Extract the integer N from a string spelled "-dwarf-N", returning 0
2643// on mismatch. The StringRef input (rather than an Arg) allows
2644// for use by the "-Xassembler" option parser.
2645static unsigned DwarfVersionNum(StringRef ArgValue) {
2646 return llvm::StringSwitch<unsigned>(ArgValue)
2647 .Case("-gdwarf-2", 2)
2648 .Case("-gdwarf-3", 3)
2649 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002650 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002651 .Default(0);
2652}
2653
2654static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002655 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002656 unsigned DwarfVersion,
2657 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002658 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002659 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002660 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2661 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002662 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002663 CmdArgs.push_back("-debug-info-kind=limited");
2664 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002665 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002666 CmdArgs.push_back("-debug-info-kind=standalone");
2667 break;
2668 default:
2669 break;
2670 }
2671 if (DwarfVersion > 0)
2672 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002673 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002674 switch (DebuggerTuning) {
2675 case llvm::DebuggerKind::GDB:
2676 CmdArgs.push_back("-debugger-tuning=gdb");
2677 break;
2678 case llvm::DebuggerKind::LLDB:
2679 CmdArgs.push_back("-debugger-tuning=lldb");
2680 break;
2681 case llvm::DebuggerKind::SCE:
2682 CmdArgs.push_back("-debugger-tuning=sce");
2683 break;
2684 default:
2685 break;
2686 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002687}
2688
David Blaikie9260ed62013-07-25 21:19:01 +00002689static void CollectArgsForIntegratedAssembler(Compilation &C,
2690 const ArgList &Args,
2691 ArgStringList &CmdArgs,
2692 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 if (UseRelaxAll(C, Args))
2694 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002695
David Majnemer2b9349d2015-12-21 22:09:34 +00002696 // Only default to -mincremental-linker-compatible if we think we are
2697 // targeting the MSVC linker.
2698 bool DefaultIncrementalLinkerCompatible =
2699 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2700 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2701 options::OPT_mno_incremental_linker_compatible,
2702 DefaultIncrementalLinkerCompatible))
2703 CmdArgs.push_back("-mincremental-linker-compatible");
2704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002705 // When passing -I arguments to the assembler we sometimes need to
2706 // unconditionally take the next argument. For example, when parsing
2707 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2708 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2709 // arg after parsing the '-I' arg.
2710 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002712 // When using an integrated assembler, translate -Wa, and -Xassembler
2713 // options.
2714 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002715 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002716 for (const Arg *A :
2717 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2718 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002719
Benjamin Kramer72e64312015-09-24 14:48:49 +00002720 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002721 if (TakeNextArg) {
2722 CmdArgs.push_back(Value.data());
2723 TakeNextArg = false;
2724 continue;
2725 }
David Blaikie9260ed62013-07-25 21:19:01 +00002726
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002727 switch (C.getDefaultToolChain().getArch()) {
2728 default:
2729 break;
2730 case llvm::Triple::mips:
2731 case llvm::Triple::mipsel:
2732 case llvm::Triple::mips64:
2733 case llvm::Triple::mips64el:
2734 if (Value == "--trap") {
2735 CmdArgs.push_back("-target-feature");
2736 CmdArgs.push_back("+use-tcc-in-div");
2737 continue;
2738 }
2739 if (Value == "--break") {
2740 CmdArgs.push_back("-target-feature");
2741 CmdArgs.push_back("-use-tcc-in-div");
2742 continue;
2743 }
2744 if (Value.startswith("-msoft-float")) {
2745 CmdArgs.push_back("-target-feature");
2746 CmdArgs.push_back("+soft-float");
2747 continue;
2748 }
2749 if (Value.startswith("-mhard-float")) {
2750 CmdArgs.push_back("-target-feature");
2751 CmdArgs.push_back("-soft-float");
2752 continue;
2753 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002754
2755 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2756 .Case("-mips1", "+mips1")
2757 .Case("-mips2", "+mips2")
2758 .Case("-mips3", "+mips3")
2759 .Case("-mips4", "+mips4")
2760 .Case("-mips5", "+mips5")
2761 .Case("-mips32", "+mips32")
2762 .Case("-mips32r2", "+mips32r2")
2763 .Case("-mips32r3", "+mips32r3")
2764 .Case("-mips32r5", "+mips32r5")
2765 .Case("-mips32r6", "+mips32r6")
2766 .Case("-mips64", "+mips64")
2767 .Case("-mips64r2", "+mips64r2")
2768 .Case("-mips64r3", "+mips64r3")
2769 .Case("-mips64r5", "+mips64r5")
2770 .Case("-mips64r6", "+mips64r6")
2771 .Default(nullptr);
2772 if (MipsTargetFeature)
2773 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002774 }
2775
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002776 if (Value == "-force_cpusubtype_ALL") {
2777 // Do nothing, this is the default and we don't support anything else.
2778 } else if (Value == "-L") {
2779 CmdArgs.push_back("-msave-temp-labels");
2780 } else if (Value == "--fatal-warnings") {
2781 CmdArgs.push_back("-massembler-fatal-warnings");
2782 } else if (Value == "--noexecstack") {
2783 CmdArgs.push_back("-mnoexecstack");
2784 } else if (Value == "-compress-debug-sections" ||
2785 Value == "--compress-debug-sections") {
2786 CompressDebugSections = true;
2787 } else if (Value == "-nocompress-debug-sections" ||
2788 Value == "--nocompress-debug-sections") {
2789 CompressDebugSections = false;
2790 } else if (Value.startswith("-I")) {
2791 CmdArgs.push_back(Value.data());
2792 // We need to consume the next argument if the current arg is a plain
2793 // -I. The next arg will be the include directory.
2794 if (Value == "-I")
2795 TakeNextArg = true;
2796 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002797 // "-gdwarf-N" options are not cc1as options.
2798 unsigned DwarfVersion = DwarfVersionNum(Value);
2799 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2800 CmdArgs.push_back(Value.data());
2801 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002802 RenderDebugEnablingArgs(Args, CmdArgs,
2803 codegenoptions::LimitedDebugInfo,
2804 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002805 }
Renato Golin7c542b42015-07-27 23:44:45 +00002806 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2807 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2808 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002809 } else {
2810 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002811 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002812 }
2813 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002814 }
2815 if (CompressDebugSections) {
2816 if (llvm::zlib::isAvailable())
2817 CmdArgs.push_back("-compress-debug-sections");
2818 else
2819 D.Diag(diag::warn_debug_compression_unavailable);
2820 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002821 if (MipsTargetFeature != nullptr) {
2822 CmdArgs.push_back("-target-feature");
2823 CmdArgs.push_back(MipsTargetFeature);
2824 }
David Blaikie9260ed62013-07-25 21:19:01 +00002825}
2826
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002827// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002828// FIXME: Make sure we can also emit shared objects if they're requested
2829// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002830static void addClangRT(const ToolChain &TC, const ArgList &Args,
2831 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002832 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002833}
2834
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002835namespace {
2836enum OpenMPRuntimeKind {
2837 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2838 /// without knowing what runtime to target.
2839 OMPRT_Unknown,
2840
2841 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2842 /// the default for Clang.
2843 OMPRT_OMP,
2844
2845 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2846 /// this runtime but can swallow the pragmas, and find and link against the
2847 /// runtime library itself.
2848 OMPRT_GOMP,
2849
Chandler Carruthc6625c62015-05-28 21:10:31 +00002850 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002851 /// OpenMP runtime. We support this mode for users with existing dependencies
2852 /// on this runtime library name.
2853 OMPRT_IOMP5
2854};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002855}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002856
2857/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002858static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2859 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002860 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2861
2862 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2863 if (A)
2864 RuntimeName = A->getValue();
2865
2866 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002867 .Case("libomp", OMPRT_OMP)
2868 .Case("libgomp", OMPRT_GOMP)
2869 .Case("libiomp5", OMPRT_IOMP5)
2870 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002871
2872 if (RT == OMPRT_Unknown) {
2873 if (A)
2874 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002875 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002876 else
2877 // FIXME: We could use a nicer diagnostic here.
2878 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2879 }
2880
2881 return RT;
2882}
2883
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002884static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2885 const ArgList &Args) {
2886 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2887 options::OPT_fno_openmp, false))
2888 return;
2889
2890 switch (getOpenMPRuntime(TC, Args)) {
2891 case OMPRT_OMP:
2892 CmdArgs.push_back("-lomp");
2893 break;
2894 case OMPRT_GOMP:
2895 CmdArgs.push_back("-lgomp");
2896 break;
2897 case OMPRT_IOMP5:
2898 CmdArgs.push_back("-liomp5");
2899 break;
2900 case OMPRT_Unknown:
2901 // Already diagnosed.
2902 break;
2903 }
2904}
2905
Alexey Samsonov52550342014-09-15 19:58:40 +00002906static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2907 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002908 bool IsShared, bool IsWhole) {
2909 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002910 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002911 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002912 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002913 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002914}
2915
Alexey Samsonov52550342014-09-15 19:58:40 +00002916// Tries to use a file with the list of dynamic symbols that need to be exported
2917// from the runtime library. Returns true if the file was found.
2918static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2919 ArgStringList &CmdArgs,
2920 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002921 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002922 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2923 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002924 return true;
2925 }
2926 return false;
2927}
2928
2929static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2930 ArgStringList &CmdArgs) {
2931 // Force linking against the system libraries sanitizers depends on
2932 // (see PR15823 why this is necessary).
2933 CmdArgs.push_back("--no-as-needed");
2934 CmdArgs.push_back("-lpthread");
2935 CmdArgs.push_back("-lrt");
2936 CmdArgs.push_back("-lm");
2937 // There's no libdl on FreeBSD.
2938 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2939 CmdArgs.push_back("-ldl");
2940}
2941
2942static void
2943collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2944 SmallVectorImpl<StringRef> &SharedRuntimes,
2945 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002946 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2947 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2948 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002949 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2950 // Collect shared runtimes.
2951 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2952 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002953 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002954 // The stats_client library is also statically linked into DSOs.
2955 if (SanArgs.needsStatsRt())
2956 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002957
Alexey Samsonov52550342014-09-15 19:58:40 +00002958 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002959 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002960 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002961 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002962 }
2963 if (SanArgs.needsAsanRt()) {
2964 if (SanArgs.needsSharedAsanRt()) {
2965 HelperStaticRuntimes.push_back("asan-preinit");
2966 } else {
2967 StaticRuntimes.push_back("asan");
2968 if (SanArgs.linkCXXRuntimes())
2969 StaticRuntimes.push_back("asan_cxx");
2970 }
2971 }
2972 if (SanArgs.needsDfsanRt())
2973 StaticRuntimes.push_back("dfsan");
2974 if (SanArgs.needsLsanRt())
2975 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002976 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002977 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002978 if (SanArgs.linkCXXRuntimes())
2979 StaticRuntimes.push_back("msan_cxx");
2980 }
2981 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002982 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002983 if (SanArgs.linkCXXRuntimes())
2984 StaticRuntimes.push_back("tsan_cxx");
2985 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002986 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002987 StaticRuntimes.push_back("ubsan_standalone");
2988 if (SanArgs.linkCXXRuntimes())
2989 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002990 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002991 if (SanArgs.needsSafeStackRt())
2992 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002993 if (SanArgs.needsCfiRt())
2994 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002995 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002996 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002997 if (SanArgs.linkCXXRuntimes())
2998 StaticRuntimes.push_back("ubsan_standalone_cxx");
2999 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003000 if (SanArgs.needsStatsRt()) {
3001 NonWholeStaticRuntimes.push_back("stats");
3002 RequiredSymbols.push_back("__sanitizer_stats_register");
3003 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003004}
3005
Alexey Samsonov52550342014-09-15 19:58:40 +00003006// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3007// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3008static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003009 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003010 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003011 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003012 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003013 NonWholeStaticRuntimes, HelperStaticRuntimes,
3014 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003015 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003016 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003017 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003018 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003019 bool AddExportDynamic = false;
3020 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003021 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003022 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3023 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003024 for (auto RT : NonWholeStaticRuntimes) {
3025 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3026 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3027 }
3028 for (auto S : RequiredSymbols) {
3029 CmdArgs.push_back("-u");
3030 CmdArgs.push_back(Args.MakeArgString(S));
3031 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003032 // If there is a static runtime with no dynamic list, force all the symbols
3033 // to be dynamic to be sure we export sanitizer interface functions.
3034 if (AddExportDynamic)
3035 CmdArgs.push_back("-export-dynamic");
3036 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003037}
3038
Reid Kleckner86ea7702015-02-04 23:45:07 +00003039static bool areOptimizationsEnabled(const ArgList &Args) {
3040 // Find the last -O arg and see if it is non-zero.
3041 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3042 return !A->getOption().matches(options::OPT_O0);
3043 // Defaults to -O0.
3044 return false;
3045}
3046
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003047static bool shouldUseFramePointerForTarget(const ArgList &Args,
3048 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003049 switch (Triple.getArch()) {
3050 case llvm::Triple::xcore:
3051 case llvm::Triple::wasm32:
3052 case llvm::Triple::wasm64:
3053 // XCore never wants frame pointers, regardless of OS.
3054 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003055 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003056 default:
3057 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003058 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003059
3060 if (Triple.isOSLinux()) {
3061 switch (Triple.getArch()) {
3062 // Don't use a frame pointer on linux if optimizing for certain targets.
3063 case llvm::Triple::mips64:
3064 case llvm::Triple::mips64el:
3065 case llvm::Triple::mips:
3066 case llvm::Triple::mipsel:
3067 case llvm::Triple::systemz:
3068 case llvm::Triple::x86:
3069 case llvm::Triple::x86_64:
3070 return !areOptimizationsEnabled(Args);
3071 default:
3072 return true;
3073 }
3074 }
3075
3076 if (Triple.isOSWindows()) {
3077 switch (Triple.getArch()) {
3078 case llvm::Triple::x86:
3079 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003080 case llvm::Triple::x86_64:
3081 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003082 case llvm::Triple::arm:
3083 case llvm::Triple::thumb:
3084 // Windows on ARM builds with FPO disabled to aid fast stack walking
3085 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003086 default:
3087 // All other supported Windows ISAs use xdata unwind information, so frame
3088 // pointers are not generally useful.
3089 return false;
3090 }
3091 }
3092
3093 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003094}
3095
Rafael Espindola224dd632011-12-14 21:02:23 +00003096static bool shouldUseFramePointer(const ArgList &Args,
3097 const llvm::Triple &Triple) {
3098 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3099 options::OPT_fomit_frame_pointer))
3100 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003101 if (Args.hasArg(options::OPT_pg))
3102 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003103
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003104 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003105}
3106
Eric Christopherb7d97e92013-04-03 01:58:53 +00003107static bool shouldUseLeafFramePointer(const ArgList &Args,
3108 const llvm::Triple &Triple) {
3109 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3110 options::OPT_momit_leaf_frame_pointer))
3111 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003112 if (Args.hasArg(options::OPT_pg))
3113 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003114
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003115 if (Triple.isPS4CPU())
3116 return false;
3117
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003118 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003119}
3120
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003121/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003122static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003123 SmallString<128> cwd;
3124 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003125 CmdArgs.push_back("-fdebug-compilation-dir");
3126 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003127 }
3128}
3129
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003130static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003131 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3132 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3133 SmallString<128> T(FinalOutput->getValue());
3134 llvm::sys::path::replace_extension(T, "dwo");
3135 return Args.MakeArgString(T);
3136 } else {
3137 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003138 SmallString<128> T(
3139 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003140 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003141 llvm::sys::path::replace_extension(F, "dwo");
3142 T += F;
3143 return Args.MakeArgString(F);
3144 }
3145}
3146
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003147static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3148 const JobAction &JA, const ArgList &Args,
3149 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003150 ArgStringList ExtractArgs;
3151 ExtractArgs.push_back("--extract-dwo");
3152
3153 ArgStringList StripArgs;
3154 StripArgs.push_back("--strip-dwo");
3155
3156 // Grabbing the output of the earlier compile step.
3157 StripArgs.push_back(Output.getFilename());
3158 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003159 ExtractArgs.push_back(OutFile);
3160
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003161 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003162 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003163
3164 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003165 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003166
3167 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003168 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003169}
3170
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003171/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003172/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3173static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003174 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003175 if (A->getOption().matches(options::OPT_O4) ||
3176 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003177 return true;
3178
3179 if (A->getOption().matches(options::OPT_O0))
3180 return false;
3181
3182 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3183
Rafael Espindola91780de2013-08-26 14:05:41 +00003184 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003185 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003186 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003187 return true;
3188
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003189 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003190 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003191 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003192
3193 unsigned OptLevel = 0;
3194 if (S.getAsInteger(10, OptLevel))
3195 return false;
3196
3197 return OptLevel > 1;
3198 }
3199
3200 return false;
3201}
3202
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003203/// Add -x lang to \p CmdArgs for \p Input.
3204static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3205 ArgStringList &CmdArgs) {
3206 // When using -verify-pch, we don't want to provide the type
3207 // 'precompiled-header' if it was inferred from the file extension
3208 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3209 return;
3210
3211 CmdArgs.push_back("-x");
3212 if (Args.hasArg(options::OPT_rewrite_objc))
3213 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3214 else
3215 CmdArgs.push_back(types::getTypeName(Input.getType()));
3216}
3217
David Majnemerc371ff02015-03-22 08:39:22 +00003218static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003219 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003220 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003221
3222 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003223 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003224
3225 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003226 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003227 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003228 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003229}
3230
Rafael Espindola577637a2015-01-03 00:06:04 +00003231// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003232// options that build systems might add but are unused when assembling or only
3233// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003234static void claimNoWarnArgs(const ArgList &Args) {
3235 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003236 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003237 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003238 Args.ClaimAllArgs(options::OPT_flto);
3239 Args.ClaimAllArgs(options::OPT_fno_lto);
3240}
3241
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003242static void appendUserToPath(SmallVectorImpl<char> &Result) {
3243#ifdef LLVM_ON_UNIX
3244 const char *Username = getenv("LOGNAME");
3245#else
3246 const char *Username = getenv("USERNAME");
3247#endif
3248 if (Username) {
3249 // Validate that LoginName can be used in a path, and get its length.
3250 size_t Len = 0;
3251 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003252 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003253 Username = nullptr;
3254 break;
3255 }
3256 }
3257
3258 if (Username && Len > 0) {
3259 Result.append(Username, Username + Len);
3260 return;
3261 }
3262 }
3263
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003264// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003265#ifdef LLVM_ON_UNIX
3266 std::string UID = llvm::utostr(getuid());
3267#else
3268 // FIXME: Windows seems to have an 'SID' that might work.
3269 std::string UID = "9999";
3270#endif
3271 Result.append(UID.begin(), UID.end());
3272}
3273
David Majnemere11d3732015-06-08 00:22:46 +00003274VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3275 const llvm::Triple &Triple,
3276 const llvm::opt::ArgList &Args,
3277 bool IsWindowsMSVC) {
3278 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3279 IsWindowsMSVC) ||
3280 Args.hasArg(options::OPT_fmsc_version) ||
3281 Args.hasArg(options::OPT_fms_compatibility_version)) {
3282 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3283 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003284 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003285
3286 if (MSCVersion && MSCompatibilityVersion) {
3287 if (D)
3288 D->Diag(diag::err_drv_argument_not_allowed_with)
3289 << MSCVersion->getAsString(Args)
3290 << MSCompatibilityVersion->getAsString(Args);
3291 return VersionTuple();
3292 }
3293
3294 if (MSCompatibilityVersion) {
3295 VersionTuple MSVT;
3296 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3297 D->Diag(diag::err_drv_invalid_value)
3298 << MSCompatibilityVersion->getAsString(Args)
3299 << MSCompatibilityVersion->getValue();
3300 return MSVT;
3301 }
3302
3303 if (MSCVersion) {
3304 unsigned Version = 0;
3305 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3306 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3307 << MSCVersion->getValue();
3308 return getMSCompatibilityVersion(Version);
3309 }
3310
3311 unsigned Major, Minor, Micro;
3312 Triple.getEnvironmentVersion(Major, Minor, Micro);
3313 if (Major || Minor || Micro)
3314 return VersionTuple(Major, Minor, Micro);
3315
Nico Weber9a952752016-03-23 23:26:59 +00003316 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003317 return VersionTuple(18);
3318 }
3319 return VersionTuple();
3320}
3321
Diego Novilloa0545962015-07-10 18:00:07 +00003322static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3323 const InputInfo &Output, const ArgList &Args,
3324 ArgStringList &CmdArgs) {
3325 auto *ProfileGenerateArg = Args.getLastArg(
3326 options::OPT_fprofile_instr_generate,
3327 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003328 options::OPT_fprofile_generate_EQ,
3329 options::OPT_fno_profile_instr_generate);
3330 if (ProfileGenerateArg &&
3331 ProfileGenerateArg->getOption().matches(
3332 options::OPT_fno_profile_instr_generate))
3333 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003334
3335 auto *ProfileUseArg = Args.getLastArg(
3336 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003337 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3338 options::OPT_fno_profile_instr_use);
3339 if (ProfileUseArg &&
3340 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3341 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003342
3343 if (ProfileGenerateArg && ProfileUseArg)
3344 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003345 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003346
Diego Novillo758f3f52015-08-05 21:49:51 +00003347 if (ProfileGenerateArg) {
3348 if (ProfileGenerateArg->getOption().matches(
3349 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003350 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3351 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003352 else if (ProfileGenerateArg->getOption().matches(
3353 options::OPT_fprofile_generate_EQ)) {
3354 SmallString<128> Path(ProfileGenerateArg->getValue());
3355 llvm::sys::path::append(Path, "default.profraw");
3356 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003357 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3358 }
3359 // The default is to use Clang Instrumentation.
3360 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003361 }
Diego Novilloa0545962015-07-10 18:00:07 +00003362
Diego Novillo758f3f52015-08-05 21:49:51 +00003363 if (ProfileUseArg) {
3364 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003365 CmdArgs.push_back(Args.MakeArgString(
3366 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003367 else if ((ProfileUseArg->getOption().matches(
3368 options::OPT_fprofile_use_EQ) ||
3369 ProfileUseArg->getOption().matches(
3370 options::OPT_fprofile_instr_use))) {
3371 SmallString<128> Path(
3372 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3373 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3374 llvm::sys::path::append(Path, "default.profdata");
3375 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003376 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003377 }
Diego Novilloa0545962015-07-10 18:00:07 +00003378 }
3379
3380 if (Args.hasArg(options::OPT_ftest_coverage) ||
3381 Args.hasArg(options::OPT_coverage))
3382 CmdArgs.push_back("-femit-coverage-notes");
3383 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3384 false) ||
3385 Args.hasArg(options::OPT_coverage))
3386 CmdArgs.push_back("-femit-coverage-data");
3387
Diego Novilloc4b94da2015-08-05 23:27:40 +00003388 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3389 options::OPT_fno_coverage_mapping, false) &&
3390 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003391 D.Diag(diag::err_drv_argument_only_allowed_with)
3392 << "-fcoverage-mapping"
3393 << "-fprofile-instr-generate";
3394
Diego Novilloc4b94da2015-08-05 23:27:40 +00003395 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3396 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003397 CmdArgs.push_back("-fcoverage-mapping");
3398
3399 if (C.getArgs().hasArg(options::OPT_c) ||
3400 C.getArgs().hasArg(options::OPT_S)) {
3401 if (Output.isFilename()) {
3402 CmdArgs.push_back("-coverage-file");
3403 SmallString<128> CoverageFilename;
3404 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3405 CoverageFilename = FinalOutput->getValue();
3406 } else {
3407 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3408 }
3409 if (llvm::sys::path::is_relative(CoverageFilename)) {
3410 SmallString<128> Pwd;
3411 if (!llvm::sys::fs::current_path(Pwd)) {
3412 llvm::sys::path::append(Pwd, CoverageFilename);
3413 CoverageFilename.swap(Pwd);
3414 }
3415 }
3416 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3417 }
3418 }
3419}
3420
Paul Robinsond083b9a2015-12-16 17:25:27 +00003421static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3422 ArgStringList &CmdArgs) {
3423 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3424 false) ||
3425 Args.hasFlag(options::OPT_fprofile_generate,
3426 options::OPT_fno_profile_instr_generate, false) ||
3427 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3428 options::OPT_fno_profile_instr_generate, false) ||
3429 Args.hasFlag(options::OPT_fprofile_instr_generate,
3430 options::OPT_fno_profile_instr_generate, false) ||
3431 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3432 options::OPT_fno_profile_instr_generate, false) ||
3433 Args.hasArg(options::OPT_fcreate_profile) ||
3434 Args.hasArg(options::OPT_coverage)))
3435 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3436}
3437
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003438/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3439/// smooshes them together with platform defaults, to decide whether
3440/// this compile should be using PIC mode or not. Returns a tuple of
3441/// (RelocationModel, PICLevel, IsPIE).
3442static std::tuple<llvm::Reloc::Model, unsigned, bool>
3443ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3444 const ArgList &Args) {
3445 // FIXME: why does this code...and so much everywhere else, use both
3446 // ToolChain.getTriple() and Triple?
3447 bool PIE = ToolChain.isPIEDefault();
3448 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003449 // The Darwin/MachO default to use PIC does not apply when using -static.
3450 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3451 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003452 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003453 bool IsPICLevelTwo = PIC;
3454
3455 bool KernelOrKext =
3456 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3457
3458 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003459 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003460 switch (ToolChain.getArch()) {
3461 case llvm::Triple::arm:
3462 case llvm::Triple::armeb:
3463 case llvm::Triple::thumb:
3464 case llvm::Triple::thumbeb:
3465 case llvm::Triple::aarch64:
3466 case llvm::Triple::mips:
3467 case llvm::Triple::mipsel:
3468 case llvm::Triple::mips64:
3469 case llvm::Triple::mips64el:
3470 PIC = true; // "-fpic"
3471 break;
3472
3473 case llvm::Triple::x86:
3474 case llvm::Triple::x86_64:
3475 PIC = true; // "-fPIC"
3476 IsPICLevelTwo = true;
3477 break;
3478
3479 default:
3480 break;
3481 }
3482 }
3483
3484 // OpenBSD-specific defaults for PIE
3485 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3486 switch (ToolChain.getArch()) {
3487 case llvm::Triple::mips64:
3488 case llvm::Triple::mips64el:
3489 case llvm::Triple::sparcel:
3490 case llvm::Triple::x86:
3491 case llvm::Triple::x86_64:
3492 IsPICLevelTwo = false; // "-fpie"
3493 break;
3494
3495 case llvm::Triple::ppc:
3496 case llvm::Triple::sparc:
3497 case llvm::Triple::sparcv9:
3498 IsPICLevelTwo = true; // "-fPIE"
3499 break;
3500
3501 default:
3502 break;
3503 }
3504 }
3505
3506 // The last argument relating to either PIC or PIE wins, and no
3507 // other argument is used. If the last argument is any flavor of the
3508 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3509 // option implicitly enables PIC at the same level.
3510 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3511 options::OPT_fpic, options::OPT_fno_pic,
3512 options::OPT_fPIE, options::OPT_fno_PIE,
3513 options::OPT_fpie, options::OPT_fno_pie);
3514 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3515 // is forced, then neither PIC nor PIE flags will have no effect.
3516 if (!ToolChain.isPICDefaultForced()) {
3517 if (LastPICArg) {
3518 Option O = LastPICArg->getOption();
3519 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3520 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3521 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3522 PIC =
3523 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3524 IsPICLevelTwo =
3525 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3526 } else {
3527 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003528 if (Triple.isPS4CPU()) {
3529 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3530 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3531 if (Model != "kernel") {
3532 PIC = true;
3533 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3534 << LastPICArg->getSpelling();
3535 }
3536 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003537 }
3538 }
3539 }
3540
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003541 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3542 // PIC level would've been set to level 1, force it back to level 2 PIC
3543 // instead.
3544 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003545 IsPICLevelTwo |= ToolChain.isPICDefault();
3546
James Y Knightc4015d32015-08-21 04:14:55 +00003547 // This kernel flags are a trump-card: they will disable PIC/PIE
3548 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003549 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3550 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003551 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003552
3553 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3554 // This is a very special mode. It trumps the other modes, almost no one
3555 // uses it, and it isn't even valid on any OS but Darwin.
3556 if (!ToolChain.getTriple().isOSDarwin())
3557 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3558 << A->getSpelling() << ToolChain.getTriple().str();
3559
3560 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3561
3562 // Only a forced PIC mode can cause the actual compile to have PIC defines
3563 // etc., no flags are sufficient. This behavior was selected to closely
3564 // match that of llvm-gcc and Apple GCC before that.
3565 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3566
3567 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3568 }
3569
3570 if (PIC)
3571 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3572
3573 return std::make_tuple(llvm::Reloc::Static, 0, false);
3574}
3575
3576static const char *RelocationModelName(llvm::Reloc::Model Model) {
3577 switch (Model) {
3578 case llvm::Reloc::Default:
3579 return nullptr;
3580 case llvm::Reloc::Static:
3581 return "static";
3582 case llvm::Reloc::PIC_:
3583 return "pic";
3584 case llvm::Reloc::DynamicNoPIC:
3585 return "dynamic-no-pic";
3586 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003587 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003588}
3589
3590static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3591 ArgStringList &CmdArgs) {
3592 llvm::Reloc::Model RelocationModel;
3593 unsigned PICLevel;
3594 bool IsPIE;
3595 std::tie(RelocationModel, PICLevel, IsPIE) =
3596 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3597
3598 if (RelocationModel != llvm::Reloc::Static)
3599 CmdArgs.push_back("-KPIC");
3600}
3601
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003602void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003603 const InputInfo &Output, const InputInfoList &Inputs,
3604 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003605 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3606 const llvm::Triple Triple(TripleStr);
3607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003608 bool KernelOrKext =
3609 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003610 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003611 ArgStringList CmdArgs;
3612
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003613 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003614 bool IsWindowsCygnus =
3615 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003616 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003617 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003618
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003619 // Check number of inputs for sanity. We need at least one input.
3620 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003621 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003622 // CUDA compilation may have multiple inputs (source file + results of
3623 // device-side compilations). All other jobs are expected to have exactly one
3624 // input.
3625 bool IsCuda = types::isCuda(Input.getType());
3626 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003627
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003628 // Invoke ourselves in -cc1 mode.
3629 //
3630 // FIXME: Implement custom jobs for internal actions.
3631 CmdArgs.push_back("-cc1");
3632
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003633 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003634 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003635 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003636
Artem Belevichfa11ab52015-11-17 22:28:46 +00003637 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003638 if (IsCuda) {
3639 // FIXME: We need a (better) way to pass information about
3640 // particular compilation pass we're constructing here. For now we
3641 // can check which toolchain we're using and pick the other one to
3642 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003643 if (&getToolChain() == C.getCudaDeviceToolChain())
3644 AuxToolChain = C.getCudaHostToolChain();
3645 else if (&getToolChain() == C.getCudaHostToolChain())
3646 AuxToolChain = C.getCudaDeviceToolChain();
3647 else
3648 llvm_unreachable("Can't figure out CUDA compilation mode.");
3649 assert(AuxToolChain != nullptr && "No aux toolchain.");
3650 CmdArgs.push_back("-aux-triple");
3651 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3652 }
3653
James Y Knight2db38f32015-08-15 03:45:25 +00003654 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3655 Triple.getArch() == llvm::Triple::thumb)) {
3656 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003657 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003658 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003659 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003660 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003661 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003662 }
3663
Tim Northover336f1892014-03-29 13:16:12 +00003664 // Push all default warning arguments that are specific to
3665 // the given target. These come before user provided warning options
3666 // are provided.
3667 getToolChain().addClangWarningOptions(CmdArgs);
3668
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003669 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003670 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003671
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003672 if (isa<AnalyzeJobAction>(JA)) {
3673 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3674 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003675 } else if (isa<MigrateJobAction>(JA)) {
3676 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003677 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003678 if (Output.getType() == types::TY_Dependencies)
3679 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003680 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003681 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003682 if (Args.hasArg(options::OPT_rewrite_objc) &&
3683 !Args.hasArg(options::OPT_g_Group))
3684 CmdArgs.push_back("-P");
3685 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003686 } else if (isa<AssembleJobAction>(JA)) {
3687 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003688
David Blaikie9260ed62013-07-25 21:19:01 +00003689 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003690
3691 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003692 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003693 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003694 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003695 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003696
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003697 if (JA.getType() == types::TY_Nothing)
3698 CmdArgs.push_back("-fsyntax-only");
3699 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003700 CmdArgs.push_back("-emit-pch");
3701 else
3702 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003703 } else if (isa<VerifyPCHJobAction>(JA)) {
3704 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003705 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003706 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3707 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003708 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003709 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003710 } else if (JA.getType() == types::TY_LLVM_IR ||
3711 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003712 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003713 } else if (JA.getType() == types::TY_LLVM_BC ||
3714 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003715 CmdArgs.push_back("-emit-llvm-bc");
3716 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003717 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003718 } else if (JA.getType() == types::TY_AST) {
3719 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003720 } else if (JA.getType() == types::TY_ModuleFile) {
3721 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003722 } else if (JA.getType() == types::TY_RewrittenObjC) {
3723 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003724 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003725 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3726 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003727 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003728 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003729 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003730 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003731
3732 // Preserve use-list order by default when emitting bitcode, so that
3733 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3734 // same result as running passes here. For LTO, we don't need to preserve
3735 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003736 if (JA.getType() == types::TY_LLVM_BC)
3737 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003738
3739 if (D.isUsingLTO())
3740 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003741 }
3742
Teresa Johnsonaff22322015-12-07 19:21:34 +00003743 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3744 if (!types::isLLVMIR(Input.getType()))
3745 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3746 << "-x ir";
3747 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3748 }
3749
Steven Wu574b0f22016-03-01 01:07:58 +00003750 // Embed-bitcode option.
3751 if (C.getDriver().embedBitcodeEnabled() &&
3752 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3753 // Add flags implied by -fembed-bitcode.
3754 CmdArgs.push_back("-fembed-bitcode");
3755 // Disable all llvm IR level optimizations.
3756 CmdArgs.push_back("-disable-llvm-optzns");
3757 }
3758 if (C.getDriver().embedBitcodeMarkerOnly())
3759 CmdArgs.push_back("-fembed-bitcode-marker");
3760
Justin Bognera88f0122014-06-20 22:59:50 +00003761 // We normally speed up the clang process a bit by skipping destructors at
3762 // exit, but when we're generating diagnostics we can rely on some of the
3763 // cleanup.
3764 if (!C.isForDiagnostics())
3765 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003766
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003767// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003768#ifdef NDEBUG
3769 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003770 // Discard LLVM value names in -asserts builds.
3771 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003772#endif
3773
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003774 // Set the main file name, so that debug info works even with
3775 // -save-temps.
3776 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003777 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003778
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003779 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003780 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003781 if (Args.hasArg(options::OPT_static))
3782 CmdArgs.push_back("-static-define");
3783
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003784 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003785 // Enable region store model by default.
3786 CmdArgs.push_back("-analyzer-store=region");
3787
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003788 // Treat blocks as analysis entry points.
3789 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3790
Ted Kremenek49c79792011-03-24 00:28:47 +00003791 CmdArgs.push_back("-analyzer-eagerly-assume");
3792
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003793 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003794 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003795 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003796
Devin Coughlin65c77082016-01-21 20:09:49 +00003797 if (!IsWindowsMSVC) {
3798 CmdArgs.push_back("-analyzer-checker=unix");
3799 } else {
3800 // Enable "unix" checkers that also work on Windows.
3801 CmdArgs.push_back("-analyzer-checker=unix.API");
3802 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3803 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3804 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3805 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3806 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3807 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003808
Sean Evesonb38c32b2016-01-06 10:03:58 +00003809 // Disable some unix checkers for PS4.
3810 if (IsPS4CPU) {
3811 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3812 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3813 }
3814
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003815 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003816 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003817
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003818 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003819
Artem Belevichba558952015-05-06 18:20:23 +00003820 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003821 CmdArgs.push_back("-analyzer-checker=cplusplus");
3822
Sean Evesonb38c32b2016-01-06 10:03:58 +00003823 if (!IsPS4CPU) {
3824 CmdArgs.push_back(
3825 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3826 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3827 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3828 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3829 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3830 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3831 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003832
3833 // Default nullability checks.
3834 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3835 CmdArgs.push_back(
3836 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003837 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003838
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003839 // Set the output format. The default is plist, for (lame) historical
3840 // reasons.
3841 CmdArgs.push_back("-analyzer-output");
3842 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003843 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003844 else
3845 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003846
Ted Kremenekfe449a22010-03-22 22:32:05 +00003847 // Disable the presentation of standard compiler warnings when
3848 // using --analyze. We only want to show static analyzer diagnostics
3849 // or frontend errors.
3850 CmdArgs.push_back("-w");
3851
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003852 // Add -Xanalyzer arguments when running as analyzer.
3853 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003854 }
3855
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003856 CheckCodeGenerationOptions(D, Args);
3857
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003858 llvm::Reloc::Model RelocationModel;
3859 unsigned PICLevel;
3860 bool IsPIE;
3861 std::tie(RelocationModel, PICLevel, IsPIE) =
3862 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003863
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003864 const char *RMName = RelocationModelName(RelocationModel);
3865 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003866 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003867 CmdArgs.push_back(RMName);
3868 }
3869 if (PICLevel > 0) {
3870 CmdArgs.push_back("-pic-level");
3871 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3872 if (IsPIE) {
3873 CmdArgs.push_back("-pie-level");
3874 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003875 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003876 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003877
Renato Golin4854d802015-11-09 12:40:41 +00003878 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3879 CmdArgs.push_back("-meabi");
3880 CmdArgs.push_back(A->getValue());
3881 }
3882
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003883 CmdArgs.push_back("-mthread-model");
3884 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3885 CmdArgs.push_back(A->getValue());
3886 else
3887 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3888
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003889 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3890
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003891 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3892 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003893 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003894
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003895 // LLVM Code Generator Options.
3896
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003897 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3898 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003899 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3900 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003901 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003902 CmdArgs.push_back(A->getValue());
3903 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003904 }
3905 }
3906
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003907 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3908 StringRef v = A->getValue();
3909 CmdArgs.push_back("-mllvm");
3910 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3911 A->claim();
3912 }
3913
Nirav Daved2f44d82016-04-05 17:50:43 +00003914 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3915 true))
3916 CmdArgs.push_back("-fno-jump-tables");
3917
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003918 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3919 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003920 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003921 }
3922
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003923 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3924 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003925 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003926 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003927 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003928 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3929 CmdArgs.push_back("-fpcc-struct-return");
3930 } else {
3931 assert(A->getOption().matches(options::OPT_freg_struct_return));
3932 CmdArgs.push_back("-freg-struct-return");
3933 }
3934 }
3935
Roman Divacky65b88cd2011-03-01 17:40:53 +00003936 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3937 CmdArgs.push_back("-mrtd");
3938
Rafael Espindola224dd632011-12-14 21:02:23 +00003939 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003940 CmdArgs.push_back("-mdisable-fp-elim");
3941 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3942 options::OPT_fno_zero_initialized_in_bss))
3943 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003944
3945 bool OFastEnabled = isOptimizationLevelFast(Args);
3946 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3947 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003948 OptSpecifier StrictAliasingAliasOption =
3949 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003950 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3951 // doesn't do any TBAA.
3952 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003953 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003954 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003955 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003956 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3957 options::OPT_fno_struct_path_tbaa))
3958 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003959 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3960 false))
3961 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003962 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3963 options::OPT_fno_strict_vtable_pointers,
3964 false))
3965 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003966 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3967 options::OPT_fno_optimize_sibling_calls))
3968 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003969
Eric Christopher006208c2013-04-04 06:29:47 +00003970 // Handle segmented stacks.
3971 if (Args.hasArg(options::OPT_fsplit_stack))
3972 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003973
3974 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3975 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003976 OptSpecifier FastMathAliasOption =
3977 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3978
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003979 // Handle various floating point optimization flags, mapping them to the
3980 // appropriate LLVM code generation flags. The pattern for all of these is to
3981 // default off the codegen optimizations, and if any flag enables them and no
3982 // flag disables them after the flag enabling them, enable the codegen
3983 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003984 if (Arg *A = Args.getLastArg(
3985 options::OPT_ffast_math, FastMathAliasOption,
3986 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3987 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3988 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003989 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3990 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003991 A->getOption().getID() != options::OPT_fhonor_infinities)
3992 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003993 if (Arg *A = Args.getLastArg(
3994 options::OPT_ffast_math, FastMathAliasOption,
3995 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3996 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3997 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003998 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3999 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004000 A->getOption().getID() != options::OPT_fhonor_nans)
4001 CmdArgs.push_back("-menable-no-nans");
4002
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004003 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4004 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004005 if (Arg *A =
4006 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4007 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4008 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004009 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4010 // However, turning *off* -ffast_math merely restores the toolchain default
4011 // (which may be false).
4012 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4013 A->getOption().getID() == options::OPT_ffast_math ||
4014 A->getOption().getID() == options::OPT_Ofast)
4015 MathErrno = false;
4016 else if (A->getOption().getID() == options::OPT_fmath_errno)
4017 MathErrno = true;
4018 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004019 if (MathErrno)
4020 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004021
4022 // There are several flags which require disabling very specific
4023 // optimizations. Any of these being disabled forces us to turn off the
4024 // entire set of LLVM optimizations, so collect them through all the flag
4025 // madness.
4026 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 if (Arg *A = Args.getLastArg(
4028 options::OPT_ffast_math, FastMathAliasOption,
4029 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4030 options::OPT_fno_unsafe_math_optimizations,
4031 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004032 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4033 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004034 A->getOption().getID() != options::OPT_fno_associative_math)
4035 AssociativeMath = true;
4036 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004037 if (Arg *A = Args.getLastArg(
4038 options::OPT_ffast_math, FastMathAliasOption,
4039 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4040 options::OPT_fno_unsafe_math_optimizations,
4041 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004042 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4043 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004044 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4045 ReciprocalMath = true;
4046 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004047 if (Arg *A = Args.getLastArg(
4048 options::OPT_ffast_math, FastMathAliasOption,
4049 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4050 options::OPT_fno_unsafe_math_optimizations,
4051 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004052 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4053 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004054 A->getOption().getID() != options::OPT_fsigned_zeros)
4055 SignedZeros = false;
4056 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004057 if (Arg *A = Args.getLastArg(
4058 options::OPT_ffast_math, FastMathAliasOption,
4059 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4060 options::OPT_fno_unsafe_math_optimizations,
4061 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004062 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4063 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004064 A->getOption().getID() != options::OPT_ftrapping_math)
4065 TrappingMath = false;
4066 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4067 !TrappingMath)
4068 CmdArgs.push_back("-menable-unsafe-fp-math");
4069
Sanjay Patel76c9e092015-01-23 16:40:50 +00004070 if (!SignedZeros)
4071 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004072
Sanjay Patel359b1052015-04-09 15:03:23 +00004073 if (ReciprocalMath)
4074 CmdArgs.push_back("-freciprocal-math");
4075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004076 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004077 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004078 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004079 options::OPT_ffp_contract)) {
4080 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004081 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004082 if (Val == "fast" || Val == "on" || Val == "off") {
4083 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4084 } else {
4085 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004086 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004087 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004088 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4089 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004090 // If fast-math is set then set the fp-contract mode to fast.
4091 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4092 }
4093 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004094
Sanjay Patel2987c292015-06-11 14:53:41 +00004095 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004096
Bob Wilson6a039162012-07-19 03:52:53 +00004097 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4098 // and if we find them, tell the frontend to provide the appropriate
4099 // preprocessor macros. This is distinct from enabling any optimizations as
4100 // these options induce language changes which must survive serialization
4101 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004102 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4103 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004104 if (!A->getOption().matches(options::OPT_fno_fast_math))
4105 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004106 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4107 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004108 if (A->getOption().matches(options::OPT_ffinite_math_only))
4109 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004110
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004111 // Decide whether to use verbose asm. Verbose assembly is the default on
4112 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004113 bool IsIntegratedAssemblerDefault =
4114 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004115 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004116 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004117 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004118 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004119
Rafael Espindolab8a12932015-05-22 20:44:03 +00004120 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4121 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004122 CmdArgs.push_back("-no-integrated-as");
4123
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004124 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4125 CmdArgs.push_back("-mdebug-pass");
4126 CmdArgs.push_back("Structure");
4127 }
4128 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4129 CmdArgs.push_back("-mdebug-pass");
4130 CmdArgs.push_back("Arguments");
4131 }
4132
Justin Lebar710a35f2016-01-25 22:36:35 +00004133 // Enable -mconstructor-aliases except on darwin, where we have to work around
4134 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4135 // aliases aren't supported.
4136 if (!getToolChain().getTriple().isOSDarwin() &&
4137 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004138 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004139
John McCall7ef5cb32011-03-18 02:56:14 +00004140 // Darwin's kernel doesn't support guard variables; just die if we
4141 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004142 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004143 CmdArgs.push_back("-fforbid-guard-variables");
4144
Akira Hatanaka02028482015-11-12 17:21:22 +00004145 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4146 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004147 CmdArgs.push_back("-mms-bitfields");
4148 }
John McCall8517abc2010-02-19 02:45:38 +00004149
Daniel Dunbar306945d2009-09-16 06:17:29 +00004150 // This is a coarse approximation of what llvm-gcc actually does, both
4151 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4152 // complicated ways.
4153 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004154 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4155 options::OPT_fno_asynchronous_unwind_tables,
4156 (getToolChain().IsUnwindTablesDefault() ||
4157 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4158 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004159 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4160 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004161 CmdArgs.push_back("-munwind-tables");
4162
Chandler Carruth05fb5852012-11-21 23:40:23 +00004163 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004164
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004165 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4166 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004167 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004168 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004169
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004170 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004171 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004172
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004173 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004174 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004175 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004176 }
4177
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004178 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004179 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004180 if (!CPU.empty()) {
4181 CmdArgs.push_back("-target-cpu");
4182 CmdArgs.push_back(Args.MakeArgString(CPU));
4183 }
4184
Rafael Espindolaeb265472013-08-21 21:59:03 +00004185 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4186 CmdArgs.push_back("-mfpmath");
4187 CmdArgs.push_back(A->getValue());
4188 }
4189
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004190 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004191 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004192
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004193 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004194 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004195 default:
4196 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004197
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004198 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004199 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004200 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004201 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004202 // Use the effective triple, which takes into account the deployment target.
4203 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004204 break;
4205
Tim Northover573cbee2014-05-24 12:52:07 +00004206 case llvm::Triple::aarch64:
4207 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004208 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004209 break;
4210
Eric Christopher0b26a612010-03-02 02:41:08 +00004211 case llvm::Triple::mips:
4212 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004213 case llvm::Triple::mips64:
4214 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004215 AddMIPSTargetArgs(Args, CmdArgs);
4216 break;
4217
Ulrich Weigand8afad612014-07-28 13:17:52 +00004218 case llvm::Triple::ppc:
4219 case llvm::Triple::ppc64:
4220 case llvm::Triple::ppc64le:
4221 AddPPCTargetArgs(Args, CmdArgs);
4222 break;
4223
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004224 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004225 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004226 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004227 AddSparcTargetArgs(Args, CmdArgs);
4228 break;
4229
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004230 case llvm::Triple::x86:
4231 case llvm::Triple::x86_64:
4232 AddX86TargetArgs(Args, CmdArgs);
4233 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004234
Jacques Pienaard964cc22016-03-28 21:02:54 +00004235 case llvm::Triple::lanai:
4236 AddLanaiTargetArgs(Args, CmdArgs);
4237 break;
4238
Tony Linthicum76329bf2011-12-12 21:14:55 +00004239 case llvm::Triple::hexagon:
4240 AddHexagonTargetArgs(Args, CmdArgs);
4241 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004242
4243 case llvm::Triple::wasm32:
4244 case llvm::Triple::wasm64:
4245 AddWebAssemblyTargetArgs(Args, CmdArgs);
4246 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004247 }
4248
Douglas Katzman3459ce22015-10-08 04:24:12 +00004249 // The 'g' groups options involve a somewhat intricate sequence of decisions
4250 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004251 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004252 // * what level of debug info to generate
4253 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004254 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004255 // This avoids having to monkey around further in cc1 other than to disable
4256 // codeview if not running in a Windows environment. Perhaps even that
4257 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004258 unsigned DwarfVersion = 0;
4259 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4260 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004261 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004262 bool EmitCodeView = false;
4263
Hans Wennborg75958c42013-08-08 00:17:41 +00004264 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004265 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004266 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004267 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004268
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004269 // Pass the linker version in use.
4270 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4271 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004272 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004273 }
4274
Eric Christopherb7d97e92013-04-03 01:58:53 +00004275 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004276 CmdArgs.push_back("-momit-leaf-frame-pointer");
4277
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004278 // Explicitly error on some things we know we don't support and can't just
4279 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004280 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4281 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004282 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004283 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004284 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4285 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004286 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004288 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004289 }
4290
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004291 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004292 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004293 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004294 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004295 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4296 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004297 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004298 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004299 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004300
Chad Rosierbe10f982011-08-02 17:58:04 +00004301 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004302 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004303 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4304 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004305 }
4306
Rafael Espindola08a692a2010-03-07 04:46:18 +00004307 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004308 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004309 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004310 // If the last option explicitly specified a debug-info level, use it.
4311 if (A->getOption().matches(options::OPT_gN_Group)) {
4312 DebugInfoKind = DebugLevelToInfoKind(*A);
4313 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4314 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4315 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004316 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004317 A->getIndex() > SplitDwarfArg->getIndex())
4318 SplitDwarfArg = nullptr;
4319 } else
4320 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004321 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004322 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004323
Paul Robinson0334a042015-12-19 19:41:48 +00004324 // If a debugger tuning argument appeared, remember it.
4325 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4326 options::OPT_ggdbN_Group)) {
4327 if (A->getOption().matches(options::OPT_glldb))
4328 DebuggerTuning = llvm::DebuggerKind::LLDB;
4329 else if (A->getOption().matches(options::OPT_gsce))
4330 DebuggerTuning = llvm::DebuggerKind::SCE;
4331 else
4332 DebuggerTuning = llvm::DebuggerKind::GDB;
4333 }
4334
4335 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004336 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004337 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004338 DwarfVersion = DwarfVersionNum(A->getSpelling());
4339
Reid Kleckner124955a2015-08-05 18:51:13 +00004340 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004341 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4342 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4343 // DwarfVersion remains at 0 if no explicit choice was made.
4344 CmdArgs.push_back("-gcodeview");
4345 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004346 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004347 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4348 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004349
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004350 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4351 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004352
4353 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004354 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004355 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004356 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004357
Eric Christopher138c32b2013-09-13 22:37:55 +00004358 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004359 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004360 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004361 CmdArgs.push_back("-dwarf-ext-refs");
4362 CmdArgs.push_back("-fmodule-format=obj");
4363 }
4364
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004365 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4366 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004367 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004368 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004369 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004370 CmdArgs.push_back("-backend-option");
4371 CmdArgs.push_back("-split-dwarf=Enable");
4372 }
4373
Douglas Katzman3459ce22015-10-08 04:24:12 +00004374 // After we've dealt with all combinations of things that could
4375 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4376 // figure out if we need to "upgrade" it to standalone debug info.
4377 // We parse these two '-f' options whether or not they will be used,
4378 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4379 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4380 options::OPT_fno_standalone_debug,
4381 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004382 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4383 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004384 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4385 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004386
Eric Christopher138c32b2013-09-13 22:37:55 +00004387 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4388 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4389 CmdArgs.push_back("-backend-option");
4390 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4391 }
Eric Christophereec89c22013-06-18 00:03:50 +00004392
Eric Christopher0d403d22014-02-14 01:27:03 +00004393 // -gdwarf-aranges turns on the emission of the aranges section in the
4394 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004395 // Always enabled on the PS4.
4396 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004397 CmdArgs.push_back("-backend-option");
4398 CmdArgs.push_back("-generate-arange-section");
4399 }
4400
David Blaikief36d9ba2014-01-27 18:52:43 +00004401 if (Args.hasFlag(options::OPT_fdebug_types_section,
4402 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004403 CmdArgs.push_back("-backend-option");
4404 CmdArgs.push_back("-generate-type-units");
4405 }
Eric Christophereec89c22013-06-18 00:03:50 +00004406
Dan Gohmana5b804b2016-01-07 00:50:27 +00004407 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4408 // default.
4409 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4410 Triple.getArch() == llvm::Triple::wasm32 ||
4411 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004412
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004413 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004414 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004415 CmdArgs.push_back("-ffunction-sections");
4416 }
4417
Peter Collingbourneceef1452016-02-24 22:03:06 +00004418 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4419 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004420 if (!D.isUsingLTO())
4421 D.Diag(diag::err_drv_argument_only_allowed_with)
4422 << "-fwhole-program-vtables"
4423 << "-flto";
4424 CmdArgs.push_back("-fwhole-program-vtables");
4425
4426 clang::SmallString<64> Path(D.ResourceDir);
4427 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4428 if (llvm::sys::fs::exists(Path)) {
4429 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4430 BlacklistOpt += Path.str();
4431 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4432 }
4433
4434 for (const Arg *A :
4435 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4436 A->claim();
4437 if (!llvm::sys::fs::exists(A->getValue()))
4438 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4439 }
4440
4441 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4442 }
4443
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004444 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4445 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004446 CmdArgs.push_back("-fdata-sections");
4447 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004448
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004449 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004450 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004451 CmdArgs.push_back("-fno-unique-section-names");
4452
Chris Lattner3c77a352010-06-22 00:03:40 +00004453 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4454
Diego Novilloa0545962015-07-10 18:00:07 +00004455 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004456
Paul Robinsond083b9a2015-12-16 17:25:27 +00004457 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4458 if (getToolChain().getTriple().isPS4CPU())
4459 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4460
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004461 // Pass options for controlling the default header search paths.
4462 if (Args.hasArg(options::OPT_nostdinc)) {
4463 CmdArgs.push_back("-nostdsysteminc");
4464 CmdArgs.push_back("-nobuiltininc");
4465 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004466 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004467 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004468 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4469 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4470 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004471
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004472 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004473 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004474 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004475
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004476 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4477
Ted Kremenekf7639e12012-03-06 20:06:33 +00004478 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004479 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004480 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004481 options::OPT_ccc_arcmt_modify,
4482 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004483 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004484 switch (A->getOption().getID()) {
4485 default:
4486 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004487 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004488 CmdArgs.push_back("-arcmt-check");
4489 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004490 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004491 CmdArgs.push_back("-arcmt-modify");
4492 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004493 case options::OPT_ccc_arcmt_migrate:
4494 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004495 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004496 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004497
4498 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4499 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004500 break;
John McCalld70fb982011-06-15 23:25:17 +00004501 }
4502 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004503 } else {
4504 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4505 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4506 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004507 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004508
Ted Kremenekf7639e12012-03-06 20:06:33 +00004509 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4510 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004511 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4512 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004513 }
4514 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004515 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004516
4517 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004518 options::OPT_objcmt_migrate_subscripting,
4519 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004520 // None specified, means enable them all.
4521 CmdArgs.push_back("-objcmt-migrate-literals");
4522 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004523 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004524 } else {
4525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004528 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004529 } else {
4530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4533 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4534 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4535 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004546 }
4547
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004548 // Add preprocessing options like -I, -D, etc. if we are using the
4549 // preprocessor.
4550 //
4551 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004552 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004553 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4554 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004555
Rafael Espindolaa7431922011-07-21 23:40:37 +00004556 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4557 // that "The compiler can only warn and ignore the option if not recognized".
4558 // When building with ccache, it will pass -D options to clang even on
4559 // preprocessed inputs and configure concludes that -fPIC is not supported.
4560 Args.ClaimAllArgs(options::OPT_D);
4561
Alp Toker7874bdc2013-11-15 20:40:58 +00004562 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004563 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4564 if (A->getOption().matches(options::OPT_O4)) {
4565 CmdArgs.push_back("-O3");
4566 D.Diag(diag::warn_O4_is_O3);
4567 } else {
4568 A->render(Args, CmdArgs);
4569 }
4570 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004571
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004572 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004573 for (const Arg *A :
4574 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4575 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004576 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004577 }
4578
Rafael Espindola577637a2015-01-03 00:06:04 +00004579 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004580
Richard Smith3be1cb22014-08-07 00:24:21 +00004581 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004582 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004583 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4584 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004585 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004586 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004587
4588 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004589 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004590 //
4591 // If a std is supplied, only add -trigraphs if it follows the
4592 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004593 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004594 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4595 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004596 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004597 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004598 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004599 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004600 else
4601 Std->render(Args, CmdArgs);
4602
Nico Weber00721502014-12-23 22:32:37 +00004603 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004604 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004605 options::OPT_ftrigraphs,
4606 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004607 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004608 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004609 } else {
4610 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004611 //
4612 // FIXME: Clang doesn't correctly handle -std= when the input language
4613 // doesn't match. For the time being just ignore this for C++ inputs;
4614 // eventually we want to do all the standard defaulting here instead of
4615 // splitting it between the driver and clang -cc1.
4616 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004617 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4618 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004619 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004620 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004621
Nico Weber00721502014-12-23 22:32:37 +00004622 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4623 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004624 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004625
Richard Smith282b4492013-09-04 22:50:31 +00004626 // GCC's behavior for -Wwrite-strings is a bit strange:
4627 // * In C, this "warning flag" changes the types of string literals from
4628 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4629 // for the discarded qualifier.
4630 // * In C++, this is just a normal warning flag.
4631 //
4632 // Implementing this warning correctly in C is hard, so we follow GCC's
4633 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4634 // a non-const char* in C, rather than using this crude hack.
4635 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004636 // FIXME: This should behave just like a warning flag, and thus should also
4637 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4638 Arg *WriteStrings =
4639 Args.getLastArg(options::OPT_Wwrite_strings,
4640 options::OPT_Wno_write_strings, options::OPT_w);
4641 if (WriteStrings &&
4642 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004643 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004644 }
4645
Chandler Carruth61fbf622011-04-23 09:27:53 +00004646 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004647 // during C++ compilation, which it is by default. GCC keeps this define even
4648 // in the presence of '-w', match this behavior bug-for-bug.
4649 if (types::isCXX(InputType) &&
4650 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4651 true)) {
4652 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004653 }
4654
Chandler Carruthe0391482010-05-22 02:21:53 +00004655 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4656 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4657 if (Asm->getOption().matches(options::OPT_fasm))
4658 CmdArgs.push_back("-fgnu-keywords");
4659 else
4660 CmdArgs.push_back("-fno-gnu-keywords");
4661 }
4662
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004663 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4664 CmdArgs.push_back("-fno-dwarf-directory-asm");
4665
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004666 if (ShouldDisableAutolink(Args, getToolChain()))
4667 CmdArgs.push_back("-fno-autolink");
4668
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004669 // Add in -fdebug-compilation-dir if necessary.
4670 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004671
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004672 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4673 StringRef Map = A->getValue();
4674 if (Map.find('=') == StringRef::npos)
4675 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4676 else
4677 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4678 A->claim();
4679 }
4680
Richard Smith9a568822011-11-21 19:36:32 +00004681 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4682 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004683 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004684 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004685 }
4686
Richard Smith79c927b2013-11-06 19:31:51 +00004687 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4688 CmdArgs.push_back("-foperator-arrow-depth");
4689 CmdArgs.push_back(A->getValue());
4690 }
4691
Richard Smith9a568822011-11-21 19:36:32 +00004692 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4693 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004694 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004695 }
4696
Richard Smitha3d3bd22013-05-08 02:12:03 +00004697 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4698 CmdArgs.push_back("-fconstexpr-steps");
4699 CmdArgs.push_back(A->getValue());
4700 }
4701
Richard Smithb3a14522013-02-22 01:59:51 +00004702 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4703 CmdArgs.push_back("-fbracket-depth");
4704 CmdArgs.push_back(A->getValue());
4705 }
4706
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004707 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4708 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004709 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004710 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004711 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4712 } else
4713 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004714 }
4715
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004716 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004717 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004718
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004719 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4720 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004721 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004722 }
David Chisnall5778fce2009-08-31 16:41:57 +00004723
Chris Lattnere23003d2010-01-09 21:54:33 +00004724 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4725 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004726 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004727 }
4728
Chris Lattnerb35583d2010-04-07 20:49:23 +00004729 CmdArgs.push_back("-ferror-limit");
4730 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004731 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004732 else
4733 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004734
Chandler Carrutha77a7272010-05-06 04:55:18 +00004735 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4736 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004737 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004738 }
4739
4740 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4741 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004742 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004743 }
4744
Richard Smithf6f003a2011-12-16 19:06:07 +00004745 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4746 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004747 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004748 }
4749
Nick Lewycky24653262014-12-16 21:39:02 +00004750 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4751 CmdArgs.push_back("-fspell-checking-limit");
4752 CmdArgs.push_back(A->getValue());
4753 }
4754
Daniel Dunbar2c978472009-11-04 06:24:47 +00004755 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004756 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004757 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004758 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004759 } else {
4760 // If -fmessage-length=N was not specified, determine whether this is a
4761 // terminal and, if so, implicitly define -fmessage-length appropriately.
4762 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004763 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004764 }
4765
John McCallb4a99d32013-02-19 01:57:35 +00004766 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4767 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4768 options::OPT_fvisibility_ms_compat)) {
4769 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4770 CmdArgs.push_back("-fvisibility");
4771 CmdArgs.push_back(A->getValue());
4772 } else {
4773 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4774 CmdArgs.push_back("-fvisibility");
4775 CmdArgs.push_back("hidden");
4776 CmdArgs.push_back("-ftype-visibility");
4777 CmdArgs.push_back("default");
4778 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004779 }
4780
Douglas Gregor08329632010-06-15 17:05:35 +00004781 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004782
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004783 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4784
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004785 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004786 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4787 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004788 CmdArgs.push_back("-ffreestanding");
4789
Daniel Dunbare357d562009-12-03 18:42:11 +00004790 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004791 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004792 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004793 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004794 // Emulated TLS is enabled by default on Android, and can be enabled manually
4795 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004796 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004797 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4798 EmulatedTLSDefault))
4799 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004800 // AltiVec-like language extensions aren't relevant for assembling.
4801 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004802 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004803 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4804 }
Richard Trieu91844232012-06-26 18:18:47 +00004805 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4806 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004807
Alexey Bataevdb390212015-05-20 04:24:19 +00004808 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004809 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4810 options::OPT_fno_openmp, false))
4811 switch (getOpenMPRuntime(getToolChain(), Args)) {
4812 case OMPRT_OMP:
4813 case OMPRT_IOMP5:
4814 // Clang can generate useful OpenMP code for these two runtime libraries.
4815 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004816
4817 // If no option regarding the use of TLS in OpenMP codegeneration is
4818 // given, decide a default based on the target. Otherwise rely on the
4819 // options and pass the right information to the frontend.
4820 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004821 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004822 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004823 break;
4824 default:
4825 // By default, if Clang doesn't know how to generate useful OpenMP code
4826 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4827 // down to the actual compilation.
4828 // FIXME: It would be better to have a mode which *only* omits IR
4829 // generation based on the OpenMP support so that we get consistent
4830 // semantic analysis, etc.
4831 break;
4832 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004833
Peter Collingbourne32701642013-11-01 18:16:25 +00004834 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004835 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004836
Eric Christopher459d2712013-02-19 06:16:53 +00004837 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004838 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4839 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4840 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4841 Arch == llvm::Triple::ppc64le))
4842 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4843 << "ppc/ppc64/ppc64le";
4844 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004845
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004846 // -fzvector is incompatible with -faltivec.
4847 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4848 if (Args.hasArg(options::OPT_faltivec))
4849 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4850 << "-faltivec";
4851
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004852 if (getToolChain().SupportsProfiling())
4853 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004854
4855 // -flax-vector-conversions is default.
4856 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4857 options::OPT_fno_lax_vector_conversions))
4858 CmdArgs.push_back("-fno-lax-vector-conversions");
4859
John Brawna7b4ec02015-08-10 11:11:28 +00004860 if (Args.getLastArg(options::OPT_fapple_kext) ||
4861 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004862 CmdArgs.push_back("-fapple-kext");
4863
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004864 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004865 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004866 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004867 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4868 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004869
4870 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4871 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004872 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004873 }
4874
Bob Wilson14adb362012-02-03 06:27:22 +00004875 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004876
Chandler Carruth6e501032011-03-27 00:04:55 +00004877 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4878 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004879 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004880 if (A->getOption().matches(options::OPT_fwrapv))
4881 CmdArgs.push_back("-fwrapv");
4882 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4883 options::OPT_fno_strict_overflow)) {
4884 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4885 CmdArgs.push_back("-fwrapv");
4886 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004887
4888 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4889 options::OPT_fno_reroll_loops))
4890 if (A->getOption().matches(options::OPT_freroll_loops))
4891 CmdArgs.push_back("-freroll-loops");
4892
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004893 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004894 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4895 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004896
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004897 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4898
Daniel Dunbar4930e332009-11-17 08:07:36 +00004899 // -stack-protector=0 is default.
4900 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004901 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4902 options::OPT_fstack_protector_all,
4903 options::OPT_fstack_protector_strong,
4904 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004905 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004906 StackProtectorLevel = std::max<unsigned>(
4907 LangOptions::SSPOn,
4908 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004909 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004910 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004911 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004912 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004913 } else {
4914 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004915 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004916 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004917 if (StackProtectorLevel) {
4918 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004919 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004920 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004921
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004922 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004923 for (const Arg *A : Args.filtered(options::OPT__param)) {
4924 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004925 if (Str.startswith("ssp-buffer-size=")) {
4926 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004927 CmdArgs.push_back("-stack-protector-buffer-size");
4928 // FIXME: Verify the argument is a valid integer.
4929 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004930 }
Sean Silva14facf32015-06-09 01:57:17 +00004931 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004932 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004933 }
4934
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004935 // Translate -mstackrealign
4936 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004937 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004938 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004939
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004940 if (Args.hasArg(options::OPT_mstack_alignment)) {
4941 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4942 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004943 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004944
Hans Wennborg77dc2362015-01-20 19:45:50 +00004945 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4946 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4947
4948 if (!Size.empty())
4949 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4950 else
4951 CmdArgs.push_back("-mstack-probe-size=0");
4952 }
4953
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004954 switch (getToolChain().getArch()) {
4955 case llvm::Triple::aarch64:
4956 case llvm::Triple::aarch64_be:
4957 case llvm::Triple::arm:
4958 case llvm::Triple::armeb:
4959 case llvm::Triple::thumb:
4960 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004961 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004962 break;
4963
4964 default:
4965 break;
4966 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004967
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004968 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4969 options::OPT_mno_restrict_it)) {
4970 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4971 CmdArgs.push_back("-backend-option");
4972 CmdArgs.push_back("-arm-restrict-it");
4973 } else {
4974 CmdArgs.push_back("-backend-option");
4975 CmdArgs.push_back("-arm-no-restrict-it");
4976 }
James Y Knight2db38f32015-08-15 03:45:25 +00004977 } else if (Triple.isOSWindows() &&
4978 (Triple.getArch() == llvm::Triple::arm ||
4979 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004980 // Windows on ARM expects restricted IT blocks
4981 CmdArgs.push_back("-backend-option");
4982 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004983 }
4984
Daniel Dunbard18049a2009-04-07 21:16:11 +00004985 // Forward -f options with positive and negative forms; we translate
4986 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004987 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4988 StringRef fname = A->getValue();
4989 if (!llvm::sys::fs::exists(fname))
4990 D.Diag(diag::err_drv_no_such_file) << fname;
4991 else
4992 A->render(Args, CmdArgs);
4993 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004994
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004995 // -fbuiltin is default unless -mkernel is used.
4996 bool UseBuiltins =
4997 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4998 !Args.hasArg(options::OPT_mkernel));
4999 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005000 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005001
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005002 // -ffreestanding implies -fno-builtin.
5003 if (Args.hasArg(options::OPT_ffreestanding))
5004 UseBuiltins = false;
5005
5006 // Process the -fno-builtin-* options.
5007 for (const auto &Arg : Args) {
5008 const Option &O = Arg->getOption();
5009 if (!O.matches(options::OPT_fno_builtin_))
5010 continue;
5011
5012 Arg->claim();
5013 // If -fno-builtin is specified, then there's no need to pass the option to
5014 // the frontend.
5015 if (!UseBuiltins)
5016 continue;
5017
5018 StringRef FuncName = Arg->getValue();
5019 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5020 }
5021
Nuno Lopes13c88c72009-12-16 16:59:22 +00005022 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5023 options::OPT_fno_assume_sane_operator_new))
5024 CmdArgs.push_back("-fno-assume-sane-operator-new");
5025
Daniel Dunbar4930e332009-11-17 08:07:36 +00005026 // -fblocks=0 is default.
5027 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005028 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005029 (Args.hasArg(options::OPT_fgnu_runtime) &&
5030 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5031 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005032 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005034 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005035 !getToolChain().hasBlocksRuntime())
5036 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005037 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005038
Richard Smith47972af2015-06-16 00:08:24 +00005039 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005040 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005041 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005042 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005043 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005044 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5045 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005046 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005047 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005048 HaveModules = true;
5049 }
5050 }
5051
Richard Smith47972af2015-06-16 00:08:24 +00005052 // -fmodule-maps enables implicit reading of module map files. By default,
5053 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005054 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5055 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005056 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005057 }
5058
Daniel Jasperac42b752013-10-21 06:34:34 +00005059 // -fmodules-decluse checks that modules used are declared so (off by
5060 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005061 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005062 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005063 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005064 }
5065
Daniel Jasper962b38e2014-04-11 11:47:45 +00005066 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5067 // all #included headers are part of modules.
5068 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005069 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005070 CmdArgs.push_back("-fmodules-strict-decluse");
5071 }
5072
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005073 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5074 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5075 options::OPT_fno_implicit_modules)) {
5076 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005077 } else if (HaveModules) {
5078 // -fmodule-cache-path specifies where our implicitly-built module files
5079 // should be written.
5080 SmallString<128> Path;
5081 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5082 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005083 if (C.isForDiagnostics()) {
5084 // When generating crash reports, we want to emit the modules along with
5085 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005086 Path = Output.getFilename();
5087 llvm::sys::path::replace_extension(Path, ".cache");
5088 llvm::sys::path::append(Path, "modules");
5089 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005090 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005091 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005092 llvm::sys::path::append(Path, "org.llvm.clang.");
5093 appendUserToPath(Path);
5094 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005095 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005096 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005097 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5098 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005099 }
5100
Richard Smith8d83d6d2016-03-21 19:06:06 +00005101 // -fmodule-name specifies the module that is currently being built (or
5102 // used for header checking by -fmodule-maps).
5103 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5104
5105 // -fmodule-map-file can be used to specify files containing module
5106 // definitions.
5107 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5108
5109 // -fmodule-file can be used to specify files containing precompiled modules.
5110 if (HaveModules)
5111 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5112 else
5113 Args.ClaimAllArgs(options::OPT_fmodule_file);
5114
Justin Bognera88f0122014-06-20 22:59:50 +00005115 // When building modules and generating crashdumps, we need to dump a module
5116 // dependency VFS alongside the output.
5117 if (HaveModules && C.isForDiagnostics()) {
5118 SmallString<128> VFSDir(Output.getFilename());
5119 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005120 // Add the cache directory as a temp so the crash diagnostics pick it up.
5121 C.addTempFile(Args.MakeArgString(VFSDir));
5122
Justin Bognera88f0122014-06-20 22:59:50 +00005123 llvm::sys::path::append(VFSDir, "vfs");
5124 CmdArgs.push_back("-module-dependency-dir");
5125 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005126 }
5127
Richard Smith9887d792014-10-17 01:42:53 +00005128 if (HaveModules)
5129 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005130
Douglas Gregor35b04d62013-02-07 19:01:24 +00005131 // Pass through all -fmodules-ignore-macro arguments.
5132 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005133 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5134 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005135
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005136 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5137
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005138 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5139 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5140 D.Diag(diag::err_drv_argument_not_allowed_with)
5141 << A->getAsString(Args) << "-fbuild-session-timestamp";
5142
5143 llvm::sys::fs::file_status Status;
5144 if (llvm::sys::fs::status(A->getValue(), Status))
5145 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005146 CmdArgs.push_back(Args.MakeArgString(
5147 "-fbuild-session-timestamp=" +
5148 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005149 }
5150
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005151 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005152 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5153 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005154 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5155
5156 Args.AddLastArg(CmdArgs,
5157 options::OPT_fmodules_validate_once_per_build_session);
5158 }
5159
Ben Langmuirdcf73862014-03-12 00:06:17 +00005160 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5161
John McCalldfea9982010-04-09 19:12:06 +00005162 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005163 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005165 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005166
Anders Carlssond470fef2010-11-21 00:09:52 +00005167 // -felide-constructors is the default.
5168 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005170 CmdArgs.push_back("-fno-elide-constructors");
5171
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005172 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005173
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005174 if (KernelOrKext || (types::isCXX(InputType) &&
5175 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5176 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005177 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005178
Tony Linthicum76329bf2011-12-12 21:14:55 +00005179 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005180 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5181 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005182 CmdArgs.push_back("-fshort-enums");
5183
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005184 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005185 if (Arg *A = Args.getLastArg(
5186 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5187 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5188 if (A->getOption().matches(options::OPT_funsigned_char) ||
5189 A->getOption().matches(options::OPT_fno_signed_char)) {
5190 CmdArgs.push_back("-fno-signed-char");
5191 }
5192 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005193 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005194 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005195
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005196 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005197 if (!Args.hasFlag(
5198 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5199 !IsWindowsCygnus && !IsWindowsGNU &&
5200 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5201 getToolChain().getArch() != llvm::Triple::hexagon &&
5202 getToolChain().getArch() != llvm::Triple::xcore &&
5203 ((getToolChain().getTriple().getVendor() !=
5204 llvm::Triple::MipsTechnologies) ||
5205 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005206 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005207 CmdArgs.push_back("-fno-use-cxa-atexit");
5208
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005209 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005210 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005211 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005212 CmdArgs.push_back("-fms-extensions");
5213
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005214 // -fno-use-line-directives is default.
5215 if (Args.hasFlag(options::OPT_fuse_line_directives,
5216 options::OPT_fno_use_line_directives, false))
5217 CmdArgs.push_back("-fuse-line-directives");
5218
Francois Pichet1b4f1632011-09-17 04:32:15 +00005219 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005221 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005222 (IsWindowsMSVC &&
5223 Args.hasFlag(options::OPT_fms_extensions,
5224 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005225 CmdArgs.push_back("-fms-compatibility");
5226
David Majnemerc371ff02015-03-22 08:39:22 +00005227 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005228 VersionTuple MSVT = visualstudio::getMSVCVersion(
5229 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5230 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005231 CmdArgs.push_back(
5232 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005233
David Majnemer8db91762015-05-18 04:49:30 +00005234 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5235 if (ImplyVCPPCXXVer) {
5236 if (IsMSVC2015Compatible)
5237 CmdArgs.push_back("-std=c++14");
5238 else
5239 CmdArgs.push_back("-std=c++11");
5240 }
5241
Eric Christopher5ecce122013-02-18 00:38:31 +00005242 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005243 if (Args.hasFlag(options::OPT_fborland_extensions,
5244 options::OPT_fno_borland_extensions, false))
5245 CmdArgs.push_back("-fborland-extensions");
5246
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005247 // -fno-declspec is default, except for PS4.
5248 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5249 getToolChain().getTriple().isPS4()))
5250 CmdArgs.push_back("-fdeclspec");
5251 else if (Args.hasArg(options::OPT_fno_declspec))
5252 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5253
David Majnemerc371ff02015-03-22 08:39:22 +00005254 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5255 // than 19.
5256 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5257 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005258 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005259 CmdArgs.push_back("-fno-threadsafe-statics");
5260
Francois Pichet02744872011-09-01 16:38:08 +00005261 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5262 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005263 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005264 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005265 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005266
Chandler Carruthe03aa552010-04-17 20:17:31 +00005267 // -fgnu-keywords default varies depending on language; only pass if
5268 // specified.
5269 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005270 options::OPT_fno_gnu_keywords))
5271 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005273 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005274 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005275 CmdArgs.push_back("-fgnu89-inline");
5276
Chad Rosier9c76d242012-03-15 22:31:42 +00005277 if (Args.hasArg(options::OPT_fno_inline))
5278 CmdArgs.push_back("-fno-inline");
5279
Chad Rosier64d6be92012-03-06 21:17:19 +00005280 if (Args.hasArg(options::OPT_fno_inline_functions))
5281 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005282
John McCall5fb5df92012-06-20 06:18:46 +00005283 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005284
John McCall5fb5df92012-06-20 06:18:46 +00005285 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005286 // legacy is the default. Except for deployment taget of 10.5,
5287 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5288 // gets ignored silently.
5289 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005290 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5291 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005292 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005293 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005294 if (getToolChain().UseObjCMixedDispatch())
5295 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5296 else
5297 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5298 }
5299 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005300
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005301 // When ObjectiveC legacy runtime is in effect on MacOSX,
5302 // turn on the option to do Array/Dictionary subscripting
5303 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005304 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005305 getToolChain().getTriple().isMacOSX() &&
5306 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5307 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005308 objcRuntime.isNeXTFamily())
5309 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005311 // -fencode-extended-block-signature=1 is default.
5312 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5313 CmdArgs.push_back("-fencode-extended-block-signature");
5314 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005315
John McCall24fc0de2011-07-06 00:26:06 +00005316 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5317 // NOTE: This logic is duplicated in ToolChains.cpp.
5318 bool ARC = isObjCAutoRefCount(Args);
5319 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005320 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005321
John McCall24fc0de2011-07-06 00:26:06 +00005322 CmdArgs.push_back("-fobjc-arc");
5323
Chandler Carruth491db322011-11-04 07:34:47 +00005324 // FIXME: It seems like this entire block, and several around it should be
5325 // wrapped in isObjC, but for now we just use it here as this is where it
5326 // was being used previously.
5327 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5328 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5329 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5330 else
5331 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5332 }
5333
John McCall24fc0de2011-07-06 00:26:06 +00005334 // Allow the user to enable full exceptions code emission.
5335 // We define off for Objective-CC, on for Objective-C++.
5336 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5337 options::OPT_fno_objc_arc_exceptions,
5338 /*default*/ types::isCXX(InputType)))
5339 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005340
John McCall24fc0de2011-07-06 00:26:06 +00005341 }
5342
5343 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5344 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005345 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005346 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005347
John McCall24fc0de2011-07-06 00:26:06 +00005348 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5349 // takes precedence.
5350 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5351 if (!GCArg)
5352 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5353 if (GCArg) {
5354 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005355 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005356 } else if (getToolChain().SupportsObjCGC()) {
5357 GCArg->render(Args, CmdArgs);
5358 } else {
5359 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005361 }
5362 }
5363
John McCallfbe5ed72015-11-05 19:19:56 +00005364 // Pass down -fobjc-weak or -fno-objc-weak if present.
5365 if (types::isObjC(InputType)) {
5366 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5367 options::OPT_fno_objc_weak);
5368 if (!WeakArg) {
5369 // nothing to do
5370 } else if (GCArg) {
5371 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5372 D.Diag(diag::err_objc_weak_with_gc);
5373 } else if (!objcRuntime.allowsWeak()) {
5374 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5375 D.Diag(diag::err_objc_weak_unsupported);
5376 } else {
5377 WeakArg->render(Args, CmdArgs);
5378 }
5379 }
5380
Bob Wilsonb111ec92015-03-02 19:01:14 +00005381 if (Args.hasFlag(options::OPT_fapplication_extension,
5382 options::OPT_fno_application_extension, false))
5383 CmdArgs.push_back("-fapplication-extension");
5384
Reid Klecknerc542d372014-06-27 17:02:02 +00005385 // Handle GCC-style exception args.
5386 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005387 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5388 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005389
Tim Northovere931f9f2015-10-30 16:30:41 +00005390 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005391 CmdArgs.push_back("-fsjlj-exceptions");
5392
5393 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005394 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5395 options::OPT_fno_assume_sane_operator_new))
5396 CmdArgs.push_back("-fno-assume-sane-operator-new");
5397
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005398 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5399 // most platforms.
5400 if (Args.hasFlag(options::OPT_fsized_deallocation,
5401 options::OPT_fno_sized_deallocation, false))
5402 CmdArgs.push_back("-fsized-deallocation");
5403
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005404 // -fconstant-cfstrings is default, and may be subject to argument translation
5405 // on Darwin.
5406 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5407 options::OPT_fno_constant_cfstrings) ||
5408 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5409 options::OPT_mno_constant_cfstrings))
5410 CmdArgs.push_back("-fno-constant-cfstrings");
5411
John Thompsoned4e2952009-11-05 20:14:16 +00005412 // -fshort-wchar default varies depending on platform; only
5413 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005414 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5415 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005416 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005417
Hans Wennborg28c96312013-07-31 23:39:13 +00005418 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005419 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005420 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005421 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005422
Daniel Dunbar096ed292011-10-05 21:04:55 +00005423 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5424 // -fno-pack-struct doesn't apply to -fpack-struct=.
5425 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005426 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005427 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005428 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005429 } else if (Args.hasFlag(options::OPT_fpack_struct,
5430 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005431 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005432 }
5433
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005434 // Handle -fmax-type-align=N and -fno-type-align
5435 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5436 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5437 if (!SkipMaxTypeAlign) {
5438 std::string MaxTypeAlignStr = "-fmax-type-align=";
5439 MaxTypeAlignStr += A->getValue();
5440 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5441 }
5442 } else if (getToolChain().getTriple().isOSDarwin()) {
5443 if (!SkipMaxTypeAlign) {
5444 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5445 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5446 }
5447 }
5448
John Brawna7b4ec02015-08-10 11:11:28 +00005449 // -fcommon is the default unless compiling kernel code or the target says so
5450 bool NoCommonDefault =
5451 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5452 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5453 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005454 CmdArgs.push_back("-fno-common");
5455
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005456 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005457 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005458 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005459 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005460 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005461 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005462
Daniel Dunbar6358d682010-10-15 22:30:42 +00005463 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005464 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005465 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005466 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005467
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005468 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5470 StringRef value = inputCharset->getValue();
5471 if (value != "UTF-8")
5472 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5473 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005474 }
5475
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005476 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005477 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5478 StringRef value = execCharset->getValue();
5479 if (value != "UTF-8")
5480 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5481 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005482 }
5483
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005484 // -fcaret-diagnostics is default.
5485 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5486 options::OPT_fno_caret_diagnostics, true))
5487 CmdArgs.push_back("-fno-caret-diagnostics");
5488
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005489 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005490 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005491 options::OPT_fno_diagnostics_fixit_info))
5492 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005493
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005494 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005495 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005496 options::OPT_fno_diagnostics_show_option))
5497 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005498
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005499 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005500 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005501 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005502 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005503 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005504
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005506 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005507 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005508 }
5509
Chandler Carruthb6766f02011-03-27 01:50:55 +00005510 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005511 options::OPT_fdiagnostics_show_note_include_stack,
5512 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005513 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005514 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005515 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5516 else
5517 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5518 }
5519
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005520 // Color diagnostics are the default, unless the terminal doesn't support
5521 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005522 // Support both clang's -f[no-]color-diagnostics and gcc's
5523 // -f[no-]diagnostics-colors[=never|always|auto].
5524 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005525 for (const auto &Arg : Args) {
5526 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005527 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5528 !O.matches(options::OPT_fdiagnostics_color) &&
5529 !O.matches(options::OPT_fno_color_diagnostics) &&
5530 !O.matches(options::OPT_fno_diagnostics_color) &&
5531 !O.matches(options::OPT_fdiagnostics_color_EQ))
5532 continue;
5533
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005534 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005535 if (O.matches(options::OPT_fcolor_diagnostics) ||
5536 O.matches(options::OPT_fdiagnostics_color)) {
5537 ShowColors = Colors_On;
5538 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5539 O.matches(options::OPT_fno_diagnostics_color)) {
5540 ShowColors = Colors_Off;
5541 } else {
5542 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005543 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005544 if (value == "always")
5545 ShowColors = Colors_On;
5546 else if (value == "never")
5547 ShowColors = Colors_Off;
5548 else if (value == "auto")
5549 ShowColors = Colors_Auto;
5550 else
5551 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005552 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005553 }
5554 }
5555 if (ShowColors == Colors_On ||
5556 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005557 CmdArgs.push_back("-fcolor-diagnostics");
5558
Nico Rieck7857d462013-09-11 00:38:02 +00005559 if (Args.hasArg(options::OPT_fansi_escape_codes))
5560 CmdArgs.push_back("-fansi-escape-codes");
5561
Daniel Dunbardb097022009-06-08 21:13:54 +00005562 if (!Args.hasFlag(options::OPT_fshow_source_location,
5563 options::OPT_fno_show_source_location))
5564 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005565
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005566 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005567 true))
5568 CmdArgs.push_back("-fno-show-column");
5569
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005570 if (!Args.hasFlag(options::OPT_fspell_checking,
5571 options::OPT_fno_spell_checking))
5572 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005573
Chad Rosierc8e56e82012-12-05 21:08:21 +00005574 // -fno-asm-blocks is default.
5575 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5576 false))
5577 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005578
Steven Wucb0d13f2015-01-16 23:05:28 +00005579 // -fgnu-inline-asm is default.
5580 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5581 options::OPT_fno_gnu_inline_asm, true))
5582 CmdArgs.push_back("-fno-gnu-inline-asm");
5583
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005584 // Enable vectorization per default according to the optimization level
5585 // selected. For optimization levels that want vectorization we use the alias
5586 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005587 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 OptSpecifier VectorizeAliasOption =
5589 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005590 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005591 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005592 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005593
Chad Rosier136d67d2014-04-28 19:30:57 +00005594 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005595 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005596 OptSpecifier SLPVectAliasOption =
5597 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005598 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005599 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005600 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005601
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005602 // -fno-slp-vectorize-aggressive is default.
5603 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005604 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005605 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005606
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005607 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5608 A->render(Args, CmdArgs);
5609
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005610 // -fdollars-in-identifiers default varies depending on platform and
5611 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005612 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005613 options::OPT_fno_dollars_in_identifiers)) {
5614 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005615 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005616 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005617 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005618 }
5619
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005620 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5621 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005622 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005623 options::OPT_fno_unit_at_a_time)) {
5624 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005625 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005626 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005627
Eli Friedman055c9702011-11-02 01:53:16 +00005628 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5629 options::OPT_fno_apple_pragma_pack, false))
5630 CmdArgs.push_back("-fapple-pragma-pack");
5631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005632 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005633 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5634 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005635 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005636 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005637 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005638
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005639// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5640//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005641// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005642#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005643 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005644 (getToolChain().getArch() == llvm::Triple::arm ||
5645 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005646 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5647 CmdArgs.push_back("-fno-builtin-strcat");
5648 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5649 CmdArgs.push_back("-fno-builtin-strcpy");
5650 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005651#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005652
Justin Bognera88f0122014-06-20 22:59:50 +00005653 // Enable rewrite includes if the user's asked for it or if we're generating
5654 // diagnostics.
5655 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5656 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005657 if (Args.hasFlag(options::OPT_frewrite_includes,
5658 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005659 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005660 CmdArgs.push_back("-frewrite-includes");
5661
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005662 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005663 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005664 options::OPT_traditional_cpp)) {
5665 if (isa<PreprocessJobAction>(JA))
5666 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005667 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005669 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005670
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005671 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005672 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005673
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005674 // Handle serialized diagnostics.
5675 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5676 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005677 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005678 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005679
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005680 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5681 CmdArgs.push_back("-fretain-comments-from-system-headers");
5682
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005683 // Forward -fcomment-block-commands to -cc1.
5684 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005685 // Forward -fparse-all-comments to -cc1.
5686 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005687
John Brawnad31ace2015-09-23 13:55:40 +00005688 // Turn -fplugin=name.so into -load name.so
5689 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5690 CmdArgs.push_back("-load");
5691 CmdArgs.push_back(A->getValue());
5692 A->claim();
5693 }
5694
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005695 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5696 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005697 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005698 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5699 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005700
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005701 // We translate this by hand to the -cc1 argument, since nightly test uses
5702 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005703 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005704 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005705 } else
Sean Silva14facf32015-06-09 01:57:17 +00005706 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005707 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005708
Bob Wilson23a55f12014-12-21 07:00:00 +00005709 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005710 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5711 // by the frontend.
5712 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5713 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005714
Daniel Dunbard67a3222009-03-30 06:36:42 +00005715 if (Output.getType() == types::TY_Dependencies) {
5716 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005717 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005718 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005719 CmdArgs.push_back(Output.getFilename());
5720 } else {
5721 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005722 }
5723
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005724 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005725
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005726 if (Input.isFilename())
5727 CmdArgs.push_back(Input.getFilename());
5728 else
5729 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005730
Chris Lattnere9d7d782009-11-03 19:50:27 +00005731 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5732
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005733 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005734
5735 // Optionally embed the -cc1 level arguments into the debug info, for build
5736 // analysis.
5737 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005738 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005739 for (const auto &Arg : Args)
5740 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005741
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005742 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005743 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005744 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005745 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005746 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005747 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005748 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005749 }
5750 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005751 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005752 }
5753
Eric Christopherd3804002013-02-22 20:12:52 +00005754 // Add the split debug info name to the command lines here so we
5755 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005756 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005757 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5758 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005759 const char *SplitDwarfOut;
5760 if (SplitDwarf) {
5761 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005762 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005763 CmdArgs.push_back(SplitDwarfOut);
5764 }
5765
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005766 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5767 // Include them with -fcuda-include-gpubinary.
5768 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005769 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005770 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005771 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005772 }
5773
Eric Christopherd3804002013-02-22 20:12:52 +00005774 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005775 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005776 Output.getType() == types::TY_Object &&
5777 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005778 auto CLCommand =
5779 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005780 C.addCommand(llvm::make_unique<FallbackCommand>(
5781 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005782 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5783 isa<PrecompileJobAction>(JA)) {
5784 // In /fallback builds, run the main compilation even if the pch generation
5785 // fails, so that the main compilation's fallback to cl.exe runs.
5786 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5787 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005788 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005789 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005790 }
5791
Eric Christopherf1545832013-02-22 23:50:16 +00005792 // Handle the debug info splitting at object creation time if we're
5793 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005794 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005795 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005796 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005797
Roman Divacky178e01602011-02-10 16:52:03 +00005798 if (Arg *A = Args.getLastArg(options::OPT_pg))
5799 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005800 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5801 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005802
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005803 // Claim some arguments which clang supports automatically.
5804
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005805 // -fpch-preprocess is used with gcc to add a special marker in the output to
5806 // include the PCH file. Clang's PTH solution is completely transparent, so we
5807 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005808 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005809
Daniel Dunbar17731772009-03-23 19:03:36 +00005810 // Claim some arguments which clang doesn't support, but we don't
5811 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005812 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5813 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005814
Rafael Espindolab0092d72013-09-04 19:37:35 +00005815 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005816 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005817}
5818
John McCall5fb5df92012-06-20 06:18:46 +00005819/// Add options related to the Objective-C runtime/ABI.
5820///
5821/// Returns true if the runtime is non-fragile.
5822ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5823 ArgStringList &cmdArgs,
5824 RewriteKind rewriteKind) const {
5825 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005826 Arg *runtimeArg =
5827 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5828 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005829
5830 // Just forward -fobjc-runtime= to the frontend. This supercedes
5831 // options about fragility.
5832 if (runtimeArg &&
5833 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5834 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005835 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005836 if (runtime.tryParse(value)) {
5837 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005838 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005839 }
5840
5841 runtimeArg->render(args, cmdArgs);
5842 return runtime;
5843 }
5844
5845 // Otherwise, we'll need the ABI "version". Version numbers are
5846 // slightly confusing for historical reasons:
5847 // 1 - Traditional "fragile" ABI
5848 // 2 - Non-fragile ABI, version 1
5849 // 3 - Non-fragile ABI, version 2
5850 unsigned objcABIVersion = 1;
5851 // If -fobjc-abi-version= is present, use that to set the version.
5852 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005853 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005854 if (value == "1")
5855 objcABIVersion = 1;
5856 else if (value == "2")
5857 objcABIVersion = 2;
5858 else if (value == "3")
5859 objcABIVersion = 3;
5860 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005861 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005862 } else {
5863 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005864 bool nonFragileABIIsDefault =
5865 (rewriteKind == RK_NonFragile ||
5866 (rewriteKind == RK_None &&
5867 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005868 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5869 options::OPT_fno_objc_nonfragile_abi,
5870 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005871// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005872#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5873 unsigned nonFragileABIVersion = 1;
5874#else
5875 unsigned nonFragileABIVersion = 2;
5876#endif
5877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 if (Arg *abiArg =
5879 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005880 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005881 if (value == "1")
5882 nonFragileABIVersion = 1;
5883 else if (value == "2")
5884 nonFragileABIVersion = 2;
5885 else
5886 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005887 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005888 }
5889
5890 objcABIVersion = 1 + nonFragileABIVersion;
5891 } else {
5892 objcABIVersion = 1;
5893 }
5894 }
5895
5896 // We don't actually care about the ABI version other than whether
5897 // it's non-fragile.
5898 bool isNonFragile = objcABIVersion != 1;
5899
5900 // If we have no runtime argument, ask the toolchain for its default runtime.
5901 // However, the rewriter only really supports the Mac runtime, so assume that.
5902 ObjCRuntime runtime;
5903 if (!runtimeArg) {
5904 switch (rewriteKind) {
5905 case RK_None:
5906 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5907 break;
5908 case RK_Fragile:
5909 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5910 break;
5911 case RK_NonFragile:
5912 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5913 break;
5914 }
5915
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005916 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005917 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5918 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005919 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005920 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5921
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005922 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005923 } else {
5924 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5925 }
5926
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005927 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005928 } else {
5929 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005930 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005931 // non-fragile mode or the GCC runtime in fragile mode.
5932 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005933 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005934 else
5935 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005936 }
5937
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005938 cmdArgs.push_back(
5939 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005940 return runtime;
5941}
5942
Reid Klecknerc542d372014-06-27 17:02:02 +00005943static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5944 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5945 I += HaveDash;
5946 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005947}
Reid Klecknerc542d372014-06-27 17:02:02 +00005948
Benjamin Kramere003ca22015-10-28 13:54:16 +00005949namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005950struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005951 bool Synch = false;
5952 bool Asynch = false;
5953 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005954};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005955} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005956
5957/// /EH controls whether to run destructor cleanups when exceptions are
5958/// thrown. There are three modifiers:
5959/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5960/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5961/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005962/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005963/// The default is /EHs-c-, meaning cleanups are disabled.
5964static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5965 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005966
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005967 std::vector<std::string> EHArgs =
5968 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005969 for (auto EHVal : EHArgs) {
5970 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5971 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005972 case 'a':
5973 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005974 if (EH.Asynch)
5975 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005976 continue;
5977 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005978 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005979 continue;
5980 case 's':
5981 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005982 if (EH.Synch)
5983 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005984 continue;
5985 default:
5986 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005987 }
5988 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5989 break;
5990 }
5991 }
David Majnemerb8809092016-02-20 09:23:44 +00005992 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005993 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005994 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005995 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5996 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005997 EH.Synch = true;
5998 EH.NoUnwindC = true;
5999 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006000
Reid Klecknerc542d372014-06-27 17:02:02 +00006001 return EH;
6002}
6003
David Majnemercd5855e2016-02-29 01:40:36 +00006004void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6005 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006006 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006007 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006008 unsigned RTOptionID = options::OPT__SLASH_MT;
6009
Hans Wennborgf1a74252013-09-10 20:18:04 +00006010 if (Args.hasArg(options::OPT__SLASH_LDd))
6011 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6012 // but defining _DEBUG is sticky.
6013 RTOptionID = options::OPT__SLASH_MTd;
6014
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006015 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006016 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006017
David Majnemere2afb472015-07-24 06:49:13 +00006018 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006019 switch (RTOptionID) {
6020 case options::OPT__SLASH_MD:
6021 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006022 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006023 CmdArgs.push_back("-D_MT");
6024 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006025 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006026 break;
6027 case options::OPT__SLASH_MDd:
6028 CmdArgs.push_back("-D_DEBUG");
6029 CmdArgs.push_back("-D_MT");
6030 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006031 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006032 break;
6033 case options::OPT__SLASH_MT:
6034 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006035 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006036 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006037 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006038 break;
6039 case options::OPT__SLASH_MTd:
6040 CmdArgs.push_back("-D_DEBUG");
6041 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006042 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006043 break;
6044 default:
6045 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006046 }
6047
David Majnemere2afb472015-07-24 06:49:13 +00006048 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6049 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6050 } else {
6051 CmdArgs.push_back(FlagForCRT.data());
6052
6053 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6054 // users want. The /Za flag to cl.exe turns this off, but it's not
6055 // implemented in clang.
6056 CmdArgs.push_back("--dependent-lib=oldnames");
6057 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006058
Hans Wennborg8858a032014-07-21 23:42:07 +00006059 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6060 // would produce interleaved output, so ignore /showIncludes in such cases.
6061 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6062 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6063 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006064
David Majnemerf6072342014-07-01 22:24:56 +00006065 // This controls whether or not we emit RTTI data for polymorphic types.
6066 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6067 /*default=*/false))
6068 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006069
Reid Kleckner124955a2015-08-05 18:51:13 +00006070 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006071 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006072 if (*EmitCodeView)
6073 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006074 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006075 CmdArgs.push_back("-gcodeview");
6076
Reid Klecknerc542d372014-06-27 17:02:02 +00006077 const Driver &D = getToolChain().getDriver();
6078 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006079 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006080 if (types::isCXX(InputType))
6081 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006082 CmdArgs.push_back("-fexceptions");
6083 }
David Majnemercd5855e2016-02-29 01:40:36 +00006084 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6085 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006086
Hans Wennborge50cec32014-06-13 20:59:54 +00006087 // /EP should expand to -E -P.
6088 if (Args.hasArg(options::OPT__SLASH_EP)) {
6089 CmdArgs.push_back("-E");
6090 CmdArgs.push_back("-P");
6091 }
6092
David Majnemera5b195a2015-02-14 01:35:12 +00006093 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006094 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6095 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006096 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6097 else
6098 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6099
6100 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6101 VolatileOptionID = A->getOption().getID();
6102
6103 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6104 CmdArgs.push_back("-fms-volatile");
6105
David Majnemer86c318f2014-02-11 21:05:00 +00006106 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6107 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6108 if (MostGeneralArg && BestCaseArg)
6109 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6110 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6111
6112 if (MostGeneralArg) {
6113 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6114 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6115 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6116
6117 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6118 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6119 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6120 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6121 << FirstConflict->getAsString(Args)
6122 << SecondConflict->getAsString(Args);
6123
6124 if (SingleArg)
6125 CmdArgs.push_back("-fms-memptr-rep=single");
6126 else if (MultipleArg)
6127 CmdArgs.push_back("-fms-memptr-rep=multiple");
6128 else
6129 CmdArgs.push_back("-fms-memptr-rep=virtual");
6130 }
6131
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006132 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6133 A->render(Args, CmdArgs);
6134
Hans Wennborg81f74482013-09-10 01:07:07 +00006135 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6136 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006137 if (Args.hasArg(options::OPT__SLASH_fallback))
6138 CmdArgs.push_back("msvc-fallback");
6139 else
6140 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006141 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006142}
6143
Douglas Katzman95354292015-06-23 20:42:09 +00006144visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006145 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006146 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006147 return CLFallback.get();
6148}
6149
Daniel Sanders7f933f42015-01-30 17:35:23 +00006150void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6151 ArgStringList &CmdArgs) const {
6152 StringRef CPUName;
6153 StringRef ABIName;
6154 const llvm::Triple &Triple = getToolChain().getTriple();
6155 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6156
6157 CmdArgs.push_back("-target-abi");
6158 CmdArgs.push_back(ABIName.data());
6159}
6160
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006161void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006162 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006163 const ArgList &Args,
6164 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006165 ArgStringList CmdArgs;
6166
6167 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6168 const InputInfo &Input = Inputs[0];
6169
James Y Knight2db38f32015-08-15 03:45:25 +00006170 std::string TripleStr =
6171 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6172 const llvm::Triple Triple(TripleStr);
6173
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006174 // Don't warn about "clang -w -c foo.s"
6175 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006176 // and "clang -emit-llvm -c foo.s"
6177 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006178
Rafael Espindola577637a2015-01-03 00:06:04 +00006179 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006180
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006181 // Invoke ourselves in -cc1as mode.
6182 //
6183 // FIXME: Implement custom jobs for internal actions.
6184 CmdArgs.push_back("-cc1as");
6185
6186 // Add the "effective" target triple.
6187 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006188 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6189
6190 // Set the output mode, we currently only expect to be used as a real
6191 // assembler.
6192 CmdArgs.push_back("-filetype");
6193 CmdArgs.push_back("obj");
6194
Eric Christopher45f2e712012-12-18 00:31:10 +00006195 // Set the main file name, so that debug info works even with
6196 // -save-temps or preprocessed assembly.
6197 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006198 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006199
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006200 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006201 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006202 if (!CPU.empty()) {
6203 CmdArgs.push_back("-target-cpu");
6204 CmdArgs.push_back(Args.MakeArgString(CPU));
6205 }
6206
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006207 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006208 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006209
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006210 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006211 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006212
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006213 // Pass along any -I options so we get proper .include search paths.
6214 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6215
Eric Christopherfc3ee562012-01-10 00:38:01 +00006216 // Determine the original source input.
6217 const Action *SourceAction = &JA;
6218 while (SourceAction->getKind() != Action::InputClass) {
6219 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6220 SourceAction = SourceAction->getInputs()[0];
6221 }
6222
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006223 // Forward -g and handle debug info related flags, assuming we are dealing
6224 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006225 if (SourceAction->getType() == types::TY_Asm ||
6226 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006227 bool WantDebug = false;
6228 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006229 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006230 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006231 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6232 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006233 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006234 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006235 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006236 if (DwarfVersion == 0)
6237 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006238 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006239 (WantDebug ? codegenoptions::LimitedDebugInfo
6240 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006241 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006242
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006243 // Add the -fdebug-compilation-dir flag if needed.
6244 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006245
6246 // Set the AT_producer to the clang version when using the integrated
6247 // assembler on assembly source files.
6248 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006249 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6250 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006251
6252 // And pass along -I options
6253 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006254 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006255
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006256 // Handle -fPIC et al -- the relocation-model affects the assembler
6257 // for some targets.
6258 llvm::Reloc::Model RelocationModel;
6259 unsigned PICLevel;
6260 bool IsPIE;
6261 std::tie(RelocationModel, PICLevel, IsPIE) =
6262 ParsePICArgs(getToolChain(), Triple, Args);
6263
6264 const char *RMName = RelocationModelName(RelocationModel);
6265 if (RMName) {
6266 CmdArgs.push_back("-mrelocation-model");
6267 CmdArgs.push_back(RMName);
6268 }
6269
Kevin Enderby292dc082011-12-22 19:31:58 +00006270 // Optionally embed the -cc1as level arguments into the debug info, for build
6271 // analysis.
6272 if (getToolChain().UseDwarfDebugFlags()) {
6273 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006274 for (const auto &Arg : Args)
6275 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006276
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006277 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006278 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6279 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006280 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006281 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006282 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006283 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006284 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006285 }
6286 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006287 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006288 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006289
6290 // FIXME: Add -static support, once we have it.
6291
Daniel Sanders7f933f42015-01-30 17:35:23 +00006292 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006293 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006294 default:
6295 break;
6296
6297 case llvm::Triple::mips:
6298 case llvm::Triple::mipsel:
6299 case llvm::Triple::mips64:
6300 case llvm::Triple::mips64el:
6301 AddMIPSTargetArgs(Args, CmdArgs);
6302 break;
6303 }
6304
David Blaikie372d9502014-01-17 03:17:40 +00006305 // Consume all the warning flags. Usually this would be handled more
6306 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6307 // doesn't handle that so rather than warning about unused flags that are
6308 // actually used, we'll lie by omission instead.
6309 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006310 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006311
David Blaikie9260ed62013-07-25 21:19:01 +00006312 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6313 getToolChain().getDriver());
6314
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006315 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006316
6317 assert(Output.isFilename() && "Unexpected lipo output.");
6318 CmdArgs.push_back("-o");
6319 CmdArgs.push_back(Output.getFilename());
6320
Daniel Dunbarb440f562010-08-02 02:38:21 +00006321 assert(Input.isFilename() && "Invalid input.");
6322 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006323
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006324 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006325 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006326
6327 // Handle the debug info splitting at object creation time if we're
6328 // creating an object.
6329 // TODO: Currently only works on linux with newer objcopy.
6330 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006331 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006332 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006333 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006334}
6335
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006336void GnuTool::anchor() {}
6337
Daniel Dunbara3246a02009-03-18 08:07:30 +00006338void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006339 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006340 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006341 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006342 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006343 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006344
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006345 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006346 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006347 // It is unfortunate that we have to claim here, as this means
6348 // we will basically never report anything interesting for
6349 // platforms using a generic gcc, even if we are just using gcc
6350 // to get to the assembler.
6351 A->claim();
6352
Daniel Dunbar939c1212010-08-03 16:14:14 +00006353 // Don't forward any -g arguments to assembly steps.
6354 if (isa<AssembleJobAction>(JA) &&
6355 A->getOption().matches(options::OPT_g_Group))
6356 continue;
6357
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006358 // Don't forward any -W arguments to assembly and link steps.
6359 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6360 A->getOption().matches(options::OPT_W_Group))
6361 continue;
6362
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006363 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006364 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006365 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006366
Daniel Dunbar4e295052010-01-25 22:35:08 +00006367 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006368
6369 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006370 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006371 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006372 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006373 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006374 }
6375
Daniel Dunbar5716d872009-05-02 21:41:52 +00006376 // Try to force gcc to match the tool chain we want, if we recognize
6377 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006378 //
6379 // FIXME: The triple class should directly provide the information we want
6380 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006381 switch (getToolChain().getArch()) {
6382 default:
6383 break;
6384 case llvm::Triple::x86:
6385 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006386 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006387 break;
6388 case llvm::Triple::x86_64:
6389 case llvm::Triple::ppc64:
6390 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006391 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006392 break;
6393 case llvm::Triple::sparcel:
6394 CmdArgs.push_back("-EL");
6395 break;
6396 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006397
Daniel Dunbarb440f562010-08-02 02:38:21 +00006398 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006399 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006400 CmdArgs.push_back(Output.getFilename());
6401 } else {
6402 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006403 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006404 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006406 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006407
6408 // Only pass -x if gcc will understand it; otherwise hope gcc
6409 // understands the suffix correctly. The main use case this would go
6410 // wrong in is for linker inputs if they happened to have an odd
6411 // suffix; really the only way to get this to happen is a command
6412 // like '-x foobar a.c' which will treat a.c like a linker input.
6413 //
6414 // FIXME: For the linker case specifically, can we safely convert
6415 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006416 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006417 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006418 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006419 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006420 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006421 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006422 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006423 else if (II.getType() == types::TY_ModuleFile)
6424 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006425 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006426
Daniel Dunbara3246a02009-03-18 08:07:30 +00006427 if (types::canTypeBeUserSpecified(II.getType())) {
6428 CmdArgs.push_back("-x");
6429 CmdArgs.push_back(types::getTypeName(II.getType()));
6430 }
6431
Daniel Dunbarb440f562010-08-02 02:38:21 +00006432 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006433 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006434 else {
6435 const Arg &A = II.getInputArg();
6436
6437 // Reverse translate some rewritten options.
6438 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6439 CmdArgs.push_back("-lstdc++");
6440 continue;
6441 }
6442
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006443 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006444 A.render(Args, CmdArgs);
6445 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006446 }
6447
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006448 const std::string customGCCName = D.getCCCGenericGCCName();
6449 const char *GCCName;
6450 if (!customGCCName.empty())
6451 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006452 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006453 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006454 } else
6455 GCCName = "gcc";
6456
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006457 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006458 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006459}
6460
Douglas Katzman95354292015-06-23 20:42:09 +00006461void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6462 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006463 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006464}
6465
Douglas Katzman95354292015-06-23 20:42:09 +00006466void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6467 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006468 const Driver &D = getToolChain().getDriver();
6469
Eric Christophercc7ff502015-01-29 00:56:17 +00006470 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006471 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006472 case types::TY_LLVM_IR:
6473 case types::TY_LTO_IR:
6474 case types::TY_LLVM_BC:
6475 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006476 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006477 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006478 // We assume we've got an "integrated" assembler in that gcc will produce an
6479 // object file itself.
6480 case types::TY_Object:
6481 CmdArgs.push_back("-c");
6482 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006483 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006484 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006485 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006486 case types::TY_Nothing:
6487 CmdArgs.push_back("-fsyntax-only");
6488 break;
6489 default:
6490 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006491 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006492}
6493
Douglas Katzman95354292015-06-23 20:42:09 +00006494void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6495 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006496 // The types are (hopefully) good enough.
6497}
6498
Tony Linthicum76329bf2011-12-12 21:14:55 +00006499// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006500void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006501 ArgStringList &CmdArgs) const {
6502}
6503
Douglas Katzman95354292015-06-23 20:42:09 +00006504void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6505 const InputInfo &Output,
6506 const InputInfoList &Inputs,
6507 const ArgList &Args,
6508 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006509 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006510
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006511 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6512 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006513 ArgStringList CmdArgs;
6514
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006515 std::string MArchString = "-march=hexagon";
6516 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006517
6518 RenderExtraToolArgs(JA, CmdArgs);
6519
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006520 std::string AsName = "hexagon-llvm-mc";
6521 std::string MCpuString = "-mcpu=hexagon" +
6522 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6523 CmdArgs.push_back("-filetype=obj");
6524 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6525
Tony Linthicum76329bf2011-12-12 21:14:55 +00006526 if (Output.isFilename()) {
6527 CmdArgs.push_back("-o");
6528 CmdArgs.push_back(Output.getFilename());
6529 } else {
6530 assert(Output.isNothing() && "Unexpected output");
6531 CmdArgs.push_back("-fsyntax-only");
6532 }
6533
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006534 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6535 std::string N = llvm::utostr(G.getValue());
6536 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6537 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006538
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006539 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006540
Tony Linthicum76329bf2011-12-12 21:14:55 +00006541 // Only pass -x if gcc will understand it; otherwise hope gcc
6542 // understands the suffix correctly. The main use case this would go
6543 // wrong in is for linker inputs if they happened to have an odd
6544 // suffix; really the only way to get this to happen is a command
6545 // like '-x foobar a.c' which will treat a.c like a linker input.
6546 //
6547 // FIXME: For the linker case specifically, can we safely convert
6548 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006549 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006550 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006551 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006552 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006553 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006554 else if (II.getType() == types::TY_AST)
6555 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006556 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006557 else if (II.getType() == types::TY_ModuleFile)
6558 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006559 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006560
6561 if (II.isFilename())
6562 CmdArgs.push_back(II.getFilename());
6563 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006564 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006565 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006566 II.getInputArg().render(Args, CmdArgs);
6567 }
6568
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006569 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006570 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006571}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006572
Douglas Katzman95354292015-06-23 20:42:09 +00006573void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6574 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006575}
6576
Douglas Katzman54366072015-07-27 16:53:08 +00006577static void
6578constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006579 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006580 const InputInfo &Output, const InputInfoList &Inputs,
6581 const ArgList &Args, ArgStringList &CmdArgs,
6582 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006583
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006584 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006585
Matthew Curtise689b052012-12-06 15:46:07 +00006586 //----------------------------------------------------------------------------
6587 //
6588 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589 bool IsStatic = Args.hasArg(options::OPT_static);
6590 bool IsShared = Args.hasArg(options::OPT_shared);
6591 bool IsPIE = Args.hasArg(options::OPT_pie);
6592 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6593 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6594 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6595 bool UseG0 = false;
6596 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006597
Matthew Curtise689b052012-12-06 15:46:07 +00006598 //----------------------------------------------------------------------------
6599 // Silence warnings for various options
6600 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006601 Args.ClaimAllArgs(options::OPT_g_Group);
6602 Args.ClaimAllArgs(options::OPT_emit_llvm);
6603 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6604 // handled somewhere else.
6605 Args.ClaimAllArgs(options::OPT_static_libgcc);
6606
6607 //----------------------------------------------------------------------------
6608 //
6609 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006610 if (Args.hasArg(options::OPT_s))
6611 CmdArgs.push_back("-s");
6612
6613 if (Args.hasArg(options::OPT_r))
6614 CmdArgs.push_back("-r");
6615
6616 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006617 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006618
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006619 CmdArgs.push_back("-march=hexagon");
6620 std::string CpuVer =
6621 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6622 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6623 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006624
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006625 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006626 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006627 // The following should be the default, but doing as hexagon-gcc does.
6628 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006629 }
6630
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006631 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006632 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006633
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006635 CmdArgs.push_back("-pie");
6636
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6638 std::string N = llvm::utostr(G.getValue());
6639 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6640 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006641 }
6642
Matthew Curtise689b052012-12-06 15:46:07 +00006643 //----------------------------------------------------------------------------
6644 //
6645 //----------------------------------------------------------------------------
6646 CmdArgs.push_back("-o");
6647 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006648
Matthew Curtise689b052012-12-06 15:46:07 +00006649 //----------------------------------------------------------------------------
6650 // moslib
6651 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006652 std::vector<std::string> OsLibs;
6653 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006654
Sean Silva14facf32015-06-09 01:57:17 +00006655 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6656 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657 OsLibs.emplace_back(A->getValue());
6658 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006659 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006660 if (OsLibs.empty()) {
6661 OsLibs.push_back("standalone");
6662 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006663 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006664
Matthew Curtise689b052012-12-06 15:46:07 +00006665 //----------------------------------------------------------------------------
6666 // Start Files
6667 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006668 const std::string MCpuSuffix = "/" + CpuVer;
6669 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6670 const std::string RootDir =
6671 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6672 const std::string StartSubDir =
6673 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006674
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006675 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6676 const char *Name) -> std::string {
6677 std::string RelName = SubDir + Name;
6678 std::string P = HTC.GetFilePath(RelName.c_str());
6679 if (llvm::sys::fs::exists(P))
6680 return P;
6681 return RootDir + RelName;
6682 };
6683
6684 if (IncStdLib && IncStartFiles) {
6685 if (!IsShared) {
6686 if (HasStandalone) {
6687 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6688 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006689 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006690 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6691 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006692 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006693 std::string Init = UseShared
6694 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6695 : Find(RootDir, StartSubDir, "/init.o");
6696 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006697 }
6698
6699 //----------------------------------------------------------------------------
6700 // Library Search Paths
6701 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006702 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6703 for (const auto &LibPath : LibPaths)
6704 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006705
6706 //----------------------------------------------------------------------------
6707 //
6708 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006709 Args.AddAllArgs(CmdArgs,
6710 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6711 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006712
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006713 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006714
6715 //----------------------------------------------------------------------------
6716 // Libraries
6717 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006718 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006719 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006720 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006721 CmdArgs.push_back("-lm");
6722 }
6723
6724 CmdArgs.push_back("--start-group");
6725
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006726 if (!IsShared) {
6727 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006728 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006729 CmdArgs.push_back("-lc");
6730 }
6731 CmdArgs.push_back("-lgcc");
6732
6733 CmdArgs.push_back("--end-group");
6734 }
6735
6736 //----------------------------------------------------------------------------
6737 // End files
6738 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006739 if (IncStdLib && IncStartFiles) {
6740 std::string Fini = UseShared
6741 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6742 : Find(RootDir, StartSubDir, "/fini.o");
6743 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006744 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006745}
6746
Douglas Katzman95354292015-06-23 20:42:09 +00006747void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6748 const InputInfo &Output,
6749 const InputInfoList &Inputs,
6750 const ArgList &Args,
6751 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006752 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006753
6754 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006755 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006756 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006757
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006758 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006759 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006760 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006761}
6762// Hexagon tools end.
6763
Tom Stellard8fa33092015-07-18 01:49:05 +00006764void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6765 const InputInfo &Output,
6766 const InputInfoList &Inputs,
6767 const ArgList &Args,
6768 const char *LinkingOutput) const {
6769
6770 std::string Linker = getToolChain().GetProgramPath(getShortName());
6771 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006772 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006773 CmdArgs.push_back(Output.getFilename());
6774 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6775 CmdArgs, Inputs));
6776}
6777// AMDGPU tools end.
6778
Dan Gohman52816862015-12-16 23:30:41 +00006779wasm::Linker::Linker(const ToolChain &TC)
6780 : GnuTool("wasm::Linker", "lld", TC) {}
6781
6782bool wasm::Linker::isLinkJob() const {
6783 return true;
6784}
6785
6786bool wasm::Linker::hasIntegratedCPP() const {
6787 return false;
6788}
6789
6790void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6791 const InputInfo &Output,
6792 const InputInfoList &Inputs,
6793 const ArgList &Args,
6794 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006795
6796 const ToolChain &ToolChain = getToolChain();
6797 const Driver &D = ToolChain.getDriver();
6798 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006799 ArgStringList CmdArgs;
6800 CmdArgs.push_back("-flavor");
6801 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006802
6803 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006804 // size is of particular importance. This is significantly facilitated by
6805 // the enabling of -ffunction-sections and -fdata-sections in
6806 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006807 if (areOptimizationsEnabled(Args))
6808 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006809
Dan Gohman57b62c52016-02-22 19:26:15 +00006810 if (Args.hasArg(options::OPT_rdynamic))
6811 CmdArgs.push_back("-export-dynamic");
6812 if (Args.hasArg(options::OPT_s))
6813 CmdArgs.push_back("--strip-all");
6814 if (Args.hasArg(options::OPT_shared))
6815 CmdArgs.push_back("-shared");
6816 if (Args.hasArg(options::OPT_static))
6817 CmdArgs.push_back("-Bstatic");
6818
6819 Args.AddAllArgs(CmdArgs, options::OPT_L);
6820 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6821
6822 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6823 if (Args.hasArg(options::OPT_shared))
6824 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6825 else if (Args.hasArg(options::OPT_pie))
6826 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6827 else
6828 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6829
6830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6831 }
6832
6833 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6834
6835 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6836 if (D.CCCIsCXX())
6837 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6838
6839 if (Args.hasArg(options::OPT_pthread))
6840 CmdArgs.push_back("-lpthread");
6841
6842 CmdArgs.push_back("-lc");
6843 CmdArgs.push_back("-lcompiler_rt");
6844 }
6845
6846 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6847 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6848
Dan Gohman52816862015-12-16 23:30:41 +00006849 CmdArgs.push_back("-o");
6850 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006851
Dan Gohman52816862015-12-16 23:30:41 +00006852 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6853}
6854
Renato Golin7c542b42015-07-27 23:44:45 +00006855const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006856 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006857 if (!Arch.empty())
6858 MArch = Arch;
6859 else
Bernard Ogden31561762013-12-12 13:27:11 +00006860 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006861 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006862
6863 // Handle -march=native.
6864 if (MArch == "native") {
6865 std::string CPU = llvm::sys::getHostCPUName();
6866 if (CPU != "generic") {
6867 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006868 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006869 // If there is no valid architecture suffix for this CPU we don't know how
6870 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006871 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006872 MArch = "";
6873 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006874 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006875 }
6876 }
6877
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006878 return MArch;
6879}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006880
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006881/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006882StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006883 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006884 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6885 // here means an -march=native that we can't handle, so instead return no CPU.
6886 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006887 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006888
John Brawna95c1a82015-05-08 12:52:18 +00006889 // We need to return an empty string here on invalid MArch values as the
6890 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006891 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006892}
6893
6894/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006895std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006896 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006897 // FIXME: Warn on inconsistent use of -mcpu and -march.
6898 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006899 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006900 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006901 // Handle -mcpu=native.
6902 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006903 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006904 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006905 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006906 }
6907
Renato Goline17c5802015-07-27 23:44:42 +00006908 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006909}
6910
6911/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006912/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006913// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006914StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6915 const llvm::Triple &Triple) {
6916 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006917 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006918 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006919 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006920 if (ArchKind == llvm::ARM::AK_INVALID)
6921 // In case of generic Arch, i.e. "arm",
6922 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006923 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006924 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006925 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6926 // armv7k triple if it's actually been specified via "-arch armv7k".
6927 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006928 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006929 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006930 }
Renato Golin3c007252015-05-28 15:05:53 +00006931 if (ArchKind == llvm::ARM::AK_INVALID)
6932 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006933 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006934}
6935
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006936void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006937 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006938 if (Args.hasArg(options::OPT_r))
6939 return;
6940
John Brawn94fd9632015-05-21 12:19:49 +00006941 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6942 // to generate BE-8 executables.
6943 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6944 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006945}
6946
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006947mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006948 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6949 // was first introduced in Release 3. However, other compilers have
6950 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006951 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6952 .Case("mips1", NanLegacy)
6953 .Case("mips2", NanLegacy)
6954 .Case("mips3", NanLegacy)
6955 .Case("mips4", NanLegacy)
6956 .Case("mips5", NanLegacy)
6957 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006958 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006959 .Case("mips32r3", NanLegacy | Nan2008)
6960 .Case("mips32r5", NanLegacy | Nan2008)
6961 .Case("mips32r6", Nan2008)
6962 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006963 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006964 .Case("mips64r3", NanLegacy | Nan2008)
6965 .Case("mips64r5", NanLegacy | Nan2008)
6966 .Case("mips64r6", Nan2008)
6967 .Default(NanLegacy);
6968}
6969
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006970bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6971 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6972 return A && (A->getValue() == StringRef(Value));
6973}
6974
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006975bool mips::isUCLibc(const ArgList &Args) {
6976 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006977 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006978}
6979
Daniel Sanders2bf13662014-07-10 14:40:57 +00006980bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006981 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6982 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006983 .Case("2008", true)
6984 .Case("legacy", false)
6985 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006986
6987 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006988 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006989 .Cases("mips32r6", "mips64r6", true)
6990 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006991
6992 return false;
6993}
6994
Daniel Sanders379d44b2014-07-16 11:52:23 +00006995bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006996 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006997 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006998 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006999 return false;
7000
7001 if (ABIName != "32")
7002 return false;
7003
Toma Tabacu94ea6862015-06-16 13:54:13 +00007004 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7005 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007006 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007007 return false;
7008
Daniel Sanders379d44b2014-07-16 11:52:23 +00007009 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007010 .Cases("mips2", "mips3", "mips4", "mips5", true)
7011 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7012 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7013 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007014}
7015
Toma Tabacu94ea6862015-06-16 13:54:13 +00007016bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7017 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007018 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007019 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7020
7021 // FPXX shouldn't be used if -msingle-float is present.
7022 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7023 options::OPT_mdouble_float))
7024 if (A->getOption().matches(options::OPT_msingle_float))
7025 UseFPXX = false;
7026
7027 return UseFPXX;
7028}
7029
Tim Northover157d9112014-01-16 08:48:16 +00007030llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007031 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7032 // archs which Darwin doesn't use.
7033
7034 // The matching this routine does is fairly pointless, since it is neither the
7035 // complete architecture list, nor a reasonable subset. The problem is that
7036 // historically the driver driver accepts this and also ties its -march=
7037 // handling to the architecture name, so we need to be careful before removing
7038 // support for it.
7039
7040 // This code must be kept in sync with Clang's Darwin specific argument
7041 // translation.
7042
7043 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007044 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7045 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7046 .Case("ppc64", llvm::Triple::ppc64)
7047 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7048 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7049 llvm::Triple::x86)
7050 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7051 // This is derived from the driver driver.
7052 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7053 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7054 .Cases("armv7s", "xscale", llvm::Triple::arm)
7055 .Case("arm64", llvm::Triple::aarch64)
7056 .Case("r600", llvm::Triple::r600)
7057 .Case("amdgcn", llvm::Triple::amdgcn)
7058 .Case("nvptx", llvm::Triple::nvptx)
7059 .Case("nvptx64", llvm::Triple::nvptx64)
7060 .Case("amdil", llvm::Triple::amdil)
7061 .Case("spir", llvm::Triple::spir)
7062 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007063}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007064
Tim Northover157d9112014-01-16 08:48:16 +00007065void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007066 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007067 T.setArch(Arch);
7068
7069 if (Str == "x86_64h")
7070 T.setArchName(Str);
7071 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7072 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007073 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007074 }
7075}
7076
Bob Wilsondecc03e2012-11-23 06:14:39 +00007077const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007078 const InputInfo &Input) {
7079 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007080}
7081
Bob Wilsondecc03e2012-11-23 06:14:39 +00007082const char *Clang::getBaseInputStem(const ArgList &Args,
7083 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007084 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007085
Chris Lattner906bb902011-01-16 08:14:11 +00007086 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007087 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007088
7089 return Str;
7090}
7091
Bob Wilsondecc03e2012-11-23 06:14:39 +00007092const char *Clang::getDependencyFileName(const ArgList &Args,
7093 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007094 // FIXME: Think about this more.
7095 std::string Res;
7096
7097 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007098 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007099 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007100 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007101 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007102 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007103 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007104}
7105
Douglas Katzman95354292015-06-23 20:42:09 +00007106void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7107 const InputInfo &Output,
7108 const InputInfoList &Inputs,
7109 const ArgList &Args,
7110 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007111 const ToolChain &ToolChain = getToolChain();
7112 const Driver &D = ToolChain.getDriver();
7113 ArgStringList CmdArgs;
7114
7115 // Silence warning for "clang -g foo.o -o foo"
7116 Args.ClaimAllArgs(options::OPT_g_Group);
7117 // and "clang -emit-llvm foo.o -o foo"
7118 Args.ClaimAllArgs(options::OPT_emit_llvm);
7119 // and for "clang -w foo.o -o foo". Other warning options are already
7120 // handled somewhere else.
7121 Args.ClaimAllArgs(options::OPT_w);
7122
7123 if (!D.SysRoot.empty())
7124 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7125
7126 // CloudABI only supports static linkage.
7127 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007128
7129 // CloudABI uses Position Independent Executables exclusively.
7130 CmdArgs.push_back("-pie");
7131 CmdArgs.push_back("--no-dynamic-linker");
7132 CmdArgs.push_back("-zrelro");
7133
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007134 CmdArgs.push_back("--eh-frame-hdr");
7135 CmdArgs.push_back("--gc-sections");
7136
7137 if (Output.isFilename()) {
7138 CmdArgs.push_back("-o");
7139 CmdArgs.push_back(Output.getFilename());
7140 } else {
7141 assert(Output.isNothing() && "Invalid output.");
7142 }
7143
Douglas Katzman78b37b02015-11-17 20:28:07 +00007144 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007145 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7146 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7147 }
7148
7149 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007150 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007151 Args.AddAllArgs(CmdArgs,
7152 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7153 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007154
Teresa Johnson945bc502015-10-15 20:35:53 +00007155 if (D.isUsingLTO())
7156 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007157
7158 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7159
Douglas Katzman78b37b02015-11-17 20:28:07 +00007160 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007161 if (D.CCCIsCXX())
7162 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7163 CmdArgs.push_back("-lc");
7164 CmdArgs.push_back("-lcompiler_rt");
7165 }
7166
Douglas Katzman78b37b02015-11-17 20:28:07 +00007167 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007168 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7169
7170 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007171 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007172}
7173
Douglas Katzman95354292015-06-23 20:42:09 +00007174void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7175 const InputInfo &Output,
7176 const InputInfoList &Inputs,
7177 const ArgList &Args,
7178 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007179 ArgStringList CmdArgs;
7180
7181 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7182 const InputInfo &Input = Inputs[0];
7183
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007184 // Determine the original source input.
7185 const Action *SourceAction = &JA;
7186 while (SourceAction->getKind() != Action::InputClass) {
7187 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7188 SourceAction = SourceAction->getInputs()[0];
7189 }
7190
Eric Christopherf5a8f492015-12-08 00:10:10 +00007191 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007192 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007193 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7194 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007195 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007196 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007197 const llvm::Triple &T(getToolChain().getTriple());
7198 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007199 CmdArgs.push_back("-Q");
7200 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007201
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007202 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007203 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007204 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007205 if (Args.hasArg(options::OPT_gstabs))
7206 CmdArgs.push_back("--gstabs");
7207 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007208 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007209 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007210
Daniel Dunbarbe220842009-03-20 16:06:39 +00007211 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007212 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007213
Daniel Dunbar6d484762010-07-22 01:47:22 +00007214 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007215 if (getToolChain().getArch() == llvm::Triple::x86 ||
7216 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007217 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7218 CmdArgs.push_back("-force_cpusubtype_ALL");
7219
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007220 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007221 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007222 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007223 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007224 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007225 CmdArgs.push_back("-static");
7226
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007227 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007228
7229 assert(Output.isFilename() && "Unexpected lipo output.");
7230 CmdArgs.push_back("-o");
7231 CmdArgs.push_back(Output.getFilename());
7232
Daniel Dunbarb440f562010-08-02 02:38:21 +00007233 assert(Input.isFilename() && "Invalid input.");
7234 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007235
7236 // asm_final spec is empty.
7237
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007238 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007239 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007240}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007241
Tim Northover157d9112014-01-16 08:48:16 +00007242void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007243
Tim Northover157d9112014-01-16 08:48:16 +00007244void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7245 ArgStringList &CmdArgs) const {
7246 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007247
Daniel Dunbarc1964212009-03-26 16:23:12 +00007248 // Derived from darwin_arch spec.
7249 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007250 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007251
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007252 // FIXME: Is this needed anymore?
7253 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007254 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007255}
7256
Douglas Katzman95354292015-06-23 20:42:09 +00007257bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007258 // We only need to generate a temp path for LTO if we aren't compiling object
7259 // files. When compiling source files, we run 'dsymutil' after linking. We
7260 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007261 for (const auto &Input : Inputs)
7262 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007263 return true;
7264
7265 return false;
7266}
7267
Douglas Katzman95354292015-06-23 20:42:09 +00007268void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7269 ArgStringList &CmdArgs,
7270 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007271 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007272 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007273
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007274 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007275 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007276 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007277 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007278 }
7279
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007280 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007281 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007282 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7283 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007284
Bob Wilson3d27dad2013-08-02 22:25:34 +00007285 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7286 CmdArgs.push_back("-export_dynamic");
7287
Bob Wilsonb111ec92015-03-02 19:01:14 +00007288 // If we are using App Extension restrictions, pass a flag to the linker
7289 // telling it that the compiled code has been audited.
7290 if (Args.hasFlag(options::OPT_fapplication_extension,
7291 options::OPT_fno_application_extension, false))
7292 CmdArgs.push_back("-application_extension");
7293
Teresa Johnson945bc502015-10-15 20:35:53 +00007294 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007295 // If we are using LTO, then automatically create a temporary file path for
7296 // the linker to use, so that it's lifetime will extend past a possible
7297 // dsymutil step.
7298 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7299 const char *TmpPath = C.getArgs().MakeArgString(
7300 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7301 C.addTempFile(TmpPath);
7302 CmdArgs.push_back("-object_path_lto");
7303 CmdArgs.push_back(TmpPath);
7304 }
7305
7306 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7307 // it in clang installed libraries. If not found, the option is not used
7308 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7309 if (Version[0] >= 133) {
7310 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7311 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7312 SmallString<128> LibLTOPath(P);
7313 llvm::sys::path::append(LibLTOPath, "lib");
7314 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7315 if (llvm::sys::fs::exists(LibLTOPath)) {
7316 CmdArgs.push_back("-lto_library");
7317 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7318 } else {
7319 D.Diag(diag::warn_drv_lto_libpath);
7320 }
7321 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007322 }
7323
Daniel Dunbarc1964212009-03-26 16:23:12 +00007324 // Derived from the "link" spec.
7325 Args.AddAllArgs(CmdArgs, options::OPT_static);
7326 if (!Args.hasArg(options::OPT_static))
7327 CmdArgs.push_back("-dynamic");
7328 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7329 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7330 // here. How do we wish to handle such things?
7331 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007332
Daniel Dunbarc1964212009-03-26 16:23:12 +00007333 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007334 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007335 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007336 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007337
7338 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7339 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7340 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7341
7342 Arg *A;
7343 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7344 (A = Args.getLastArg(options::OPT_current__version)) ||
7345 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007346 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7347 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007348
7349 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7350 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7351 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7352 } else {
7353 CmdArgs.push_back("-dylib");
7354
7355 Arg *A;
7356 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7357 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7358 (A = Args.getLastArg(options::OPT_client__name)) ||
7359 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7360 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7361 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007362 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7363 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007364
Daniel Dunbarc1964212009-03-26 16:23:12 +00007365 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7366 "-dylib_compatibility_version");
7367 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7368 "-dylib_current_version");
7369
Tim Northover157d9112014-01-16 08:48:16 +00007370 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007371
7372 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7373 "-dylib_install_name");
7374 }
7375
7376 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7377 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7378 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007379 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007380 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007381 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7382 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7383 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7384 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7385 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7386 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007387 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007388 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7389 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7390 Args.AddAllArgs(CmdArgs, options::OPT_init);
7391
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007392 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007393 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007394
Daniel Dunbarc1964212009-03-26 16:23:12 +00007395 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7396 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7397 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7398 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7399 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007400
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007401 if (const Arg *A =
7402 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7403 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007404 if (A->getOption().matches(options::OPT_fpie) ||
7405 A->getOption().matches(options::OPT_fPIE))
7406 CmdArgs.push_back("-pie");
7407 else
7408 CmdArgs.push_back("-no_pie");
7409 }
Steven Wu574b0f22016-03-01 01:07:58 +00007410 // for embed-bitcode, use -bitcode_bundle in linker command
7411 if (C.getDriver().embedBitcodeEnabled() ||
7412 C.getDriver().embedBitcodeMarkerOnly()) {
7413 // Check if the toolchain supports bitcode build flow.
7414 if (MachOTC.SupportsEmbeddedBitcode())
7415 CmdArgs.push_back("-bitcode_bundle");
7416 else
7417 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7418 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007419
7420 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7421 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7422 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7423 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7424 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7425 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7426 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7427 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7428 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7429 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7430 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7431 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7432 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7433 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7434 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7435 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007436
Daniel Dunbar84384642011-05-02 21:03:47 +00007437 // Give --sysroot= preference, over the Apple specific behavior to also use
7438 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007439 StringRef sysroot = C.getSysRoot();
7440 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007441 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007442 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007443 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7444 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007445 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007446 }
7447
Daniel Dunbarc1964212009-03-26 16:23:12 +00007448 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7449 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7450 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7451 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7452 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007453 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007454 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7455 Args.AddAllArgs(CmdArgs, options::OPT_y);
7456 Args.AddLastArg(CmdArgs, options::OPT_w);
7457 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7458 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7459 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7460 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7461 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7462 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7463 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7464 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7465 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7466 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7467 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7468 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7469}
7470
Douglas Katzman95354292015-06-23 20:42:09 +00007471void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7472 const InputInfo &Output,
7473 const InputInfoList &Inputs,
7474 const ArgList &Args,
7475 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007476 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007477
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007478 // If the number of arguments surpasses the system limits, we will encode the
7479 // input files in a separate file, shortening the command line. To this end,
7480 // build a list of input file names that can be passed via a file with the
7481 // -filelist linker option.
7482 llvm::opt::ArgStringList InputFileList;
7483
Daniel Dunbarc1964212009-03-26 16:23:12 +00007484 // The logic here is derived from gcc's behavior; most of which
7485 // comes from specs (starting with link_command). Consult gcc for
7486 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007487 ArgStringList CmdArgs;
7488
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007489 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7490 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7491 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007492 for (const auto &Arg : Args)
7493 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007494 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007495 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007496 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007497 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007498 return;
7499 }
7500
Daniel Dunbarc1964212009-03-26 16:23:12 +00007501 // I'm not sure why this particular decomposition exists in gcc, but
7502 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007503 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007504
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007505 // It seems that the 'e' option is completely ignored for dynamic executables
7506 // (the default), and with static executables, the last one wins, as expected.
7507 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7508 options::OPT_Z_Flag, options::OPT_u_Group,
7509 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007510
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007511 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7512 // members of static archive libraries which implement Objective-C classes or
7513 // categories.
7514 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7515 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007516
Daniel Dunbarc1964212009-03-26 16:23:12 +00007517 CmdArgs.push_back("-o");
7518 CmdArgs.push_back(Output.getFilename());
7519
Douglas Katzman78b37b02015-11-17 20:28:07 +00007520 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007521 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007522
Peter Collingbournec4122c12015-06-15 21:08:13 +00007523 // SafeStack requires its own runtime libraries
7524 // These libraries should be linked first, to make sure the
7525 // __safestack_init constructor executes before everything else
7526 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7527 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7528 "libclang_rt.safestack_osx.a",
7529 /*AlwaysLink=*/true);
7530 }
7531
Daniel Dunbarc1964212009-03-26 16:23:12 +00007532 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007533
Douglas Gregor9295df02012-05-15 21:00:27 +00007534 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007535 // Build the input file for -filelist (list of linker input files) in case we
7536 // need it later
7537 for (const auto &II : Inputs) {
7538 if (!II.isFilename()) {
7539 // This is a linker input argument.
7540 // We cannot mix input arguments and file names in a -filelist input, thus
7541 // we prematurely stop our list (remaining files shall be passed as
7542 // arguments).
7543 if (InputFileList.size() > 0)
7544 break;
7545
7546 continue;
7547 }
7548
7549 InputFileList.push_back(II.getFilename());
7550 }
7551
Douglas Katzman78b37b02015-11-17 20:28:07 +00007552 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007553 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7554
Douglas Katzman78b37b02015-11-17 20:28:07 +00007555 if (isObjCRuntimeLinked(Args) &&
7556 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007557 // We use arclite library for both ARC and subscripting support.
7558 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7559
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007560 CmdArgs.push_back("-framework");
7561 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007562 // Link libobj.
7563 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007564 }
John McCall31168b02011-06-15 23:02:42 +00007565
Daniel Dunbarc1964212009-03-26 16:23:12 +00007566 if (LinkingOutput) {
7567 CmdArgs.push_back("-arch_multiple");
7568 CmdArgs.push_back("-final_output");
7569 CmdArgs.push_back(LinkingOutput);
7570 }
7571
Daniel Dunbarc1964212009-03-26 16:23:12 +00007572 if (Args.hasArg(options::OPT_fnested_functions))
7573 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007574
Justin Bognerc7701242015-05-12 05:44:36 +00007575 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7576
Douglas Katzman78b37b02015-11-17 20:28:07 +00007577 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007578 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007579 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007580
Daniel Dunbarc1964212009-03-26 16:23:12 +00007581 // link_ssp spec is empty.
7582
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007583 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007584 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007585 }
7586
Douglas Katzman78b37b02015-11-17 20:28:07 +00007587 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007588 // endfile_spec is empty.
7589 }
7590
7591 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7592 Args.AddAllArgs(CmdArgs, options::OPT_F);
7593
Steven Wu3ffb61b2015-02-06 18:08:29 +00007594 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007595 for (const Arg *A : Args.filtered(options::OPT_iframework))
7596 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007597
Douglas Katzman78b37b02015-11-17 20:28:07 +00007598 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007599 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7600 if (A->getValue() == StringRef("Accelerate")) {
7601 CmdArgs.push_back("-framework");
7602 CmdArgs.push_back("Accelerate");
7603 }
7604 }
7605 }
7606
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007607 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007608 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007609 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007610 Cmd->setInputFileList(std::move(InputFileList));
7611 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007612}
7613
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007614void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007615 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007616 const InputInfoList &Inputs,
7617 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007618 const char *LinkingOutput) const {
7619 ArgStringList CmdArgs;
7620
7621 CmdArgs.push_back("-create");
7622 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007623
7624 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007625 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007626
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007627 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007628 assert(II.isFilename() && "Unexpected lipo input.");
7629 CmdArgs.push_back(II.getFilename());
7630 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007631
7632 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007633 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007634}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007635
Daniel Dunbar88299622010-06-04 18:28:36 +00007636void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007637 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007638 const InputInfoList &Inputs,
7639 const ArgList &Args,
7640 const char *LinkingOutput) const {
7641 ArgStringList CmdArgs;
7642
Daniel Dunbareb86b042011-05-09 17:23:16 +00007643 CmdArgs.push_back("-o");
7644 CmdArgs.push_back(Output.getFilename());
7645
Daniel Dunbar88299622010-06-04 18:28:36 +00007646 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7647 const InputInfo &Input = Inputs[0];
7648 assert(Input.isFilename() && "Unexpected dsymutil input.");
7649 CmdArgs.push_back(Input.getFilename());
7650
Daniel Dunbar88299622010-06-04 18:28:36 +00007651 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007652 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007653 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007654}
7655
Eric Christopher551ef452011-08-23 17:56:55 +00007656void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007657 const InputInfo &Output,
7658 const InputInfoList &Inputs,
7659 const ArgList &Args,
7660 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007661 ArgStringList CmdArgs;
7662 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007663 CmdArgs.push_back("--debug-info");
7664 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007665 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007666
7667 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7668 const InputInfo &Input = Inputs[0];
7669 assert(Input.isFilename() && "Unexpected verify input");
7670
7671 // Grabbing the output of the earlier dsymutil run.
7672 CmdArgs.push_back(Input.getFilename());
7673
7674 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007675 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007676 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007677}
7678
Douglas Katzman95354292015-06-23 20:42:09 +00007679void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007680 const InputInfo &Output,
7681 const InputInfoList &Inputs,
7682 const ArgList &Args,
7683 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007684 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007685 ArgStringList CmdArgs;
7686
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007687 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007688
7689 CmdArgs.push_back("-o");
7690 CmdArgs.push_back(Output.getFilename());
7691
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007692 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007693 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007694
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007695 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007696 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007697}
7698
Douglas Katzman95354292015-06-23 20:42:09 +00007699void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7700 const InputInfo &Output,
7701 const InputInfoList &Inputs,
7702 const ArgList &Args,
7703 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007704 ArgStringList CmdArgs;
7705
David Chisnall272a0712012-02-29 15:06:12 +00007706 // Demangle C++ names in errors
7707 CmdArgs.push_back("-C");
7708
Douglas Katzman78b37b02015-11-17 20:28:07 +00007709 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007710 CmdArgs.push_back("-e");
7711 CmdArgs.push_back("_start");
7712 }
7713
7714 if (Args.hasArg(options::OPT_static)) {
7715 CmdArgs.push_back("-Bstatic");
7716 CmdArgs.push_back("-dn");
7717 } else {
7718 CmdArgs.push_back("-Bdynamic");
7719 if (Args.hasArg(options::OPT_shared)) {
7720 CmdArgs.push_back("-shared");
7721 } else {
7722 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007723 CmdArgs.push_back(
7724 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007725 }
7726 }
7727
7728 if (Output.isFilename()) {
7729 CmdArgs.push_back("-o");
7730 CmdArgs.push_back(Output.getFilename());
7731 } else {
7732 assert(Output.isNothing() && "Invalid output.");
7733 }
7734
Douglas Katzman78b37b02015-11-17 20:28:07 +00007735 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007736 if (!Args.hasArg(options::OPT_shared))
7737 CmdArgs.push_back(
7738 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7739
7740 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7741 CmdArgs.push_back(
7742 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7743 CmdArgs.push_back(
7744 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007745 }
7746
Douglas Katzman6059ef92015-11-17 17:41:23 +00007747 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007748
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007749 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7750 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007751
7752 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7753
Douglas Katzman78b37b02015-11-17 20:28:07 +00007754 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007755 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007756 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007757 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007758 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007759 if (!Args.hasArg(options::OPT_shared)) {
7760 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007761 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007762 }
David Chisnallf571cde2012-02-15 13:39:01 +00007763 }
7764
Douglas Katzman78b37b02015-11-17 20:28:07 +00007765 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007766 CmdArgs.push_back(
7767 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007768 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007769 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007770
Xinliang David Li69306c02015-10-22 06:15:31 +00007771 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007772
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007773 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007774 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007775}
7776
Douglas Katzman95354292015-06-23 20:42:09 +00007777void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7778 const InputInfo &Output,
7779 const InputInfoList &Inputs,
7780 const ArgList &Args,
7781 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007782 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007783 ArgStringList CmdArgs;
7784
Rafael Espindolacc126272014-02-28 01:55:21 +00007785 switch (getToolChain().getArch()) {
7786 case llvm::Triple::x86:
7787 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7788 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007789 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007790 break;
7791
7792 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007793 CmdArgs.push_back("-mppc");
7794 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007795 break;
7796
7797 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007798 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007799 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007800 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7801 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7802 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007803 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007804 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007805
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007806 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007807 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007808 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7809 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7810 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007811 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007812 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007813
7814 case llvm::Triple::mips64:
7815 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007816 StringRef CPUName;
7817 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007818 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007819
7820 CmdArgs.push_back("-mabi");
7821 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7822
7823 if (getToolChain().getArch() == llvm::Triple::mips64)
7824 CmdArgs.push_back("-EB");
7825 else
7826 CmdArgs.push_back("-EL");
7827
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007828 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007829 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007830 }
7831
Rafael Espindolacc126272014-02-28 01:55:21 +00007832 default:
7833 break;
7834 }
7835
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007836 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007837
7838 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007839 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007840
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007841 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007842 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007843
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007844 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007845 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007846}
7847
Douglas Katzman95354292015-06-23 20:42:09 +00007848void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7849 const InputInfo &Output,
7850 const InputInfoList &Inputs,
7851 const ArgList &Args,
7852 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007853 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007854 ArgStringList CmdArgs;
7855
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007856 // Silence warning for "clang -g foo.o -o foo"
7857 Args.ClaimAllArgs(options::OPT_g_Group);
7858 // and "clang -emit-llvm foo.o -o foo"
7859 Args.ClaimAllArgs(options::OPT_emit_llvm);
7860 // and for "clang -w foo.o -o foo". Other warning options are already
7861 // handled somewhere else.
7862 Args.ClaimAllArgs(options::OPT_w);
7863
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007864 if (getToolChain().getArch() == llvm::Triple::mips64)
7865 CmdArgs.push_back("-EB");
7866 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7867 CmdArgs.push_back("-EL");
7868
Douglas Katzman78b37b02015-11-17 20:28:07 +00007869 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007870 CmdArgs.push_back("-e");
7871 CmdArgs.push_back("__start");
7872 }
7873
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007874 if (Args.hasArg(options::OPT_static)) {
7875 CmdArgs.push_back("-Bstatic");
7876 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007877 if (Args.hasArg(options::OPT_rdynamic))
7878 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007879 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007880 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007881 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007882 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007883 } else {
7884 CmdArgs.push_back("-dynamic-linker");
7885 CmdArgs.push_back("/usr/libexec/ld.so");
7886 }
7887 }
7888
Rafael Espindola044f7832013-06-05 04:28:55 +00007889 if (Args.hasArg(options::OPT_nopie))
7890 CmdArgs.push_back("-nopie");
7891
Daniel Dunbarb440f562010-08-02 02:38:21 +00007892 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007893 CmdArgs.push_back("-o");
7894 CmdArgs.push_back(Output.getFilename());
7895 } else {
7896 assert(Output.isNothing() && "Invalid output.");
7897 }
7898
Douglas Katzman78b37b02015-11-17 20:28:07 +00007899 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007900 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007901 if (Args.hasArg(options::OPT_pg))
7902 CmdArgs.push_back(
7903 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007904 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007905 CmdArgs.push_back(
7906 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7907 CmdArgs.push_back(
7908 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007909 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007910 CmdArgs.push_back(
7911 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007912 }
7913 }
7914
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007915 std::string Triple = getToolChain().getTripleString();
7916 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007917 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007918 CmdArgs.push_back(
7919 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007920
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007921 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7922 options::OPT_e, options::OPT_s, options::OPT_t,
7923 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007924
Daniel Dunbar54423b22010-09-17 00:24:54 +00007925 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007926
Douglas Katzman78b37b02015-11-17 20:28:07 +00007927 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007928 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007929 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007930 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007931 CmdArgs.push_back("-lm_p");
7932 else
7933 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007934 }
7935
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007936 // FIXME: For some reason GCC passes -lgcc before adding
7937 // the default system libraries. Just mimic this for now.
7938 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007939
Eric Christopher17674ec2012-09-13 06:32:34 +00007940 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007941 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7942 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007943 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007944 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007945 }
7946
Chandler Carruth45661652011-12-17 22:32:42 +00007947 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007948 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007949 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007950 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007951 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007952 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007953
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007954 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007955 }
7956
Douglas Katzman78b37b02015-11-17 20:28:07 +00007957 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007958 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007959 CmdArgs.push_back(
7960 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007961 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007962 CmdArgs.push_back(
7963 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007964 }
7965
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007966 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007967 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007968}
Ed Schoutene33194b2009-04-02 19:13:12 +00007969
Douglas Katzman95354292015-06-23 20:42:09 +00007970void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7971 const InputInfo &Output,
7972 const InputInfoList &Inputs,
7973 const ArgList &Args,
7974 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007975 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007976 ArgStringList CmdArgs;
7977
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007978 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007979
7980 CmdArgs.push_back("-o");
7981 CmdArgs.push_back(Output.getFilename());
7982
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007983 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007984 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007985
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007986 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007987 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007988}
7989
Douglas Katzman95354292015-06-23 20:42:09 +00007990void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7991 const InputInfo &Output,
7992 const InputInfoList &Inputs,
7993 const ArgList &Args,
7994 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007995 const Driver &D = getToolChain().getDriver();
7996 ArgStringList CmdArgs;
7997
Douglas Katzman78b37b02015-11-17 20:28:07 +00007998 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007999 CmdArgs.push_back("-e");
8000 CmdArgs.push_back("__start");
8001 }
8002
8003 if (Args.hasArg(options::OPT_static)) {
8004 CmdArgs.push_back("-Bstatic");
8005 } else {
8006 if (Args.hasArg(options::OPT_rdynamic))
8007 CmdArgs.push_back("-export-dynamic");
8008 CmdArgs.push_back("--eh-frame-hdr");
8009 CmdArgs.push_back("-Bdynamic");
8010 if (Args.hasArg(options::OPT_shared)) {
8011 CmdArgs.push_back("-shared");
8012 } else {
8013 CmdArgs.push_back("-dynamic-linker");
8014 CmdArgs.push_back("/usr/libexec/ld.so");
8015 }
8016 }
8017
8018 if (Output.isFilename()) {
8019 CmdArgs.push_back("-o");
8020 CmdArgs.push_back(Output.getFilename());
8021 } else {
8022 assert(Output.isNothing() && "Invalid output.");
8023 }
8024
Douglas Katzman78b37b02015-11-17 20:28:07 +00008025 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008026 if (!Args.hasArg(options::OPT_shared)) {
8027 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008028 CmdArgs.push_back(
8029 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008030 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008031 CmdArgs.push_back(
8032 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8033 CmdArgs.push_back(
8034 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008035 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008036 CmdArgs.push_back(
8037 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008038 }
8039 }
8040
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008041 Args.AddAllArgs(CmdArgs,
8042 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008043
8044 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8045
Douglas Katzman78b37b02015-11-17 20:28:07 +00008046 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008047 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008048 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8049 if (Args.hasArg(options::OPT_pg))
8050 CmdArgs.push_back("-lm_p");
8051 else
8052 CmdArgs.push_back("-lm");
8053 }
8054
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008055 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008056 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008057 CmdArgs.push_back("-lpthread_p");
8058 else
8059 CmdArgs.push_back("-lpthread");
8060 }
8061
Eli Friedman9fa28852012-08-08 23:57:20 +00008062 if (!Args.hasArg(options::OPT_shared)) {
8063 if (Args.hasArg(options::OPT_pg))
8064 CmdArgs.push_back("-lc_p");
8065 else
8066 CmdArgs.push_back("-lc");
8067 }
8068
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008069 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008070 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008071 case llvm::Triple::arm:
8072 MyArch = "arm";
8073 break;
8074 case llvm::Triple::x86:
8075 MyArch = "i386";
8076 break;
8077 case llvm::Triple::x86_64:
8078 MyArch = "amd64";
8079 break;
8080 default:
8081 llvm_unreachable("Unsupported architecture");
8082 }
8083 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008084 }
8085
Douglas Katzman78b37b02015-11-17 20:28:07 +00008086 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008087 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008088 CmdArgs.push_back(
8089 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008090 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008091 CmdArgs.push_back(
8092 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008093 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008095 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008096 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008097}
8098
Douglas Katzman95354292015-06-23 20:42:09 +00008099void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8100 const InputInfo &Output,
8101 const InputInfoList &Inputs,
8102 const ArgList &Args,
8103 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008104 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008105 ArgStringList CmdArgs;
8106
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008107 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8108 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008109 switch (getToolChain().getArch()) {
8110 default:
8111 break;
8112 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008113 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008114 break;
8115 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008116 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008117 break;
8118 case llvm::Triple::mips:
8119 case llvm::Triple::mipsel:
8120 case llvm::Triple::mips64:
8121 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008122 StringRef CPUName;
8123 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008124 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008125
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008126 CmdArgs.push_back("-march");
8127 CmdArgs.push_back(CPUName.data());
8128
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008129 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008130 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008131
8132 if (getToolChain().getArch() == llvm::Triple::mips ||
8133 getToolChain().getArch() == llvm::Triple::mips64)
8134 CmdArgs.push_back("-EB");
8135 else
8136 CmdArgs.push_back("-EL");
8137
Dimitry Andric46f338c2015-12-27 10:36:44 +00008138 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8139 StringRef v = A->getValue();
8140 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8141 A->claim();
8142 }
8143
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008144 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008145 break;
8146 }
8147 case llvm::Triple::arm:
8148 case llvm::Triple::armeb:
8149 case llvm::Triple::thumb:
8150 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008151 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008152
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008153 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008154 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008155 else
Renato Golinf4421f72014-02-19 10:44:07 +00008156 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008157
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008158 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008159 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008160 case llvm::Triple::GNUEABI:
8161 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008162 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008163 break;
8164
8165 default:
8166 CmdArgs.push_back("-matpcs");
8167 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008168 break;
8169 }
8170 case llvm::Triple::sparc:
8171 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008172 case llvm::Triple::sparcv9: {
8173 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8174 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008175 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008176 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008177 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008178 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008179
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008180 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008181
8182 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008183 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008184
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008185 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008186 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008187
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008188 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008189 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008190}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008191
Douglas Katzman95354292015-06-23 20:42:09 +00008192void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8193 const InputInfo &Output,
8194 const InputInfoList &Inputs,
8195 const ArgList &Args,
8196 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008197 const toolchains::FreeBSD &ToolChain =
8198 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008199 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008200 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008201 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008202 !Args.hasArg(options::OPT_shared) &&
8203 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008204 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008205
8206 // Silence warning for "clang -g foo.o -o foo"
8207 Args.ClaimAllArgs(options::OPT_g_Group);
8208 // and "clang -emit-llvm foo.o -o foo"
8209 Args.ClaimAllArgs(options::OPT_emit_llvm);
8210 // and for "clang -w foo.o -o foo". Other warning options are already
8211 // handled somewhere else.
8212 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008213
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008214 if (!D.SysRoot.empty())
8215 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8216
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008217 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008218 CmdArgs.push_back("-pie");
8219
Ed Maste1bc232d2016-04-12 21:11:46 +00008220 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008221 if (Args.hasArg(options::OPT_static)) {
8222 CmdArgs.push_back("-Bstatic");
8223 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008224 if (Args.hasArg(options::OPT_rdynamic))
8225 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008226 if (Args.hasArg(options::OPT_shared)) {
8227 CmdArgs.push_back("-Bshareable");
8228 } else {
8229 CmdArgs.push_back("-dynamic-linker");
8230 CmdArgs.push_back("/libexec/ld-elf.so.1");
8231 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008232 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008233 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8234 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8235 CmdArgs.push_back("--hash-style=both");
8236 }
8237 }
8238 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008239 }
8240
8241 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8242 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008243 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244 CmdArgs.push_back("-m");
8245 CmdArgs.push_back("elf_i386_fbsd");
8246 }
8247
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008248 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008249 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008250 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008251 }
8252
Dimitry Andric904895f2015-12-27 06:47:09 +00008253 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8254 if (ToolChain.getArch() == llvm::Triple::mips ||
8255 ToolChain.getArch() == llvm::Triple::mipsel ||
8256 ToolChain.getArch() == llvm::Triple::mips64 ||
8257 ToolChain.getArch() == llvm::Triple::mips64el) {
8258 StringRef v = A->getValue();
8259 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8260 A->claim();
8261 }
8262 }
8263
Daniel Dunbarb440f562010-08-02 02:38:21 +00008264 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008265 CmdArgs.push_back("-o");
8266 CmdArgs.push_back(Output.getFilename());
8267 } else {
8268 assert(Output.isNothing() && "Invalid output.");
8269 }
8270
Douglas Katzman78b37b02015-11-17 20:28:07 +00008271 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008272 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008273 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008274 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008275 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008276 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008277 crt1 = "Scrt1.o";
8278 else
8279 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008280 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008281 if (crt1)
8282 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8283
8284 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8285
Craig Topper92fc2df2014-05-17 16:56:41 +00008286 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008287 if (Args.hasArg(options::OPT_static))
8288 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008289 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008290 crtbegin = "crtbeginS.o";
8291 else
8292 crtbegin = "crtbegin.o";
8293
8294 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008295 }
8296
8297 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008298 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008299 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8300 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008301 Args.AddAllArgs(CmdArgs, options::OPT_s);
8302 Args.AddAllArgs(CmdArgs, options::OPT_t);
8303 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8304 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008305
Teresa Johnson945bc502015-10-15 20:35:53 +00008306 if (D.isUsingLTO())
8307 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008308
Alexey Samsonov52550342014-09-15 19:58:40 +00008309 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008310 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008311
Douglas Katzman78b37b02015-11-17 20:28:07 +00008312 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008313 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008314 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008315 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008316 if (Args.hasArg(options::OPT_pg))
8317 CmdArgs.push_back("-lm_p");
8318 else
8319 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008320 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008321 if (NeedsSanitizerDeps)
8322 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008323 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8324 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008325 if (Args.hasArg(options::OPT_pg))
8326 CmdArgs.push_back("-lgcc_p");
8327 else
8328 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008329 if (Args.hasArg(options::OPT_static)) {
8330 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008331 } else if (Args.hasArg(options::OPT_pg)) {
8332 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008333 } else {
8334 CmdArgs.push_back("--as-needed");
8335 CmdArgs.push_back("-lgcc_s");
8336 CmdArgs.push_back("--no-as-needed");
8337 }
8338
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008339 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008340 if (Args.hasArg(options::OPT_pg))
8341 CmdArgs.push_back("-lpthread_p");
8342 else
8343 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008344 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008345
Roman Divacky66f22762011-02-10 16:59:40 +00008346 if (Args.hasArg(options::OPT_pg)) {
8347 if (Args.hasArg(options::OPT_shared))
8348 CmdArgs.push_back("-lc");
8349 else
8350 CmdArgs.push_back("-lc_p");
8351 CmdArgs.push_back("-lgcc_p");
8352 } else {
8353 CmdArgs.push_back("-lc");
8354 CmdArgs.push_back("-lgcc");
8355 }
8356
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008357 if (Args.hasArg(options::OPT_static)) {
8358 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008359 } else if (Args.hasArg(options::OPT_pg)) {
8360 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008361 } else {
8362 CmdArgs.push_back("--as-needed");
8363 CmdArgs.push_back("-lgcc_s");
8364 CmdArgs.push_back("--no-as-needed");
8365 }
8366 }
8367
Douglas Katzman78b37b02015-11-17 20:28:07 +00008368 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008369 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008370 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008371 else
8372 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008373 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008374 }
8375
Xinliang David Li69306c02015-10-22 06:15:31 +00008376 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008377
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008378 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008379 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008380}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008381
Douglas Katzman95354292015-06-23 20:42:09 +00008382void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008383 const InputInfo &Output,
8384 const InputInfoList &Inputs,
8385 const ArgList &Args,
8386 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008387 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008388 ArgStringList CmdArgs;
8389
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008390 // GNU as needs different flags for creating the correct output format
8391 // on architectures with different ABIs or optional feature sets.
8392 switch (getToolChain().getArch()) {
8393 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008394 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008395 break;
8396 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008397 case llvm::Triple::armeb:
8398 case llvm::Triple::thumb:
8399 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008400 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008401 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8402 std::string Arch =
8403 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008404 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008405 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008406 }
8407
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008408 case llvm::Triple::mips:
8409 case llvm::Triple::mipsel:
8410 case llvm::Triple::mips64:
8411 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008412 StringRef CPUName;
8413 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008414 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008415
8416 CmdArgs.push_back("-march");
8417 CmdArgs.push_back(CPUName.data());
8418
8419 CmdArgs.push_back("-mabi");
8420 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8421
8422 if (getToolChain().getArch() == llvm::Triple::mips ||
8423 getToolChain().getArch() == llvm::Triple::mips64)
8424 CmdArgs.push_back("-EB");
8425 else
8426 CmdArgs.push_back("-EL");
8427
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008428 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008429 break;
8430 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008431
8432 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008433 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008434 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008435 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8436 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008437 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008438 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008439 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008440
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008441 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008442 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008443 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8444 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008445 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008446 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008447 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008448
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008449 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008450 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008451 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008453 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008454
8455 CmdArgs.push_back("-o");
8456 CmdArgs.push_back(Output.getFilename());
8457
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008458 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008459 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008460
David Chisnallddbd68f2011-09-27 22:03:18 +00008461 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008462 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008463}
8464
Douglas Katzman95354292015-06-23 20:42:09 +00008465void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8466 const InputInfo &Output,
8467 const InputInfoList &Inputs,
8468 const ArgList &Args,
8469 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008470 const Driver &D = getToolChain().getDriver();
8471 ArgStringList CmdArgs;
8472
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008473 if (!D.SysRoot.empty())
8474 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8475
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008476 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008477 if (Args.hasArg(options::OPT_static)) {
8478 CmdArgs.push_back("-Bstatic");
8479 } else {
8480 if (Args.hasArg(options::OPT_rdynamic))
8481 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008482 if (Args.hasArg(options::OPT_shared)) {
8483 CmdArgs.push_back("-Bshareable");
8484 } else {
8485 CmdArgs.push_back("-dynamic-linker");
8486 CmdArgs.push_back("/libexec/ld.elf_so");
8487 }
8488 }
8489
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008490 // Many NetBSD architectures support more than one ABI.
8491 // Determine the correct emulation for ld.
8492 switch (getToolChain().getArch()) {
8493 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008494 CmdArgs.push_back("-m");
8495 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008496 break;
8497 case llvm::Triple::arm:
8498 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008499 CmdArgs.push_back("-m");
8500 switch (getToolChain().getTriple().getEnvironment()) {
8501 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008502 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008503 CmdArgs.push_back("armelf_nbsd_eabi");
8504 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008505 case llvm::Triple::EABIHF:
8506 case llvm::Triple::GNUEABIHF:
8507 CmdArgs.push_back("armelf_nbsd_eabihf");
8508 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008509 default:
8510 CmdArgs.push_back("armelf_nbsd");
8511 break;
8512 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008513 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008514 case llvm::Triple::armeb:
8515 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008516 arm::appendEBLinkFlags(
8517 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008518 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008519 CmdArgs.push_back("-m");
8520 switch (getToolChain().getTriple().getEnvironment()) {
8521 case llvm::Triple::EABI:
8522 case llvm::Triple::GNUEABI:
8523 CmdArgs.push_back("armelfb_nbsd_eabi");
8524 break;
8525 case llvm::Triple::EABIHF:
8526 case llvm::Triple::GNUEABIHF:
8527 CmdArgs.push_back("armelfb_nbsd_eabihf");
8528 break;
8529 default:
8530 CmdArgs.push_back("armelfb_nbsd");
8531 break;
8532 }
8533 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008534 case llvm::Triple::mips64:
8535 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008536 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008537 CmdArgs.push_back("-m");
8538 if (getToolChain().getArch() == llvm::Triple::mips64)
8539 CmdArgs.push_back("elf32btsmip");
8540 else
8541 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008542 } else if (mips::hasMipsAbiArg(Args, "64")) {
8543 CmdArgs.push_back("-m");
8544 if (getToolChain().getArch() == llvm::Triple::mips64)
8545 CmdArgs.push_back("elf64btsmip");
8546 else
8547 CmdArgs.push_back("elf64ltsmip");
8548 }
8549 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008550 case llvm::Triple::ppc:
8551 CmdArgs.push_back("-m");
8552 CmdArgs.push_back("elf32ppc_nbsd");
8553 break;
8554
8555 case llvm::Triple::ppc64:
8556 case llvm::Triple::ppc64le:
8557 CmdArgs.push_back("-m");
8558 CmdArgs.push_back("elf64ppc");
8559 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008560
8561 case llvm::Triple::sparc:
8562 CmdArgs.push_back("-m");
8563 CmdArgs.push_back("elf32_sparc");
8564 break;
8565
8566 case llvm::Triple::sparcv9:
8567 CmdArgs.push_back("-m");
8568 CmdArgs.push_back("elf64_sparc");
8569 break;
8570
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008571 default:
8572 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008573 }
8574
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008575 if (Output.isFilename()) {
8576 CmdArgs.push_back("-o");
8577 CmdArgs.push_back(Output.getFilename());
8578 } else {
8579 assert(Output.isNothing() && "Invalid output.");
8580 }
8581
Douglas Katzman78b37b02015-11-17 20:28:07 +00008582 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008583 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008584 CmdArgs.push_back(
8585 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8586 CmdArgs.push_back(
8587 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8588 CmdArgs.push_back(
8589 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008590 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008591 CmdArgs.push_back(
8592 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8593 CmdArgs.push_back(
8594 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008595 }
8596 }
8597
8598 Args.AddAllArgs(CmdArgs, options::OPT_L);
8599 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8600 Args.AddAllArgs(CmdArgs, options::OPT_e);
8601 Args.AddAllArgs(CmdArgs, options::OPT_s);
8602 Args.AddAllArgs(CmdArgs, options::OPT_t);
8603 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8604 Args.AddAllArgs(CmdArgs, options::OPT_r);
8605
8606 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8607
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008608 unsigned Major, Minor, Micro;
8609 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8610 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008611 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008612 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008613 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008614 case llvm::Triple::arm:
8615 case llvm::Triple::armeb:
8616 case llvm::Triple::thumb:
8617 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008618 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008619 case llvm::Triple::ppc64:
8620 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008621 case llvm::Triple::sparc:
8622 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008623 case llvm::Triple::x86:
8624 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008625 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008626 break;
8627 default:
8628 break;
8629 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008630 }
8631
Douglas Katzman78b37b02015-11-17 20:28:07 +00008632 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008633 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008634 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008635 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8636 CmdArgs.push_back("-lm");
8637 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008638 if (Args.hasArg(options::OPT_pthread))
8639 CmdArgs.push_back("-lpthread");
8640 CmdArgs.push_back("-lc");
8641
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008642 if (useLibgcc) {
8643 if (Args.hasArg(options::OPT_static)) {
8644 // libgcc_eh depends on libc, so resolve as much as possible,
8645 // pull in any new requirements from libc and then get the rest
8646 // of libgcc.
8647 CmdArgs.push_back("-lgcc_eh");
8648 CmdArgs.push_back("-lc");
8649 CmdArgs.push_back("-lgcc");
8650 } else {
8651 CmdArgs.push_back("-lgcc");
8652 CmdArgs.push_back("--as-needed");
8653 CmdArgs.push_back("-lgcc_s");
8654 CmdArgs.push_back("--no-as-needed");
8655 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008656 }
8657 }
8658
Douglas Katzman78b37b02015-11-17 20:28:07 +00008659 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008660 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008661 CmdArgs.push_back(
8662 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008663 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008664 CmdArgs.push_back(
8665 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8666 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008667 }
8668
Xinliang David Li69306c02015-10-22 06:15:31 +00008669 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008670
Logan Chieneb9162f2014-06-26 14:23:45 +00008671 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008672 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008673}
8674
Douglas Katzman95354292015-06-23 20:42:09 +00008675void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8676 const InputInfo &Output,
8677 const InputInfoList &Inputs,
8678 const ArgList &Args,
8679 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008680 claimNoWarnArgs(Args);
8681
James Y Knight2db38f32015-08-15 03:45:25 +00008682 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8683 llvm::Triple Triple = llvm::Triple(TripleStr);
8684
Rafael Espindola92b00932010-08-10 00:25:48 +00008685 ArgStringList CmdArgs;
8686
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008687 llvm::Reloc::Model RelocationModel;
8688 unsigned PICLevel;
8689 bool IsPIE;
8690 std::tie(RelocationModel, PICLevel, IsPIE) =
8691 ParsePICArgs(getToolChain(), Triple, Args);
8692
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008693 switch (getToolChain().getArch()) {
8694 default:
8695 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008696 // Add --32/--64 to make sure we get the format we want.
8697 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008698 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008699 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008700 break;
8701 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008702 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8703 CmdArgs.push_back("--x32");
8704 else
8705 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008706 break;
8707 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008708 CmdArgs.push_back("-a32");
8709 CmdArgs.push_back("-mppc");
8710 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008711 break;
8712 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008713 CmdArgs.push_back("-a64");
8714 CmdArgs.push_back("-mppc64");
8715 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008716 break;
8717 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008718 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008719 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008720 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008721 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008722 break;
8723 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008724 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008725 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008726 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8727 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8728 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008729 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008730 }
8731 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008732 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008733 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8734 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8735 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008736 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008737 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008738 case llvm::Triple::arm:
8739 case llvm::Triple::armeb:
8740 case llvm::Triple::thumb:
8741 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008742 const llvm::Triple &Triple2 = getToolChain().getTriple();
8743 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008744 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008745 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008746 break;
8747 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008748 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008749 break;
8750 default:
8751 break;
8752 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008753
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008754 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008755 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8756 case arm::FloatABI::Soft:
8757 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8758 break;
8759 case arm::FloatABI::SoftFP:
8760 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8761 break;
8762 case arm::FloatABI::Hard:
8763 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8764 break;
8765 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008766
8767 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008768
8769 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008770 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008771 // march from being picked in the absence of a cpu flag.
8772 Arg *A;
8773 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008774 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008775 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008776 else
8777 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008778 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008779 break;
8780 }
8781 case llvm::Triple::mips:
8782 case llvm::Triple::mipsel:
8783 case llvm::Triple::mips64:
8784 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008785 StringRef CPUName;
8786 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008787 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008788 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008789
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008790 CmdArgs.push_back("-march");
8791 CmdArgs.push_back(CPUName.data());
8792
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008793 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008794 CmdArgs.push_back(ABIName.data());
8795
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008796 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8797 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008798 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008799 CmdArgs.push_back("-mno-shared");
8800
Daniel Sanders379d44b2014-07-16 11:52:23 +00008801 // LLVM doesn't support -mplt yet and acts as if it is always given.
8802 // However, -mplt has no effect with the N64 ABI.
8803 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008804
8805 if (getToolChain().getArch() == llvm::Triple::mips ||
8806 getToolChain().getArch() == llvm::Triple::mips64)
8807 CmdArgs.push_back("-EB");
8808 else
8809 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008810
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008811 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8812 if (StringRef(A->getValue()) == "2008")
8813 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8814 }
8815
Daniel Sanders379d44b2014-07-16 11:52:23 +00008816 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8817 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8818 options::OPT_mfp64)) {
8819 A->claim();
8820 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008821 } else if (mips::shouldUseFPXX(
8822 Args, getToolChain().getTriple(), CPUName, ABIName,
8823 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008824 CmdArgs.push_back("-mfpxx");
8825
8826 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8827 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008828 if (Arg *A =
8829 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008830 if (A->getOption().matches(options::OPT_mips16)) {
8831 A->claim();
8832 A->render(Args, CmdArgs);
8833 } else {
8834 A->claim();
8835 CmdArgs.push_back("-no-mips16");
8836 }
8837 }
8838
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008839 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8840 options::OPT_mno_micromips);
8841 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8842 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8843
Simon Atanasyanbd986632013-11-26 11:58:04 +00008844 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8845 // Do not use AddLastArg because not all versions of MIPS assembler
8846 // support -mmsa / -mno-msa options.
8847 if (A->getOption().matches(options::OPT_mmsa))
8848 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8849 }
8850
Daniel Sanders379d44b2014-07-16 11:52:23 +00008851 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8852 options::OPT_msoft_float);
8853
Toma Tabacub36d6102015-06-11 12:13:18 +00008854 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8855 options::OPT_msingle_float);
8856
Daniel Sanders379d44b2014-07-16 11:52:23 +00008857 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8858 options::OPT_mno_odd_spreg);
8859
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008860 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008861 break;
8862 }
8863 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008864 // Always pass an -march option, since our default of z10 is later
8865 // than the GNU assembler's default.
8866 StringRef CPUName = getSystemZTargetCPU(Args);
8867 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008868 break;
8869 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008870 }
8871
Renato Golina74bbc72015-07-22 15:32:36 +00008872 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008873 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008874
8875 CmdArgs.push_back("-o");
8876 CmdArgs.push_back(Output.getFilename());
8877
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008878 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008879 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008880
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008881 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008882 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008883
8884 // Handle the debug info splitting at object creation time if we're
8885 // creating an object.
8886 // TODO: Currently only works on linux with newer objcopy.
8887 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008888 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008889 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008890 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008891}
8892
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008893static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008894 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008895 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008896 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008897 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8898 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008899 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008900 CmdArgs.push_back("-lgcc");
8901
Logan Chien3d3373c2012-11-19 12:04:11 +00008902 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008903 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008904 CmdArgs.push_back("-lgcc");
8905 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008906 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008907 CmdArgs.push_back("--as-needed");
8908 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008909 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008910 CmdArgs.push_back("--no-as-needed");
8911 }
8912
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008913 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008914 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008915 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008916 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008917
8918 // According to Android ABI, we have to link with libdl if we are
8919 // linking with non-static libgcc.
8920 //
8921 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8922 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8923 if (isAndroid && !StaticLibgcc)
8924 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008925}
8926
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008927static std::string getLinuxDynamicLinker(const ArgList &Args,
8928 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008929 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8930
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008931 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008932 if (ToolChain.getTriple().isArch64Bit())
8933 return "/system/bin/linker64";
8934 else
8935 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008936 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8937 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008938 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008939 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008940 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008941 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008942 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008943 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008944 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008945 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008946 return "/lib/ld-linux-armhf.so.3";
8947 else
8948 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008949 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8950 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008951 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008952 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008953 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008954 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008955 return "/lib/ld-linux.so.3";
8956 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8957 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008958 std::string LibDir =
8959 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008960 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008961 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008962 if (mips::isUCLibc(Args))
8963 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008964 else if (!ToolChain.getTriple().hasEnvironment()) {
8965 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8966 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8967 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8968 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008969 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008970
8971 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008972 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008973 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008974 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008975 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8976 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008977 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008978 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008979 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8980 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008981 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008982 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008983 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008984 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008985 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008986 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008987 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8988 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008989 else
8990 return "/lib64/ld-linux-x86-64.so.2";
8991}
8992
Renato Golinc4b49242014-02-13 10:01:16 +00008993static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008994 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008995 // Make use of compiler-rt if --rtlib option is used
8996 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8997
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008998 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008999 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009000 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009001 default:
9002 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009003 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009004 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009005 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009006 break;
9007 }
Renato Golinc4b49242014-02-13 10:01:16 +00009008 break;
9009 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009010 // Make sure libgcc is not used under MSVC environment by default
9011 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9012 // Issue error diagnostic if libgcc is explicitly specified
9013 // through command line as --rtlib option argument.
9014 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9015 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9016 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9017 }
9018 } else
9019 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009020 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009021 }
9022}
9023
Rafael Espindola1e085772014-08-15 17:14:35 +00009024static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9025 switch (T.getArch()) {
9026 case llvm::Triple::x86:
9027 return "elf_i386";
9028 case llvm::Triple::aarch64:
9029 return "aarch64linux";
9030 case llvm::Triple::aarch64_be:
9031 return "aarch64_be_linux";
9032 case llvm::Triple::arm:
9033 case llvm::Triple::thumb:
9034 return "armelf_linux_eabi";
9035 case llvm::Triple::armeb:
9036 case llvm::Triple::thumbeb:
9037 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9038 case llvm::Triple::ppc:
9039 return "elf32ppclinux";
9040 case llvm::Triple::ppc64:
9041 return "elf64ppc";
9042 case llvm::Triple::ppc64le:
9043 return "elf64lppc";
9044 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009045 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009046 return "elf32_sparc";
9047 case llvm::Triple::sparcv9:
9048 return "elf64_sparc";
9049 case llvm::Triple::mips:
9050 return "elf32btsmip";
9051 case llvm::Triple::mipsel:
9052 return "elf32ltsmip";
9053 case llvm::Triple::mips64:
9054 if (mips::hasMipsAbiArg(Args, "n32"))
9055 return "elf32btsmipn32";
9056 return "elf64btsmip";
9057 case llvm::Triple::mips64el:
9058 if (mips::hasMipsAbiArg(Args, "n32"))
9059 return "elf32ltsmipn32";
9060 return "elf64ltsmip";
9061 case llvm::Triple::systemz:
9062 return "elf64_s390";
9063 case llvm::Triple::x86_64:
9064 if (T.getEnvironment() == llvm::Triple::GNUX32)
9065 return "elf32_x86_64";
9066 return "elf_x86_64";
9067 default:
9068 llvm_unreachable("Unexpected arch");
9069 }
9070}
9071
Douglas Katzman95354292015-06-23 20:42:09 +00009072void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9073 const InputInfo &Output,
9074 const InputInfoList &Inputs,
9075 const ArgList &Args,
9076 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009077 const toolchains::Linux &ToolChain =
9078 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009079 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009080
9081 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9082 llvm::Triple Triple = llvm::Triple(TripleStr);
9083
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009084 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009085 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009086 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009087 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9088 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009089 const bool HasCRTBeginEndFiles =
9090 ToolChain.getTriple().hasEnvironment() ||
9091 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009092
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009093 ArgStringList CmdArgs;
9094
Rafael Espindolad1002f62010-11-15 18:28:16 +00009095 // Silence warning for "clang -g foo.o -o foo"
9096 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009097 // and "clang -emit-llvm foo.o -o foo"
9098 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009099 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009100 // handled somewhere else.
9101 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009102
Peter Collingbourne39719a72015-11-20 20:49:39 +00009103 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9104 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009105 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009106 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009107 CmdArgs.push_back("-target");
9108 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9109 }
9110
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009111 if (!D.SysRoot.empty())
9112 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009113
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009114 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009115 CmdArgs.push_back("-pie");
9116
Rafael Espindola1c76c592010-11-07 22:57:16 +00009117 if (Args.hasArg(options::OPT_rdynamic))
9118 CmdArgs.push_back("-export-dynamic");
9119
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009120 if (Args.hasArg(options::OPT_s))
9121 CmdArgs.push_back("-s");
9122
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009123 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009124 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009125
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009126 for (const auto &Opt : ToolChain.ExtraOpts)
9127 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009128
9129 if (!Args.hasArg(options::OPT_static)) {
9130 CmdArgs.push_back("--eh-frame-hdr");
9131 }
9132
9133 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009134 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009135
9136 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009137 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9138 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009139 CmdArgs.push_back("-Bstatic");
9140 else
9141 CmdArgs.push_back("-static");
9142 } else if (Args.hasArg(options::OPT_shared)) {
9143 CmdArgs.push_back("-shared");
9144 }
9145
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009146 if (!Args.hasArg(options::OPT_static)) {
9147 if (Args.hasArg(options::OPT_rdynamic))
9148 CmdArgs.push_back("-export-dynamic");
9149
9150 if (!Args.hasArg(options::OPT_shared)) {
9151 const std::string Loader =
9152 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9153 CmdArgs.push_back("-dynamic-linker");
9154 CmdArgs.push_back(Args.MakeArgString(Loader));
9155 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009156 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009157
9158 CmdArgs.push_back("-o");
9159 CmdArgs.push_back(Output.getFilename());
9160
Douglas Katzman78b37b02015-11-17 20:28:07 +00009161 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009162 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009163 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009164 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009165 if (Args.hasArg(options::OPT_pg))
9166 crt1 = "gcrt1.o";
9167 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009168 crt1 = "Scrt1.o";
9169 else
9170 crt1 = "crt1.o";
9171 }
9172 if (crt1)
9173 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009174
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009175 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9176 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009177
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009178 const char *crtbegin;
9179 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009180 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009181 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009182 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009183 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009184 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009185 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009186 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009187
9188 if (HasCRTBeginEndFiles)
9189 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009190
9191 // Add crtfastmath.o if available and fast math is enabled.
9192 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009193 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009194
9195 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009196 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009197
Douglas Katzman6059ef92015-11-17 17:41:23 +00009198 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009199
Teresa Johnson945bc502015-10-15 20:35:53 +00009200 if (D.isUsingLTO())
9201 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009202
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009203 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9204 CmdArgs.push_back("--no-demangle");
9205
Alexey Samsonov52550342014-09-15 19:58:40 +00009206 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009207 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009208 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009209 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009210
Douglas Katzman78b37b02015-11-17 20:28:07 +00009211 if (D.CCCIsCXX() &&
9212 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009213 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009214 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009215 if (OnlyLibstdcxxStatic)
9216 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009217 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009218 if (OnlyLibstdcxxStatic)
9219 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009220 CmdArgs.push_back("-lm");
9221 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009222 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9223 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009224
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009225 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009226 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9227 if (Args.hasArg(options::OPT_static))
9228 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009229
Alexey Samsonov52550342014-09-15 19:58:40 +00009230 if (NeedsSanitizerDeps)
9231 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9232
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009233 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9234 Args.hasArg(options::OPT_pthreads);
9235
9236 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9237 options::OPT_fno_openmp, false)) {
9238 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9239 // FIXME: Does this really make sense for all GNU toolchains?
9240 WantPthread = true;
9241
9242 // Also link the particular OpenMP runtimes.
9243 switch (getOpenMPRuntime(ToolChain, Args)) {
9244 case OMPRT_OMP:
9245 CmdArgs.push_back("-lomp");
9246 break;
9247 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009248 CmdArgs.push_back("-lgomp");
9249
9250 // FIXME: Exclude this for platforms with libgomp that don't require
9251 // librt. Most modern Linux platforms require it, but some may not.
9252 CmdArgs.push_back("-lrt");
9253 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009254 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009255 CmdArgs.push_back("-liomp5");
9256 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009257 case OMPRT_Unknown:
9258 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009259 break;
9260 }
Chandler Carruth01538002013-01-17 13:19:29 +00009261 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009262
Renato Golinc4b49242014-02-13 10:01:16 +00009263 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009264
Richard Smith31d1de22015-05-20 22:48:44 +00009265 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009266 CmdArgs.push_back("-lpthread");
9267
Rafael Espindolab17bc532016-01-25 18:29:16 +00009268 if (Args.hasArg(options::OPT_fsplit_stack))
9269 CmdArgs.push_back("--wrap=pthread_create");
9270
Chandler Carruth94a32012012-05-14 18:31:18 +00009271 CmdArgs.push_back("-lc");
9272
9273 if (Args.hasArg(options::OPT_static))
9274 CmdArgs.push_back("--end-group");
9275 else
Renato Golinc4b49242014-02-13 10:01:16 +00009276 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009277 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009278
Rafael Espindola81937ec2010-12-01 01:52:43 +00009279 if (!Args.hasArg(options::OPT_nostartfiles)) {
9280 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009281 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009282 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009283 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009284 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009285 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009286 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009287
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009288 if (HasCRTBeginEndFiles)
9289 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009290 if (!isAndroid)
9291 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009292 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009293 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009294
Peter Collingbourne39719a72015-11-20 20:49:39 +00009295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009296}
9297
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009298// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9299// for the various SFI requirements like register masking. The assembly tool
9300// inserts the file containing the macros as an input into all the assembly
9301// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009302void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9303 const InputInfo &Output,
9304 const InputInfoList &Inputs,
9305 const ArgList &Args,
9306 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009307 const toolchains::NaClToolChain &ToolChain =
9308 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009309 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009310 "nacl-arm-macros.s");
9311 InputInfoList NewInputs;
9312 NewInputs.push_back(NaClMacros);
9313 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009314 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9315 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009316}
9317
Douglas Katzman750cfc52015-06-29 18:42:16 +00009318// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009319// we use static by default, do not yet support sanitizers or LTO, and a few
9320// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009321// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009322void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9323 const InputInfo &Output,
9324 const InputInfoList &Inputs,
9325 const ArgList &Args,
9326 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009327
Douglas Katzman54366072015-07-27 16:53:08 +00009328 const toolchains::NaClToolChain &ToolChain =
9329 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009330 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009331 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009332 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009333 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009334
9335 ArgStringList CmdArgs;
9336
9337 // Silence warning for "clang -g foo.o -o foo"
9338 Args.ClaimAllArgs(options::OPT_g_Group);
9339 // and "clang -emit-llvm foo.o -o foo"
9340 Args.ClaimAllArgs(options::OPT_emit_llvm);
9341 // and for "clang -w foo.o -o foo". Other warning options are already
9342 // handled somewhere else.
9343 Args.ClaimAllArgs(options::OPT_w);
9344
9345 if (!D.SysRoot.empty())
9346 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9347
9348 if (Args.hasArg(options::OPT_rdynamic))
9349 CmdArgs.push_back("-export-dynamic");
9350
9351 if (Args.hasArg(options::OPT_s))
9352 CmdArgs.push_back("-s");
9353
Douglas Katzman54366072015-07-27 16:53:08 +00009354 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9355 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009356 CmdArgs.push_back("--build-id");
9357
9358 if (!IsStatic)
9359 CmdArgs.push_back("--eh-frame-hdr");
9360
9361 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009362 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009363 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009364 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009365 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009366 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009367 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009368 else if (Arch == llvm::Triple::mipsel)
9369 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009370 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009371 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9372 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009373
9374 if (IsStatic)
9375 CmdArgs.push_back("-static");
9376 else if (Args.hasArg(options::OPT_shared))
9377 CmdArgs.push_back("-shared");
9378
9379 CmdArgs.push_back("-o");
9380 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009381 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009382 if (!Args.hasArg(options::OPT_shared))
9383 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9384 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9385
9386 const char *crtbegin;
9387 if (IsStatic)
9388 crtbegin = "crtbeginT.o";
9389 else if (Args.hasArg(options::OPT_shared))
9390 crtbegin = "crtbeginS.o";
9391 else
9392 crtbegin = "crtbegin.o";
9393 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9394 }
9395
9396 Args.AddAllArgs(CmdArgs, options::OPT_L);
9397 Args.AddAllArgs(CmdArgs, options::OPT_u);
9398
Douglas Katzman6059ef92015-11-17 17:41:23 +00009399 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009400
9401 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9402 CmdArgs.push_back("--no-demangle");
9403
9404 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9405
Douglas Katzman78b37b02015-11-17 20:28:07 +00009406 if (D.CCCIsCXX() &&
9407 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009408 bool OnlyLibstdcxxStatic =
9409 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009410 if (OnlyLibstdcxxStatic)
9411 CmdArgs.push_back("-Bstatic");
9412 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9413 if (OnlyLibstdcxxStatic)
9414 CmdArgs.push_back("-Bdynamic");
9415 CmdArgs.push_back("-lm");
9416 }
9417
9418 if (!Args.hasArg(options::OPT_nostdlib)) {
9419 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9420 // Always use groups, since it has no effect on dynamic libraries.
9421 CmdArgs.push_back("--start-group");
9422 CmdArgs.push_back("-lc");
9423 // NaCl's libc++ currently requires libpthread, so just always include it
9424 // in the group for C++.
9425 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009426 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009427 // Gold, used by Mips, handles nested groups differently than ld, and
9428 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9429 // which is not a desired behaviour here.
9430 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9431 if (getToolChain().getArch() == llvm::Triple::mipsel)
9432 CmdArgs.push_back("-lnacl");
9433
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009434 CmdArgs.push_back("-lpthread");
9435 }
9436
9437 CmdArgs.push_back("-lgcc");
9438 CmdArgs.push_back("--as-needed");
9439 if (IsStatic)
9440 CmdArgs.push_back("-lgcc_eh");
9441 else
9442 CmdArgs.push_back("-lgcc_s");
9443 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009444
9445 // Mips needs to create and use pnacl_legacy library that contains
9446 // definitions from bitcode/pnaclmm.c and definitions for
9447 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9448 if (getToolChain().getArch() == llvm::Triple::mipsel)
9449 CmdArgs.push_back("-lpnacl_legacy");
9450
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009451 CmdArgs.push_back("--end-group");
9452 }
9453
9454 if (!Args.hasArg(options::OPT_nostartfiles)) {
9455 const char *crtend;
9456 if (Args.hasArg(options::OPT_shared))
9457 crtend = "crtendS.o";
9458 else
9459 crtend = "crtend.o";
9460
9461 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9462 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9463 }
9464 }
9465
Peter Collingbourne39719a72015-11-20 20:49:39 +00009466 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9467 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009468}
9469
Douglas Katzman95354292015-06-23 20:42:09 +00009470void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9471 const InputInfo &Output,
9472 const InputInfoList &Inputs,
9473 const ArgList &Args,
9474 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009475 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009476 ArgStringList CmdArgs;
9477
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009478 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009479
9480 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009481 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009482
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009483 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009484 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009485
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009486 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009487 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009488}
9489
Douglas Katzman95354292015-06-23 20:42:09 +00009490void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9491 const InputInfo &Output,
9492 const InputInfoList &Inputs,
9493 const ArgList &Args,
9494 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009495 const Driver &D = getToolChain().getDriver();
9496 ArgStringList CmdArgs;
9497
Daniel Dunbarb440f562010-08-02 02:38:21 +00009498 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009499 CmdArgs.push_back("-o");
9500 CmdArgs.push_back(Output.getFilename());
9501 } else {
9502 assert(Output.isNothing() && "Invalid output.");
9503 }
9504
Douglas Katzman78b37b02015-11-17 20:28:07 +00009505 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009506 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9507 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9508 CmdArgs.push_back(
9509 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9510 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009511 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009512
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009513 Args.AddAllArgs(CmdArgs,
9514 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009515
Daniel Dunbar54423b22010-09-17 00:24:54 +00009516 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009517
Xinliang David Li69306c02015-10-22 06:15:31 +00009518 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009519
Douglas Katzman78b37b02015-11-17 20:28:07 +00009520 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009521 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009522 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009523 CmdArgs.push_back("-lm");
9524 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009525 }
9526
Douglas Katzman78b37b02015-11-17 20:28:07 +00009527 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009528 if (Args.hasArg(options::OPT_pthread))
9529 CmdArgs.push_back("-lpthread");
9530 CmdArgs.push_back("-lc");
9531 CmdArgs.push_back("-lCompilerRT-Generic");
9532 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9533 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009534 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009535 }
9536
Logan Chieneb9162f2014-06-26 14:23:45 +00009537 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009538 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009539}
9540
Daniel Dunbarcc912342009-05-02 18:28:39 +00009541/// DragonFly Tools
9542
9543// For now, DragonFly Assemble does just about the same as for
9544// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009545void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9546 const InputInfo &Output,
9547 const InputInfoList &Inputs,
9548 const ArgList &Args,
9549 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009550 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009551 ArgStringList CmdArgs;
9552
9553 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9554 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009555 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009556 CmdArgs.push_back("--32");
9557
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009558 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009559
9560 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009561 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009562
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009563 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009564 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009565
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009566 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009567 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009568}
9569
Douglas Katzman95354292015-06-23 20:42:09 +00009570void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9571 const InputInfo &Output,
9572 const InputInfoList &Inputs,
9573 const ArgList &Args,
9574 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009575 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009576 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009577
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009578 if (!D.SysRoot.empty())
9579 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9580
John McCall65b8da02013-04-11 22:55:55 +00009581 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009582 if (Args.hasArg(options::OPT_static)) {
9583 CmdArgs.push_back("-Bstatic");
9584 } else {
John McCall65b8da02013-04-11 22:55:55 +00009585 if (Args.hasArg(options::OPT_rdynamic))
9586 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009587 if (Args.hasArg(options::OPT_shared))
9588 CmdArgs.push_back("-Bshareable");
9589 else {
9590 CmdArgs.push_back("-dynamic-linker");
9591 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9592 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009593 CmdArgs.push_back("--hash-style=gnu");
9594 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009595 }
9596
9597 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9598 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009599 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009600 CmdArgs.push_back("-m");
9601 CmdArgs.push_back("elf_i386");
9602 }
9603
Daniel Dunbarb440f562010-08-02 02:38:21 +00009604 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009605 CmdArgs.push_back("-o");
9606 CmdArgs.push_back(Output.getFilename());
9607 } else {
9608 assert(Output.isNothing() && "Invalid output.");
9609 }
9610
Douglas Katzman78b37b02015-11-17 20:28:07 +00009611 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009612 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009613 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009614 CmdArgs.push_back(
9615 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009616 else {
9617 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009618 CmdArgs.push_back(
9619 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009620 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009621 CmdArgs.push_back(
9622 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009623 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009624 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009625 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009626 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009627 CmdArgs.push_back(
9628 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009629 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009630 CmdArgs.push_back(
9631 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009632 }
9633
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009634 Args.AddAllArgs(CmdArgs,
9635 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009636
Daniel Dunbar54423b22010-09-17 00:24:54 +00009637 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009638
Douglas Katzman78b37b02015-11-17 20:28:07 +00009639 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009640 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009641
9642 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009643 CmdArgs.push_back("-rpath");
9644 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009645 }
9646
Hans Wennborg70850d82013-07-18 20:29:38 +00009647 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009648 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009649 CmdArgs.push_back("-lm");
9650 }
9651
Daniel Dunbarcc912342009-05-02 18:28:39 +00009652 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009653 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009654
9655 if (!Args.hasArg(options::OPT_nolibc)) {
9656 CmdArgs.push_back("-lc");
9657 }
9658
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009659 if (Args.hasArg(options::OPT_static) ||
9660 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009661 CmdArgs.push_back("-lgcc");
9662 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009663 } else {
9664 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009665 CmdArgs.push_back("-lgcc_pic");
9666 if (!Args.hasArg(options::OPT_shared))
9667 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009668 } else {
John McCall65b8da02013-04-11 22:55:55 +00009669 CmdArgs.push_back("-lgcc");
9670 CmdArgs.push_back("--as-needed");
9671 CmdArgs.push_back("-lgcc_pic");
9672 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009673 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009674 }
9675 }
9676
Douglas Katzman78b37b02015-11-17 20:28:07 +00009677 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009678 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009679 CmdArgs.push_back(
9680 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009681 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009682 CmdArgs.push_back(
9683 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9684 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009685 }
9686
Xinliang David Li69306c02015-10-22 06:15:31 +00009687 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009688
Logan Chieneb9162f2014-06-26 14:23:45 +00009689 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009691}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009692
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009693// Try to find Exe from a Visual Studio distribution. This first tries to find
9694// an installed copy of Visual Studio and, failing that, looks in the PATH,
9695// making sure that whatever executable that's found is not a same-named exe
9696// from clang itself to prevent clang from falling back to itself.
9697static std::string FindVisualStudioExecutable(const ToolChain &TC,
9698 const char *Exe,
9699 const char *ClangProgramPath) {
9700 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9701 std::string visualStudioBinDir;
9702 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9703 visualStudioBinDir)) {
9704 SmallString<128> FilePath(visualStudioBinDir);
9705 llvm::sys::path::append(FilePath, Exe);
9706 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9707 return FilePath.str();
9708 }
9709
9710 return Exe;
9711}
9712
Douglas Katzman95354292015-06-23 20:42:09 +00009713void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9714 const InputInfo &Output,
9715 const InputInfoList &Inputs,
9716 const ArgList &Args,
9717 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009718 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009719 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009720
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009721 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9722 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009723 CmdArgs.push_back(
9724 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009725
Douglas Katzman78b37b02015-11-17 20:28:07 +00009726 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9727 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009728 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009729
Zachary Turner10d75b22014-10-22 20:40:43 +00009730 if (!llvm::sys::Process::GetEnv("LIB")) {
9731 // If the VC environment hasn't been configured (perhaps because the user
9732 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009733 // the environment variable is set however, assume the user knows what
9734 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009735 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009736 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009737 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9738 SmallString<128> LibDir(VisualStudioDir);
9739 llvm::sys::path::append(LibDir, "VC", "lib");
9740 switch (MSVC.getArch()) {
9741 case llvm::Triple::x86:
9742 // x86 just puts the libraries directly in lib
9743 break;
9744 case llvm::Triple::x86_64:
9745 llvm::sys::path::append(LibDir, "amd64");
9746 break;
9747 case llvm::Triple::arm:
9748 llvm::sys::path::append(LibDir, "arm");
9749 break;
9750 default:
9751 break;
9752 }
9753 CmdArgs.push_back(
9754 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009755
9756 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9757 std::string UniversalCRTLibPath;
9758 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9759 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9760 UniversalCRTLibPath.c_str()));
9761 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009762 }
9763
9764 std::string WindowsSdkLibPath;
9765 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9766 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9767 WindowsSdkLibPath.c_str()));
9768 }
9769
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009770 CmdArgs.push_back("-nologo");
9771
Reid Kleckner124955a2015-08-05 18:51:13 +00009772 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009773 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009775 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009776 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009777 if (DLL) {
9778 CmdArgs.push_back(Args.MakeArgString("-dll"));
9779
9780 SmallString<128> ImplibName(Output.getFilename());
9781 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009782 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009783 }
9784
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009785 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009786 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009787 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009788 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009789 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9790 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009791 // Make sure the dynamic runtime thunk is not optimized out at link time
9792 // to ensure proper SEH handling.
9793 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009794 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009795 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009796 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009797 for (const auto &Lib : {"asan", "asan_cxx"})
9798 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009799 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009800 }
9801
Hans Wennborg2e274592013-08-13 23:38:57 +00009802 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009803
Alexey Bataevc7e84352015-08-19 04:49:01 +00009804 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9805 options::OPT_fno_openmp, false)) {
9806 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9807 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9808 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9809 TC.getDriver().Dir + "/../lib"));
9810 switch (getOpenMPRuntime(getToolChain(), Args)) {
9811 case OMPRT_OMP:
9812 CmdArgs.push_back("-defaultlib:libomp.lib");
9813 break;
9814 case OMPRT_IOMP5:
9815 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9816 break;
9817 case OMPRT_GOMP:
9818 break;
9819 case OMPRT_Unknown:
9820 // Already diagnosed.
9821 break;
9822 }
9823 }
9824
Andrey Turetskiya4868572016-03-14 11:19:43 +00009825 // Add compiler-rt lib in case if it was explicitly
9826 // specified as an argument for --rtlib option.
9827 if (!Args.hasArg(options::OPT_nostdlib)) {
9828 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9829 }
9830
Reid Kleckner337188f2014-09-16 19:22:00 +00009831 // Add filenames, libraries, and other linker inputs.
9832 for (const auto &Input : Inputs) {
9833 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009834 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009835 continue;
9836 }
9837
9838 const Arg &A = Input.getInputArg();
9839
9840 // Render -l options differently for the MSVC linker.
9841 if (A.getOption().matches(options::OPT_l)) {
9842 StringRef Lib = A.getValue();
9843 const char *LinkLibArg;
9844 if (Lib.endswith(".lib"))
9845 LinkLibArg = Args.MakeArgString(Lib);
9846 else
9847 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9848 CmdArgs.push_back(LinkLibArg);
9849 continue;
9850 }
9851
9852 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9853 // or -L. Render it, even if MSVC doesn't understand it.
9854 A.renderAsInput(Args, CmdArgs);
9855 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009856
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009857 TC.addProfileRTLibs(Args, CmdArgs);
9858
Zachary Turner719f58c2014-12-01 23:06:47 +00009859 // We need to special case some linker paths. In the case of lld, we need to
9860 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9861 // linker, we need to use a special search algorithm.
9862 llvm::SmallString<128> linkPath;
9863 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9864 if (Linker.equals_lower("lld"))
9865 Linker = "lld-link";
9866
9867 if (Linker.equals_lower("link")) {
9868 // If we're using the MSVC linker, it's not sufficient to just use link
9869 // from the program PATH, because other environments like GnuWin32 install
9870 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009871 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009872 C.getDriver().getClangProgramPath());
9873 } else {
9874 linkPath = Linker;
9875 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009876 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009877 }
9878
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009879 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009880 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009881}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009882
Douglas Katzman95354292015-06-23 20:42:09 +00009883void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9884 const InputInfo &Output,
9885 const InputInfoList &Inputs,
9886 const ArgList &Args,
9887 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009888 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9889}
9890
Douglas Katzman95354292015-06-23 20:42:09 +00009891std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009892 Compilation &C, const JobAction &JA, const InputInfo &Output,
9893 const InputInfoList &Inputs, const ArgList &Args,
9894 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009895 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009896 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009897 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009898 CmdArgs.push_back("/W0"); // No warnings.
9899
9900 // The goal is to be able to invoke this tool correctly based on
9901 // any flag accepted by clang-cl.
9902
9903 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009904 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009905
9906 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009907 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9908 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9909 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009910 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9911 if (A->getOption().getID() == options::OPT_O0) {
9912 CmdArgs.push_back("/Od");
9913 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009914 CmdArgs.push_back("/Og");
9915
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009916 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009917 if (OptLevel == "s" || OptLevel == "z")
9918 CmdArgs.push_back("/Os");
9919 else
9920 CmdArgs.push_back("/Ot");
9921
9922 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009923 }
9924 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009925 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9926 options::OPT_fno_omit_frame_pointer))
9927 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9928 ? "/Oy"
9929 : "/Oy-");
9930 if (!Args.hasArg(options::OPT_fwritable_strings))
9931 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009932
Nico Weber3f8dafb2015-03-12 19:37:10 +00009933 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009934 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9935
David Majnemerf6072342014-07-01 22:24:56 +00009936 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9937 /*default=*/false))
9938 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009939 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9940 options::OPT_fno_function_sections))
9941 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9942 ? "/Gy"
9943 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009944 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9945 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009946 CmdArgs.push_back(
9947 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009948 if (Args.hasArg(options::OPT_fsyntax_only))
9949 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009950 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9951 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009952 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009953
Nico Weber3f8dafb2015-03-12 19:37:10 +00009954 std::vector<std::string> Includes =
9955 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009956 for (const auto &Include : Includes)
9957 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009958
Hans Wennborg87cfa712013-09-19 20:32:16 +00009959 // Flags that can simply be passed through.
9960 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9961 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009962 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9963 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009964 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009965 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009966
9967 // The order of these flags is relevant, so pick the last one.
9968 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9969 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9970 A->render(Args, CmdArgs);
9971
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009972 // Pass through all unknown arguments so that the fallback command can see
9973 // them too.
9974 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9975
Hans Wennborg87cfa712013-09-19 20:32:16 +00009976 // Input filename.
9977 assert(Inputs.size() == 1);
9978 const InputInfo &II = Inputs[0];
9979 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9980 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9981 if (II.isFilename())
9982 CmdArgs.push_back(II.getFilename());
9983 else
9984 II.getInputArg().renderAsInput(Args, CmdArgs);
9985
9986 // Output filename.
9987 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009988 const char *Fo =
9989 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009990 CmdArgs.push_back(Fo);
9991
Hans Wennborg188382e2013-09-20 18:16:35 +00009992 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009993 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9994 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009995 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009996 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009997}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009998
Yaron Keren1c0070c2015-07-02 04:45:27 +00009999/// MinGW Tools
10000void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10001 const InputInfo &Output,
10002 const InputInfoList &Inputs,
10003 const ArgList &Args,
10004 const char *LinkingOutput) const {
10005 claimNoWarnArgs(Args);
10006 ArgStringList CmdArgs;
10007
10008 if (getToolChain().getArch() == llvm::Triple::x86) {
10009 CmdArgs.push_back("--32");
10010 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10011 CmdArgs.push_back("--64");
10012 }
10013
10014 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10015
10016 CmdArgs.push_back("-o");
10017 CmdArgs.push_back(Output.getFilename());
10018
10019 for (const auto &II : Inputs)
10020 CmdArgs.push_back(II.getFilename());
10021
10022 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010023 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010024
10025 if (Args.hasArg(options::OPT_gsplit_dwarf))
10026 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10027 SplitDebugName(Args, Inputs[0]));
10028}
10029
10030void MinGW::Linker::AddLibGCC(const ArgList &Args,
10031 ArgStringList &CmdArgs) const {
10032 if (Args.hasArg(options::OPT_mthreads))
10033 CmdArgs.push_back("-lmingwthrd");
10034 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010035
Yaron Kerenaa281332015-08-09 00:24:07 +000010036 // Make use of compiler-rt if --rtlib option is used
10037 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10038 if (RLT == ToolChain::RLT_Libgcc) {
10039 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10040 Args.hasArg(options::OPT_static);
10041 bool Shared = Args.hasArg(options::OPT_shared);
10042 bool CXX = getToolChain().getDriver().CCCIsCXX();
10043
10044 if (Static || (!CXX && !Shared)) {
10045 CmdArgs.push_back("-lgcc");
10046 CmdArgs.push_back("-lgcc_eh");
10047 } else {
10048 CmdArgs.push_back("-lgcc_s");
10049 CmdArgs.push_back("-lgcc");
10050 }
10051 } else {
10052 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10053 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010054
Yaron Keren1c0070c2015-07-02 04:45:27 +000010055 CmdArgs.push_back("-lmoldname");
10056 CmdArgs.push_back("-lmingwex");
10057 CmdArgs.push_back("-lmsvcrt");
10058}
10059
10060void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10061 const InputInfo &Output,
10062 const InputInfoList &Inputs,
10063 const ArgList &Args,
10064 const char *LinkingOutput) const {
10065 const ToolChain &TC = getToolChain();
10066 const Driver &D = TC.getDriver();
10067 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10068
10069 ArgStringList CmdArgs;
10070
10071 // Silence warning for "clang -g foo.o -o foo"
10072 Args.ClaimAllArgs(options::OPT_g_Group);
10073 // and "clang -emit-llvm foo.o -o foo"
10074 Args.ClaimAllArgs(options::OPT_emit_llvm);
10075 // and for "clang -w foo.o -o foo". Other warning options are already
10076 // handled somewhere else.
10077 Args.ClaimAllArgs(options::OPT_w);
10078
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010079 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10080 if (LinkerName.equals_lower("lld")) {
10081 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010082 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010083 } else if (!LinkerName.equals_lower("ld")) {
10084 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010085 }
10086
Yaron Keren1c0070c2015-07-02 04:45:27 +000010087 if (!D.SysRoot.empty())
10088 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10089
10090 if (Args.hasArg(options::OPT_s))
10091 CmdArgs.push_back("-s");
10092
10093 CmdArgs.push_back("-m");
10094 if (TC.getArch() == llvm::Triple::x86)
10095 CmdArgs.push_back("i386pe");
10096 if (TC.getArch() == llvm::Triple::x86_64)
10097 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010098 if (TC.getArch() == llvm::Triple::arm)
10099 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010100
10101 if (Args.hasArg(options::OPT_mwindows)) {
10102 CmdArgs.push_back("--subsystem");
10103 CmdArgs.push_back("windows");
10104 } else if (Args.hasArg(options::OPT_mconsole)) {
10105 CmdArgs.push_back("--subsystem");
10106 CmdArgs.push_back("console");
10107 }
10108
10109 if (Args.hasArg(options::OPT_static))
10110 CmdArgs.push_back("-Bstatic");
10111 else {
10112 if (Args.hasArg(options::OPT_mdll))
10113 CmdArgs.push_back("--dll");
10114 else if (Args.hasArg(options::OPT_shared))
10115 CmdArgs.push_back("--shared");
10116 CmdArgs.push_back("-Bdynamic");
10117 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10118 CmdArgs.push_back("-e");
10119 if (TC.getArch() == llvm::Triple::x86)
10120 CmdArgs.push_back("_DllMainCRTStartup@12");
10121 else
10122 CmdArgs.push_back("DllMainCRTStartup");
10123 CmdArgs.push_back("--enable-auto-image-base");
10124 }
10125 }
10126
10127 CmdArgs.push_back("-o");
10128 CmdArgs.push_back(Output.getFilename());
10129
10130 Args.AddAllArgs(CmdArgs, options::OPT_e);
10131 // FIXME: add -N, -n flags
10132 Args.AddLastArg(CmdArgs, options::OPT_r);
10133 Args.AddLastArg(CmdArgs, options::OPT_s);
10134 Args.AddLastArg(CmdArgs, options::OPT_t);
10135 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10136 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10137
Douglas Katzman78b37b02015-11-17 20:28:07 +000010138 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010139 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10140 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10141 } else {
10142 if (Args.hasArg(options::OPT_municode))
10143 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10144 else
10145 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10146 }
10147 if (Args.hasArg(options::OPT_pg))
10148 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10149 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10150 }
10151
10152 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010153 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010154 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10155
10156 // TODO: Add ASan stuff here
10157
10158 // TODO: Add profile stuff here
10159
Douglas Katzman78b37b02015-11-17 20:28:07 +000010160 if (D.CCCIsCXX() &&
10161 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010162 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10163 !Args.hasArg(options::OPT_static);
10164 if (OnlyLibstdcxxStatic)
10165 CmdArgs.push_back("-Bstatic");
10166 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10167 if (OnlyLibstdcxxStatic)
10168 CmdArgs.push_back("-Bdynamic");
10169 }
10170
10171 if (!Args.hasArg(options::OPT_nostdlib)) {
10172 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10173 if (Args.hasArg(options::OPT_static))
10174 CmdArgs.push_back("--start-group");
10175
10176 if (Args.hasArg(options::OPT_fstack_protector) ||
10177 Args.hasArg(options::OPT_fstack_protector_strong) ||
10178 Args.hasArg(options::OPT_fstack_protector_all)) {
10179 CmdArgs.push_back("-lssp_nonshared");
10180 CmdArgs.push_back("-lssp");
10181 }
10182 if (Args.hasArg(options::OPT_fopenmp))
10183 CmdArgs.push_back("-lgomp");
10184
10185 AddLibGCC(Args, CmdArgs);
10186
10187 if (Args.hasArg(options::OPT_pg))
10188 CmdArgs.push_back("-lgmon");
10189
Yaron Kerenadce68e2015-07-06 18:52:19 +000010190 if (Args.hasArg(options::OPT_pthread))
10191 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010192
10193 // add system libraries
10194 if (Args.hasArg(options::OPT_mwindows)) {
10195 CmdArgs.push_back("-lgdi32");
10196 CmdArgs.push_back("-lcomdlg32");
10197 }
10198 CmdArgs.push_back("-ladvapi32");
10199 CmdArgs.push_back("-lshell32");
10200 CmdArgs.push_back("-luser32");
10201 CmdArgs.push_back("-lkernel32");
10202
10203 if (Args.hasArg(options::OPT_static))
10204 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010205 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010206 AddLibGCC(Args, CmdArgs);
10207 }
10208
10209 if (!Args.hasArg(options::OPT_nostartfiles)) {
10210 // Add crtfastmath.o if available and fast math is enabled.
10211 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10212
10213 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10214 }
10215 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010216 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010217 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010218}
10219
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010220/// XCore Tools
10221// We pass assemble and link construction to the xcc tool.
10222
Douglas Katzman95354292015-06-23 20:42:09 +000010223void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10224 const InputInfo &Output,
10225 const InputInfoList &Inputs,
10226 const ArgList &Args,
10227 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010228 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010229 ArgStringList CmdArgs;
10230
10231 CmdArgs.push_back("-o");
10232 CmdArgs.push_back(Output.getFilename());
10233
10234 CmdArgs.push_back("-c");
10235
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010236 if (Args.hasArg(options::OPT_v))
10237 CmdArgs.push_back("-v");
10238
Robert Lytton894d25c2014-05-02 09:33:25 +000010239 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10240 if (!A->getOption().matches(options::OPT_g0))
10241 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010242
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010243 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10244 false))
10245 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010246
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010247 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010248
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010249 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010250 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010251
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010252 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010253 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010254}
10255
Douglas Katzman95354292015-06-23 20:42:09 +000010256void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10257 const InputInfo &Output,
10258 const InputInfoList &Inputs,
10259 const ArgList &Args,
10260 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010261 ArgStringList CmdArgs;
10262
10263 if (Output.isFilename()) {
10264 CmdArgs.push_back("-o");
10265 CmdArgs.push_back(Output.getFilename());
10266 } else {
10267 assert(Output.isNothing() && "Invalid output.");
10268 }
10269
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010270 if (Args.hasArg(options::OPT_v))
10271 CmdArgs.push_back("-v");
10272
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010273 // Pass -fexceptions through to the linker if it was present.
10274 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10275 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010276 CmdArgs.push_back("-fexceptions");
10277
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010278 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10279
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010280 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010281 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010282}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010283
Douglas Katzman95354292015-06-23 20:42:09 +000010284void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10285 const InputInfo &Output,
10286 const InputInfoList &Inputs,
10287 const ArgList &Args,
10288 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010289 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010290 const auto &TC =
10291 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10292 ArgStringList CmdArgs;
10293 const char *Exec;
10294
10295 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010296 default:
10297 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010298 case llvm::Triple::arm:
10299 case llvm::Triple::thumb:
10300 break;
10301 case llvm::Triple::x86:
10302 CmdArgs.push_back("--32");
10303 break;
10304 case llvm::Triple::x86_64:
10305 CmdArgs.push_back("--64");
10306 break;
10307 }
10308
10309 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10310
10311 CmdArgs.push_back("-o");
10312 CmdArgs.push_back(Output.getFilename());
10313
10314 for (const auto &Input : Inputs)
10315 CmdArgs.push_back(Input.getFilename());
10316
10317 const std::string Assembler = TC.GetProgramPath("as");
10318 Exec = Args.MakeArgString(Assembler);
10319
Justin Bognerd3371d82015-07-17 03:35:54 +000010320 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010321}
10322
Douglas Katzman95354292015-06-23 20:42:09 +000010323void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10324 const InputInfo &Output,
10325 const InputInfoList &Inputs,
10326 const ArgList &Args,
10327 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010328 const auto &TC =
10329 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10330 const llvm::Triple &T = TC.getTriple();
10331 const Driver &D = TC.getDriver();
10332 SmallString<128> EntryPoint;
10333 ArgStringList CmdArgs;
10334 const char *Exec;
10335
10336 // Silence warning for "clang -g foo.o -o foo"
10337 Args.ClaimAllArgs(options::OPT_g_Group);
10338 // and "clang -emit-llvm foo.o -o foo"
10339 Args.ClaimAllArgs(options::OPT_emit_llvm);
10340 // and for "clang -w foo.o -o foo"
10341 Args.ClaimAllArgs(options::OPT_w);
10342 // Other warning options are already handled somewhere else.
10343
10344 if (!D.SysRoot.empty())
10345 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10346
10347 if (Args.hasArg(options::OPT_pie))
10348 CmdArgs.push_back("-pie");
10349 if (Args.hasArg(options::OPT_rdynamic))
10350 CmdArgs.push_back("-export-dynamic");
10351 if (Args.hasArg(options::OPT_s))
10352 CmdArgs.push_back("--strip-all");
10353
10354 CmdArgs.push_back("-m");
10355 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010356 default:
10357 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010358 case llvm::Triple::arm:
10359 case llvm::Triple::thumb:
10360 // FIXME: this is incorrect for WinCE
10361 CmdArgs.push_back("thumb2pe");
10362 break;
10363 case llvm::Triple::x86:
10364 CmdArgs.push_back("i386pe");
10365 EntryPoint.append("_");
10366 break;
10367 case llvm::Triple::x86_64:
10368 CmdArgs.push_back("i386pep");
10369 break;
10370 }
10371
10372 if (Args.hasArg(options::OPT_shared)) {
10373 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010374 default:
10375 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010376 case llvm::Triple::arm:
10377 case llvm::Triple::thumb:
10378 case llvm::Triple::x86_64:
10379 EntryPoint.append("_DllMainCRTStartup");
10380 break;
10381 case llvm::Triple::x86:
10382 EntryPoint.append("_DllMainCRTStartup@12");
10383 break;
10384 }
10385
10386 CmdArgs.push_back("-shared");
10387 CmdArgs.push_back("-Bdynamic");
10388
10389 CmdArgs.push_back("--enable-auto-image-base");
10390
10391 CmdArgs.push_back("--entry");
10392 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10393 } else {
10394 EntryPoint.append("mainCRTStartup");
10395
10396 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10397 : "-Bdynamic");
10398
Douglas Katzman78b37b02015-11-17 20:28:07 +000010399 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010400 CmdArgs.push_back("--entry");
10401 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10402 }
10403
10404 // FIXME: handle subsystem
10405 }
10406
10407 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010408 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010409
10410 CmdArgs.push_back("-o");
10411 CmdArgs.push_back(Output.getFilename());
10412
10413 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10414 SmallString<261> ImpLib(Output.getFilename());
10415 llvm::sys::path::replace_extension(ImpLib, ".lib");
10416
10417 CmdArgs.push_back("--out-implib");
10418 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10419 }
10420
Douglas Katzman78b37b02015-11-17 20:28:07 +000010421 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010422 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10423 const char *CRTBegin;
10424
10425 CRTBegin =
10426 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10427 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10428 }
10429
10430 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010431 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010432 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10433
10434 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10435 !Args.hasArg(options::OPT_nodefaultlibs)) {
10436 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10437 !Args.hasArg(options::OPT_static);
10438 if (StaticCXX)
10439 CmdArgs.push_back("-Bstatic");
10440 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10441 if (StaticCXX)
10442 CmdArgs.push_back("-Bdynamic");
10443 }
10444
10445 if (!Args.hasArg(options::OPT_nostdlib)) {
10446 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10447 // TODO handle /MT[d] /MD[d]
10448 CmdArgs.push_back("-lmsvcrt");
10449 AddRunTimeLibs(TC, D, CmdArgs, Args);
10450 }
10451 }
10452
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010453 if (TC.getSanitizerArgs().needsAsanRt()) {
10454 // TODO handle /MT[d] /MD[d]
10455 if (Args.hasArg(options::OPT_shared)) {
10456 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10457 } else {
10458 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10459 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10460 // Make sure the dynamic runtime thunk is not optimized out at link time
10461 // to ensure proper SEH handling.
10462 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10463 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10464 ? "___asan_seh_interceptor"
10465 : "__asan_seh_interceptor"));
10466 }
10467 }
10468
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010469 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010470
Justin Bognerd3371d82015-07-17 03:35:54 +000010471 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010472}
Douglas Katzman84a75642015-06-19 14:55:19 +000010473
Douglas Katzman95354292015-06-23 20:42:09 +000010474void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10475 const InputInfo &Output,
10476 const InputInfoList &Inputs,
10477 const ArgList &Args,
10478 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010479 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010480 assert(Inputs.size() == 1);
10481 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010482 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10483 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010484
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010485 if (JA.getKind() == Action::PreprocessJobClass) {
10486 Args.ClaimAllArgs();
10487 CmdArgs.push_back("-E");
10488 } else {
10489 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10490 CmdArgs.push_back("-S");
10491 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10492 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010493 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010494
Douglas Katzmanf6071112015-08-03 14:34:22 +000010495 // Append all -I, -iquote, -isystem paths, defines/undefines,
10496 // 'f' flags, optimize flags, and warning options.
10497 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010498 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010499 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010500 options::OPT_f_Group, options::OPT_f_clang_Group,
10501 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010502 options::OPT_O_Group, options::OPT_W_Group,
10503 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010504
10505 // If we're producing a dependency file, and assembly is the final action,
10506 // then the name of the target in the dependency file should be the '.o'
10507 // file, not the '.s' file produced by this step. For example, instead of
10508 // /tmp/mumble.s: mumble.c .../someheader.h
10509 // the filename on the lefthand side should be "mumble.o"
10510 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10511 C.getActions().size() == 1 &&
10512 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10513 Arg *A = Args.getLastArg(options::OPT_o);
10514 if (A) {
10515 CmdArgs.push_back("-MT");
10516 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10517 }
10518 }
10519
Douglas Katzman84a75642015-06-19 14:55:19 +000010520 CmdArgs.push_back(II.getFilename());
10521 CmdArgs.push_back("-o");
10522 CmdArgs.push_back(Output.getFilename());
10523
10524 std::string Exec =
10525 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010526 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10527 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010528}
10529
Douglas Katzman95354292015-06-23 20:42:09 +000010530void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10531 const InputInfo &Output,
10532 const InputInfoList &Inputs,
10533 const ArgList &Args,
10534 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010535 ArgStringList CmdArgs;
10536
10537 assert(Inputs.size() == 1);
10538 const InputInfo &II = Inputs[0];
10539 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10540 assert(Output.getType() == types::TY_Object);
10541
10542 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010543 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10544 if (CPUArg)
10545 CmdArgs.push_back(
10546 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010547 CmdArgs.push_back("-noSPrefixing");
10548 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010549 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10550 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10551 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010552 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010553 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010554 }
10555 CmdArgs.push_back("-elf"); // Output format.
10556 CmdArgs.push_back(II.getFilename());
10557 CmdArgs.push_back(
10558 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10559
10560 std::string Exec =
10561 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010562 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10563 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010564}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010565
10566void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10567 const InputInfo &Output,
10568 const InputInfoList &Inputs,
10569 const ArgList &Args,
10570 const char *LinkingOutput) const {
10571 const auto &TC =
10572 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10573 const llvm::Triple &T = TC.getTriple();
10574 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010575 bool UseStartfiles =
10576 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010577 bool UseDefaultLibs =
10578 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010579
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010580 if (T.getArch() == llvm::Triple::sparc)
10581 CmdArgs.push_back("-EB");
10582 else // SHAVE assumes little-endian, and sparcel is expressly so.
10583 CmdArgs.push_back("-EL");
10584
10585 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10586 // but we never pass through a --sysroot option and various other bits.
10587 // For example, there are no sanitizers (yet) nor gold linker.
10588
10589 // Eat some arguments that may be present but have no effect.
10590 Args.ClaimAllArgs(options::OPT_g_Group);
10591 Args.ClaimAllArgs(options::OPT_w);
10592 Args.ClaimAllArgs(options::OPT_static_libgcc);
10593
10594 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10595 CmdArgs.push_back("-s");
10596
10597 CmdArgs.push_back("-o");
10598 CmdArgs.push_back(Output.getFilename());
10599
10600 if (UseStartfiles) {
10601 // If you want startfiles, it means you want the builtin crti and crtbegin,
10602 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010603 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10604 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010605 }
10606
10607 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10608 options::OPT_e, options::OPT_s, options::OPT_t,
10609 options::OPT_Z_Flag, options::OPT_r});
10610
Douglas Katzman674a3122015-11-18 16:24:46 +000010611 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010612
10613 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10614
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010615 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010616 if (C.getDriver().CCCIsCXX())
10617 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010618 if (T.getOS() == llvm::Triple::RTEMS) {
10619 CmdArgs.push_back("--start-group");
10620 CmdArgs.push_back("-lc");
10621 // You must provide your own "-L" option to enable finding these.
10622 CmdArgs.push_back("-lrtemscpu");
10623 CmdArgs.push_back("-lrtemsbsp");
10624 CmdArgs.push_back("--end-group");
10625 } else {
10626 CmdArgs.push_back("-lc");
10627 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010628 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010629 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010630 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010631 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10632 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010633 }
10634
10635 std::string Exec =
10636 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10637 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10638 CmdArgs, Inputs));
10639}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010640
10641void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10642 const InputInfo &Output,
10643 const InputInfoList &Inputs,
10644 const ArgList &Args,
10645 const char *LinkingOutput) const {
10646 claimNoWarnArgs(Args);
10647 ArgStringList CmdArgs;
10648
10649 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10650
10651 CmdArgs.push_back("-o");
10652 CmdArgs.push_back(Output.getFilename());
10653
10654 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10655 const InputInfo &Input = Inputs[0];
10656 assert(Input.isFilename() && "Invalid input.");
10657 CmdArgs.push_back(Input.getFilename());
10658
10659 const char *Exec =
10660 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10661 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10662}
10663
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010664static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10665 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10666 if (SanArgs.needsUbsanRt()) {
10667 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10668 }
10669 if (SanArgs.needsAsanRt()) {
10670 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10671 }
10672}
10673
10674static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10675 const JobAction &JA, const InputInfo &Output,
10676 const InputInfoList &Inputs,
10677 const ArgList &Args,
10678 const char *LinkingOutput) {
10679 const toolchains::FreeBSD &ToolChain =
10680 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10681 const Driver &D = ToolChain.getDriver();
10682 ArgStringList CmdArgs;
10683
10684 // Silence warning for "clang -g foo.o -o foo"
10685 Args.ClaimAllArgs(options::OPT_g_Group);
10686 // and "clang -emit-llvm foo.o -o foo"
10687 Args.ClaimAllArgs(options::OPT_emit_llvm);
10688 // and for "clang -w foo.o -o foo". Other warning options are already
10689 // handled somewhere else.
10690 Args.ClaimAllArgs(options::OPT_w);
10691
10692 if (!D.SysRoot.empty())
10693 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10694
10695 if (Args.hasArg(options::OPT_pie))
10696 CmdArgs.push_back("-pie");
10697
10698 if (Args.hasArg(options::OPT_rdynamic))
10699 CmdArgs.push_back("-export-dynamic");
10700 if (Args.hasArg(options::OPT_shared))
10701 CmdArgs.push_back("--oformat=so");
10702
10703 if (Output.isFilename()) {
10704 CmdArgs.push_back("-o");
10705 CmdArgs.push_back(Output.getFilename());
10706 } else {
10707 assert(Output.isNothing() && "Invalid output.");
10708 }
10709
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010710 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10711
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010712 Args.AddAllArgs(CmdArgs, options::OPT_L);
10713 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10714 Args.AddAllArgs(CmdArgs, options::OPT_e);
10715 Args.AddAllArgs(CmdArgs, options::OPT_s);
10716 Args.AddAllArgs(CmdArgs, options::OPT_t);
10717 Args.AddAllArgs(CmdArgs, options::OPT_r);
10718
10719 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10720 CmdArgs.push_back("--no-demangle");
10721
10722 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10723
10724 if (Args.hasArg(options::OPT_pthread)) {
10725 CmdArgs.push_back("-lpthread");
10726 }
10727
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010728 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10729
10730 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10731}
10732
10733static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10734 const JobAction &JA, const InputInfo &Output,
10735 const InputInfoList &Inputs,
10736 const ArgList &Args,
10737 const char *LinkingOutput) {
10738 const toolchains::FreeBSD &ToolChain =
10739 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10740 const Driver &D = ToolChain.getDriver();
10741 ArgStringList CmdArgs;
10742
10743 // Silence warning for "clang -g foo.o -o foo"
10744 Args.ClaimAllArgs(options::OPT_g_Group);
10745 // and "clang -emit-llvm foo.o -o foo"
10746 Args.ClaimAllArgs(options::OPT_emit_llvm);
10747 // and for "clang -w foo.o -o foo". Other warning options are already
10748 // handled somewhere else.
10749 Args.ClaimAllArgs(options::OPT_w);
10750
10751 if (!D.SysRoot.empty())
10752 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10753
10754 if (Args.hasArg(options::OPT_pie))
10755 CmdArgs.push_back("-pie");
10756
10757 if (Args.hasArg(options::OPT_static)) {
10758 CmdArgs.push_back("-Bstatic");
10759 } else {
10760 if (Args.hasArg(options::OPT_rdynamic))
10761 CmdArgs.push_back("-export-dynamic");
10762 CmdArgs.push_back("--eh-frame-hdr");
10763 if (Args.hasArg(options::OPT_shared)) {
10764 CmdArgs.push_back("-Bshareable");
10765 } else {
10766 CmdArgs.push_back("-dynamic-linker");
10767 CmdArgs.push_back("/libexec/ld-elf.so.1");
10768 }
10769 CmdArgs.push_back("--enable-new-dtags");
10770 }
10771
10772 if (Output.isFilename()) {
10773 CmdArgs.push_back("-o");
10774 CmdArgs.push_back(Output.getFilename());
10775 } else {
10776 assert(Output.isNothing() && "Invalid output.");
10777 }
10778
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010779 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10780
Douglas Katzman78b37b02015-11-17 20:28:07 +000010781 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010782 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010783 if (!Args.hasArg(options::OPT_shared)) {
10784 if (Args.hasArg(options::OPT_pg))
10785 crt1 = "gcrt1.o";
10786 else if (Args.hasArg(options::OPT_pie))
10787 crt1 = "Scrt1.o";
10788 else
10789 crt1 = "crt1.o";
10790 }
10791 if (crt1)
10792 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10793
10794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10795
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010796 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010797 if (Args.hasArg(options::OPT_static))
10798 crtbegin = "crtbeginT.o";
10799 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10800 crtbegin = "crtbeginS.o";
10801 else
10802 crtbegin = "crtbegin.o";
10803
10804 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10805 }
10806
10807 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010808 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010809 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10810 Args.AddAllArgs(CmdArgs, options::OPT_e);
10811 Args.AddAllArgs(CmdArgs, options::OPT_s);
10812 Args.AddAllArgs(CmdArgs, options::OPT_t);
10813 Args.AddAllArgs(CmdArgs, options::OPT_r);
10814
10815 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10816 CmdArgs.push_back("--no-demangle");
10817
10818 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10819
Douglas Katzman78b37b02015-11-17 20:28:07 +000010820 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010821 // For PS4, we always want to pass libm, libstdc++ and libkernel
10822 // libraries for both C and C++ compilations.
10823 CmdArgs.push_back("-lkernel");
10824 if (D.CCCIsCXX()) {
10825 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10826 if (Args.hasArg(options::OPT_pg))
10827 CmdArgs.push_back("-lm_p");
10828 else
10829 CmdArgs.push_back("-lm");
10830 }
10831 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10832 // the default system libraries. Just mimic this for now.
10833 if (Args.hasArg(options::OPT_pg))
10834 CmdArgs.push_back("-lgcc_p");
10835 else
10836 CmdArgs.push_back("-lcompiler_rt");
10837 if (Args.hasArg(options::OPT_static)) {
10838 CmdArgs.push_back("-lstdc++");
10839 } else if (Args.hasArg(options::OPT_pg)) {
10840 CmdArgs.push_back("-lgcc_eh_p");
10841 } else {
10842 CmdArgs.push_back("--as-needed");
10843 CmdArgs.push_back("-lstdc++");
10844 CmdArgs.push_back("--no-as-needed");
10845 }
10846
10847 if (Args.hasArg(options::OPT_pthread)) {
10848 if (Args.hasArg(options::OPT_pg))
10849 CmdArgs.push_back("-lpthread_p");
10850 else
10851 CmdArgs.push_back("-lpthread");
10852 }
10853
10854 if (Args.hasArg(options::OPT_pg)) {
10855 if (Args.hasArg(options::OPT_shared))
10856 CmdArgs.push_back("-lc");
10857 else {
10858 if (Args.hasArg(options::OPT_static)) {
10859 CmdArgs.push_back("--start-group");
10860 CmdArgs.push_back("-lc_p");
10861 CmdArgs.push_back("-lpthread_p");
10862 CmdArgs.push_back("--end-group");
10863 } else {
10864 CmdArgs.push_back("-lc_p");
10865 }
10866 }
10867 CmdArgs.push_back("-lgcc_p");
10868 } else {
10869 if (Args.hasArg(options::OPT_static)) {
10870 CmdArgs.push_back("--start-group");
10871 CmdArgs.push_back("-lc");
10872 CmdArgs.push_back("-lpthread");
10873 CmdArgs.push_back("--end-group");
10874 } else {
10875 CmdArgs.push_back("-lc");
10876 }
10877 CmdArgs.push_back("-lcompiler_rt");
10878 }
10879
10880 if (Args.hasArg(options::OPT_static)) {
10881 CmdArgs.push_back("-lstdc++");
10882 } else if (Args.hasArg(options::OPT_pg)) {
10883 CmdArgs.push_back("-lgcc_eh_p");
10884 } else {
10885 CmdArgs.push_back("--as-needed");
10886 CmdArgs.push_back("-lstdc++");
10887 CmdArgs.push_back("--no-as-needed");
10888 }
10889 }
10890
Douglas Katzman78b37b02015-11-17 20:28:07 +000010891 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010892 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10893 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10894 else
10895 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10896 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10897 }
10898
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010899 const char *Exec =
10900#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010901 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010902#else
10903 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10904#endif
10905
10906 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10907}
10908
10909void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10910 const InputInfo &Output,
10911 const InputInfoList &Inputs,
10912 const ArgList &Args,
10913 const char *LinkingOutput) const {
10914 const toolchains::FreeBSD &ToolChain =
10915 static_cast<const toolchains::FreeBSD &>(getToolChain());
10916 const Driver &D = ToolChain.getDriver();
10917 bool PS4Linker;
10918 StringRef LinkerOptName;
10919 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10920 LinkerOptName = A->getValue();
10921 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10922 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10923 }
10924
10925 if (LinkerOptName == "gold")
10926 PS4Linker = false;
10927 else if (LinkerOptName == "ps4")
10928 PS4Linker = true;
10929 else
10930 PS4Linker = !Args.hasArg(options::OPT_shared);
10931
10932 if (PS4Linker)
10933 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10934 else
10935 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10936}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010937
10938void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10939 const InputInfo &Output,
10940 const InputInfoList &Inputs,
10941 const ArgList &Args,
10942 const char *LinkingOutput) const {
10943 const auto &TC =
10944 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010945 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010946
10947 std::vector<std::string> gpu_archs =
10948 Args.getAllArgValues(options::OPT_march_EQ);
10949 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10950 const std::string& gpu_arch = gpu_archs[0];
10951
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010952 ArgStringList CmdArgs;
10953 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010954 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10955 // ptxas does not accept -g option if optimization is enabled, so
10956 // we ignore the compiler's -O* options if we want debug info.
10957 CmdArgs.push_back("-g");
10958 CmdArgs.push_back("--dont-merge-basicblocks");
10959 CmdArgs.push_back("--return-at-end");
10960 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10961 // Map the -O we received to -O{0,1,2,3}.
10962 //
10963 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10964 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010965
Justin Lebar2836dcd2016-01-19 19:52:21 +000010966 // -O3 seems like the least-bad option when -Osomething is specified to
10967 // clang but it isn't handled below.
10968 StringRef OOpt = "3";
10969 if (A->getOption().matches(options::OPT_O4) ||
10970 A->getOption().matches(options::OPT_Ofast))
10971 OOpt = "3";
10972 else if (A->getOption().matches(options::OPT_O0))
10973 OOpt = "0";
10974 else if (A->getOption().matches(options::OPT_O)) {
10975 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10976 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10977 .Case("1", "1")
10978 .Case("2", "2")
10979 .Case("3", "3")
10980 .Case("s", "2")
10981 .Case("z", "2")
10982 .Default("2");
10983 }
10984 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10985 } else {
10986 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10987 // to no optimizations, but ptxas's default is -O3.
10988 CmdArgs.push_back("-O0");
10989 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010990
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010991 CmdArgs.push_back("--gpu-name");
10992 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10993 CmdArgs.push_back("--output-file");
10994 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10995 for (const auto& II : Inputs)
10996 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10997
10998 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10999 CmdArgs.push_back(Args.MakeArgString(A));
11000
11001 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11002 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11003}
11004
11005// All inputs to this linker must be from CudaDeviceActions, as we need to look
11006// at the Inputs' Actions in order to figure out which GPU architecture they
11007// correspond to.
11008void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11009 const InputInfo &Output,
11010 const InputInfoList &Inputs,
11011 const ArgList &Args,
11012 const char *LinkingOutput) const {
11013 const auto &TC =
11014 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011015 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011016
11017 ArgStringList CmdArgs;
11018 CmdArgs.push_back("--cuda");
11019 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11020 CmdArgs.push_back(Args.MakeArgString("--create"));
11021 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11022
11023 for (const auto& II : Inputs) {
11024 auto* A = cast<const CudaDeviceAction>(II.getAction());
11025 // We need to pass an Arch of the form "sm_XX" for cubin files and
11026 // "compute_XX" for ptx.
11027 const char *Arch = (II.getType() == types::TY_PP_Asm)
11028 ? A->getComputeArchName()
11029 : A->getGpuArchName();
11030 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11031 Arch + ",file=" + II.getFilename()));
11032 }
11033
11034 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11035 CmdArgs.push_back(Args.MakeArgString(A));
11036
11037 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11038 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11039}