blob: 1e46434ef9aac70aa983f0a62ccef6323c561505 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
419 if (getToolChain().getDriver().IsCLMode()) {
420 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
421 // include is compiled into foo.h, and everything after goes into
422 // the .obj file. /Yufoo.h means that all includes prior to and including
423 // foo.h are completely skipped and replaced with a use of the pch file
424 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
425 // just mean that the last one wins.) If /Yc and /Yu are both present
426 // and refer to the same file, /Yc wins.
427 // Note that OPT__SLASH_FI gets mapped to OPT_include.
428 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
429 // cl.exe seems to support both flags with different values, but that
430 // seems strange (which flag does /Fp now refer to?), so don't implement
431 // that until someone needs that.
432 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
433 if (PchIndex != -1) {
434 if (isa<PrecompileJobAction>(JA)) {
435 // When building the pch, skip all includes after the pch.
436 assert(YcIndex != -1 && PchIndex == YcIndex);
437 if (AI >= YcIndex)
438 continue;
439 } else {
440 // When using the pch, skip all includes prior to the pch.
441 if (AI < PchIndex)
442 continue;
443 if (AI == PchIndex) {
444 A->claim();
445 CmdArgs.push_back("-include-pch");
446 CmdArgs.push_back(
447 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
448 continue;
449 }
450 }
451 }
452 } else if (A->getOption().matches(options::OPT_include)) {
453 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000454 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
455 RenderedImplicitInclude = true;
456
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000457 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000458 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000459
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000460 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000461 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000462 SmallString<128> P(A->getValue());
463 // We want the files to have a name like foo.h.pch. Add a dummy extension
464 // so that replace_extension does the right thing.
465 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000466 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000467 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000468 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000469 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000470 }
471
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000473 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000474 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000476 }
477
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000479 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000480 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000481 FoundPCH = UsePCH;
482 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000483 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000484 }
485
486 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000487 if (IsFirstImplicitInclude) {
488 A->claim();
489 if (UsePCH)
490 CmdArgs.push_back("-include-pch");
491 else
492 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000493 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000494 continue;
495 } else {
496 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000497 D.Diag(diag::warn_drv_pch_not_first_include) << P
498 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000499 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000500 }
501 }
502
503 // Not translated, render as usual.
504 A->claim();
505 A->render(Args, CmdArgs);
506 }
507
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000508 Args.AddAllArgs(CmdArgs,
509 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
510 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000511
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000512 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000513
514 // FIXME: There is a very unfortunate problem here, some troubled
515 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
516 // really support that we would have to parse and then translate
517 // those options. :(
518 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
519 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000520
521 // -I- is a deprecated GCC feature, reject it.
522 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000523 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000524
525 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
526 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000527 StringRef sysroot = C.getSysRoot();
528 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000529 if (!Args.hasArg(options::OPT_isysroot)) {
530 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000531 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 }
533 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000534
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000535 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000536 // FIXME: We should probably sink the logic for handling these from the
537 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // CPATH - included following the user specified includes (but prior to
539 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000540 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000542 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000543 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000544 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000545 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000546 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000547 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000548 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000549
Artem Belevichfa11ab52015-11-17 22:28:46 +0000550 // Optional AuxToolChain indicates that we need to include headers
551 // for more than one target. If that's the case, add include paths
552 // from AuxToolChain right after include paths of the same kind for
553 // the current target.
554
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000555 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000556 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000557 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000558 if (AuxToolChain)
559 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
560 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000561
562 // Add system include arguments.
563 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000564 if (AuxToolChain)
565 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
566
567 // Add CUDA include arguments, if needed.
568 if (types::isCuda(Inputs[0].getType()))
569 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000570}
571
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000572// FIXME: Move to target hook.
573static bool isSignedCharDefault(const llvm::Triple &Triple) {
574 switch (Triple.getArch()) {
575 default:
576 return true;
577
Tim Northover9bb857a2013-01-31 12:13:10 +0000578 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000579 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000580 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000581 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000582 case llvm::Triple::thumb:
583 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000584 if (Triple.isOSDarwin() || Triple.isOSWindows())
585 return true;
586 return false;
587
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000588 case llvm::Triple::ppc:
589 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000590 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 return true;
592 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000593
David Majnemerdcecd932015-05-23 19:23:55 +0000594 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000595 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000596 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000597 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000598 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000599 }
600}
601
Robert Lytton0e076492013-08-13 09:43:10 +0000602static bool isNoCommonDefault(const llvm::Triple &Triple) {
603 switch (Triple.getArch()) {
604 default:
605 return false;
606
607 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000608 case llvm::Triple::wasm32:
609 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000610 return true;
611 }
612}
613
Renato Goline17c5802015-07-27 23:44:42 +0000614// ARM tools start.
615
616// Get SubArch (vN).
617static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
618 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000619 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000620}
621
622// True if M-profile.
623static bool isARMMProfile(const llvm::Triple &Triple) {
624 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000625 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000626 return Profile == llvm::ARM::PK_M;
627}
628
629// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000630static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
631 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000632 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
633 CPU = A->getValue();
634 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
635 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000636 if (!FromAs)
637 return;
638
639 for (const Arg *A :
640 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
641 StringRef Value = A->getValue();
642 if (Value.startswith("-mcpu="))
643 CPU = Value.substr(6);
644 if (Value.startswith("-march="))
645 Arch = Value.substr(7);
646 }
Renato Goline17c5802015-07-27 23:44:42 +0000647}
648
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000649// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000650// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000651static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000652 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000653 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000654 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
655 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000656 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
657}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000658
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000659// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000660static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000661 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000663 unsigned FPUID = llvm::ARM::parseFPU(FPU);
664 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000665 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
666}
667
Bradley Smithbbf5a002015-11-18 16:33:48 +0000668// Decode ARM features from string like +[no]featureA+[no]featureB+...
669static bool DecodeARMFeatures(const Driver &D, StringRef text,
670 std::vector<const char *> &Features) {
671 SmallVector<StringRef, 8> Split;
672 text.split(Split, StringRef("+"), -1, false);
673
674 for (StringRef Feature : Split) {
675 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
676 if (FeatureName)
677 Features.push_back(FeatureName);
678 else
679 return false;
680 }
681 return true;
682}
683
Renato Golin7c542b42015-07-27 23:44:45 +0000684// Check if -march is valid by checking if it can be canonicalised and parsed.
685// getARMArch is used here instead of just checking the -march value in order
686// to handle -march=native correctly.
687static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000688 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000689 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000690 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000691 std::pair<StringRef, StringRef> Split = ArchName.split("+");
692
Renato Goline17c5802015-07-27 23:44:42 +0000693 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
695 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000696 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000697}
698
Renato Golin7c542b42015-07-27 23:44:45 +0000699// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
700static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
701 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000702 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000703 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000704 std::pair<StringRef, StringRef> Split = CPUName.split("+");
705
Renato Goline17c5802015-07-27 23:44:42 +0000706 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
708 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000709 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000710}
711
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000712static bool useAAPCSForMachO(const llvm::Triple &T) {
713 // The backend is hardwired to assume AAPCS for M-class processors, ensure
714 // the frontend matches that.
715 return T.getEnvironment() == llvm::Triple::EABI ||
716 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
717}
718
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000719// Select the float ABI as determined by -msoft-float, -mhard-float, and
720// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000721arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
722 const Driver &D = TC.getDriver();
723 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000724 auto SubArch = getARMSubArchVersionNumber(Triple);
725 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 if (Arg *A =
727 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
728 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000729 if (A->getOption().matches(options::OPT_msoft_float)) {
730 ABI = FloatABI::Soft;
731 } else if (A->getOption().matches(options::OPT_mhard_float)) {
732 ABI = FloatABI::Hard;
733 } else {
734 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
735 .Case("soft", FloatABI::Soft)
736 .Case("softfp", FloatABI::SoftFP)
737 .Case("hard", FloatABI::Hard)
738 .Default(FloatABI::Invalid);
739 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000740 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000742 }
743 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000744
745 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
746 // "apcs-gnu".
747 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000748 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000749 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
750 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000752 }
753
754 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000755 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000756 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000757 case llvm::Triple::Darwin:
758 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000759 case llvm::Triple::IOS:
760 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000761 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000763 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 break;
765 }
Tim Northover756447a2015-10-30 16:30:36 +0000766 case llvm::Triple::WatchOS:
767 ABI = FloatABI::Hard;
768 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000769
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000770 // FIXME: this is invalid for WindowsCE
771 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000772 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 break;
774
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000775 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000776 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000777 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000778 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000779 break;
780 default:
781 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000782 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000783 break;
784 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000785 break;
786
Daniel Dunbar78485922009-09-10 23:00:09 +0000787 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000788 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000789 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000790 case llvm::Triple::EABIHF:
791 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000793 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000794 case llvm::Triple::EABI:
795 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000796 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000798 case llvm::Triple::Android:
799 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000800 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000801 default:
802 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000803 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000804 if (Triple.getOS() != llvm::Triple::UnknownOS ||
805 !Triple.isOSBinFormatMachO())
806 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000807 break;
808 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000809 }
810 }
811
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000812 assert(ABI != FloatABI::Invalid && "must select an ABI");
813 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000814}
815
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000816static void getARMTargetFeatures(const ToolChain &TC,
817 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000818 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000819 std::vector<const char *> &Features,
820 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000821 const Driver &D = TC.getDriver();
822
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000823 bool KernelOrKext =
824 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000825 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000826 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
827 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
828
Nico Weber6e0ebae2015-04-29 21:16:40 +0000829 if (!ForAS) {
830 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
831 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
832 // stripped out by the ARM target. We should probably pass this a new
833 // -target-option, which is handled by the -cc1/-cc1as invocation.
834 //
835 // FIXME2: For consistency, it would be ideal if we set up the target
836 // machine state the same when using the frontend or the assembler. We don't
837 // currently do that for the assembler, we pass the options directly to the
838 // backend and never even instantiate the frontend TargetInfo. If we did,
839 // and used its handleTargetFeatures hook, then we could ensure the
840 // assembler and the frontend behave the same.
841
842 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000843 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000844 Features.push_back("+soft-float");
845
846 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000847 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000848 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000849 } else {
850 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
851 // to the assembler correctly.
852 for (const Arg *A :
853 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
854 StringRef Value = A->getValue();
855 if (Value.startswith("-mfpu=")) {
856 WaFPU = A;
857 } else if (Value.startswith("-mcpu=")) {
858 WaCPU = A;
859 } else if (Value.startswith("-mhwdiv=")) {
860 WaHDiv = A;
861 } else if (Value.startswith("-march=")) {
862 WaArch = A;
863 }
864 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000865 }
866
Renato Golin7c542b42015-07-27 23:44:45 +0000867 // Check -march. ClangAs gives preference to -Wa,-march=.
868 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000869 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000870 if (WaArch) {
871 if (ArchArg)
872 D.Diag(clang::diag::warn_drv_unused_argument)
873 << ArchArg->getAsString(Args);
874 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000875 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000876 // FIXME: Set Arch.
877 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
878 } else if (ArchArg) {
879 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000880 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000881 }
882
Renato Golin7c542b42015-07-27 23:44:45 +0000883 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
884 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000885 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000886 if (WaCPU) {
887 if (CPUArg)
888 D.Diag(clang::diag::warn_drv_unused_argument)
889 << CPUArg->getAsString(Args);
890 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000891 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000892 } else if (CPUArg) {
893 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000894 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000895 }
John Brawna95c1a82015-05-08 12:52:18 +0000896
Renato Golin23459c62015-07-30 16:40:17 +0000897 // Add CPU features for generic CPUs
898 if (CPUName == "native") {
899 llvm::StringMap<bool> HostFeatures;
900 if (llvm::sys::getHostCPUFeatures(HostFeatures))
901 for (auto &F : HostFeatures)
902 Features.push_back(
903 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
904 }
905
906 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
907 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
908 if (WaFPU) {
909 if (FPUArg)
910 D.Diag(clang::diag::warn_drv_unused_argument)
911 << FPUArg->getAsString(Args);
912 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
913 Features);
914 } else if (FPUArg) {
915 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
916 }
917
918 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
919 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
920 if (WaHDiv) {
921 if (HDivArg)
922 D.Diag(clang::diag::warn_drv_unused_argument)
923 << HDivArg->getAsString(Args);
924 getARMHWDivFeatures(D, WaHDiv, Args,
925 StringRef(WaHDiv->getValue()).substr(8), Features);
926 } else if (HDivArg)
927 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
928
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000929 // Setting -msoft-float effectively disables NEON because of the GCC
930 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000931 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000932 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000933 // Also need to explicitly disable features which imply NEON.
934 Features.push_back("-crypto");
935 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000936
Eric Christopher269c2a22015-04-04 03:34:43 +0000937 // En/disable crc code generation.
938 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000939 if (A->getOption().matches(options::OPT_mcrc))
940 Features.push_back("+crc");
941 else
942 Features.push_back("-crc");
943 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000944
Akira Hatanakac2694822015-07-07 08:28:42 +0000945 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
946 // neither options are specified, see if we are compiling for kernel/kext and
947 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000948 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
949 options::OPT_mno_long_calls)) {
950 if (A->getOption().matches(options::OPT_mlong_calls))
951 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000952 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
953 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000954 Features.push_back("+long-calls");
955 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000956
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000957 // Kernel code has more strict alignment requirements.
958 if (KernelOrKext)
959 Features.push_back("+strict-align");
960 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
961 options::OPT_munaligned_access)) {
962 if (A->getOption().matches(options::OPT_munaligned_access)) {
963 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
964 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
965 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000966 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
967 // access either.
968 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
969 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000970 } else
971 Features.push_back("+strict-align");
972 } else {
973 // Assume pre-ARMv6 doesn't support unaligned accesses.
974 //
975 // ARMv6 may or may not support unaligned accesses depending on the
976 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
977 // Darwin and NetBSD targets support unaligned accesses, and others don't.
978 //
979 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
980 // which raises an alignment fault on unaligned accesses. Linux
981 // defaults this bit to 0 and handles it as a system-wide (not
982 // per-process) setting. It is therefore safe to assume that ARMv7+
983 // Linux targets support unaligned accesses. The same goes for NaCl.
984 //
985 // The above behavior is consistent with GCC.
986 int VersionNum = getARMSubArchVersionNumber(Triple);
987 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000988 if (VersionNum < 6 ||
989 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000990 Features.push_back("+strict-align");
991 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
992 if (VersionNum < 7)
993 Features.push_back("+strict-align");
994 } else
995 Features.push_back("+strict-align");
996 }
997
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000998 // llvm does not support reserving registers in general. There is support
999 // for reserving r9 on ARM though (defined as a platform-specific register
1000 // in ARM EABI).
1001 if (Args.hasArg(options::OPT_ffixed_r9))
1002 Features.push_back("+reserve-r9");
1003
Dimitry Andric08107392016-01-06 07:42:18 +00001004 // The kext linker doesn't know how to deal with movw/movt.
1005 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001006 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001007}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001008
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001009void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1010 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001011 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001012 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001013 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001014 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001015 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001016 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001017 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001018 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001019 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001020 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001021 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001022 } else {
1023 ABIName = "apcs-gnu";
1024 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001025 } else if (Triple.isOSWindows()) {
1026 // FIXME: this is invalid for WindowsCE
1027 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001028 } else {
1029 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001030 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001031 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001032 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001033 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001034 ABIName = "aapcs-linux";
1035 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001036 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001037 case llvm::Triple::EABI:
1038 ABIName = "aapcs";
1039 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001040 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001041 if (Triple.getOS() == llvm::Triple::NetBSD)
1042 ABIName = "apcs-gnu";
1043 else
1044 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001045 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001046 }
1047 }
1048 CmdArgs.push_back("-target-abi");
1049 CmdArgs.push_back(ABIName);
1050
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001051 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001052 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001053 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001054 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001055 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001056 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001057 CmdArgs.push_back("-mfloat-abi");
1058 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001059 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001060 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001061 CmdArgs.push_back("-mfloat-abi");
1062 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 } else {
1064 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001065 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001066 CmdArgs.push_back("-mfloat-abi");
1067 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001069
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001070 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-arm-global-merge=false");
1076 else
1077 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001078 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001079
Bob Wilson9c8af452013-04-11 18:53:25 +00001080 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001081 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001082 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001083}
Renato Goline17c5802015-07-27 23:44:42 +00001084// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001085
Tim Northover573cbee2014-05-24 12:52:07 +00001086/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1087/// targeting.
1088static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001089 Arg *A;
1090 std::string CPU;
1091 // If we have -mtune or -mcpu, use that.
1092 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001093 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001094 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001095 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001096 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001097 }
1098
Kevin Qin110db6f2014-07-18 07:03:22 +00001099 // Handle CPU name is 'native'.
1100 if (CPU == "native")
1101 return llvm::sys::getHostCPUName();
1102 else if (CPU.size())
1103 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001104
James Molloy9b1586b2014-04-17 12:51:17 +00001105 // Make sure we pick "cyclone" if -arch is used.
1106 // FIXME: Should this be picked by checking the target triple instead?
1107 if (Args.getLastArg(options::OPT_arch))
1108 return "cyclone";
1109
1110 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001111}
1112
Tim Northover573cbee2014-05-24 12:52:07 +00001113void Clang::AddAArch64TargetArgs(const ArgList &Args,
1114 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001115 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1116 llvm::Triple Triple(TripleStr);
1117
1118 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1119 Args.hasArg(options::OPT_mkernel) ||
1120 Args.hasArg(options::OPT_fapple_kext))
1121 CmdArgs.push_back("-disable-red-zone");
1122
1123 if (!Args.hasFlag(options::OPT_mimplicit_float,
1124 options::OPT_mno_implicit_float, true))
1125 CmdArgs.push_back("-no-implicit-float");
1126
Craig Topper92fc2df2014-05-17 16:56:41 +00001127 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001128 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1129 ABIName = A->getValue();
1130 else if (Triple.isOSDarwin())
1131 ABIName = "darwinpcs";
1132 else
1133 ABIName = "aapcs";
1134
1135 CmdArgs.push_back("-target-abi");
1136 CmdArgs.push_back(ABIName);
1137
Bradley Smith9ff64332014-10-13 10:16:06 +00001138 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1139 options::OPT_mno_fix_cortex_a53_835769)) {
1140 CmdArgs.push_back("-backend-option");
1141 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1142 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1143 else
1144 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001145 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001146 // Enabled A53 errata (835769) workaround by default on android
1147 CmdArgs.push_back("-backend-option");
1148 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001149 }
1150
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001151 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001152 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1153 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001154 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001155 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001156 CmdArgs.push_back("-aarch64-global-merge=false");
1157 else
1158 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001159 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001160}
1161
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001162// Get CPU and ABI names. They are not independent
1163// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001164void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1165 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001166 const char *DefMips32CPU = "mips32r2";
1167 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001168
Daniel Sanders2bf13662014-07-10 14:40:57 +00001169 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1170 // default for mips64(el)?-img-linux-gnu.
1171 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1172 Triple.getEnvironment() == llvm::Triple::GNU) {
1173 DefMips32CPU = "mips32r6";
1174 DefMips64CPU = "mips64r6";
1175 }
Renato Golin7c542b42015-07-27 23:44:45 +00001176
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001177 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001178 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001179 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001180
Brad Smithba26f582015-01-06 02:53:17 +00001181 // MIPS3 is the default for mips64*-unknown-openbsd.
1182 if (Triple.getOS() == llvm::Triple::OpenBSD)
1183 DefMips64CPU = "mips3";
1184
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001185 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001186 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001187
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001188 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001189 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001190 // Convert a GNU style Mips ABI name to the name
1191 // accepted by LLVM Mips backend.
1192 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 .Case("32", "o32")
1194 .Case("64", "n64")
1195 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001197
1198 // Setup default CPU and ABI names.
1199 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001200 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001201 default:
1202 llvm_unreachable("Unexpected triple arch name");
1203 case llvm::Triple::mips:
1204 case llvm::Triple::mipsel:
1205 CPUName = DefMips32CPU;
1206 break;
1207 case llvm::Triple::mips64:
1208 case llvm::Triple::mips64el:
1209 CPUName = DefMips64CPU;
1210 break;
1211 }
1212 }
1213
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001214 if (ABIName.empty()) {
1215 // Deduce ABI name from the target triple.
1216 if (Triple.getArch() == llvm::Triple::mips ||
1217 Triple.getArch() == llvm::Triple::mipsel)
1218 ABIName = "o32";
1219 else
1220 ABIName = "n64";
1221 }
1222
1223 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001224 // Deduce CPU name from ABI name.
1225 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 .Cases("o32", "eabi", DefMips32CPU)
1227 .Cases("n32", "n64", DefMips64CPU)
1228 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001229 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001230
1231 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001232}
1233
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001234std::string mips::getMipsABILibSuffix(const ArgList &Args,
1235 const llvm::Triple &Triple) {
1236 StringRef CPUName, ABIName;
1237 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1238 return llvm::StringSwitch<std::string>(ABIName)
1239 .Case("o32", "")
1240 .Case("n32", "32")
1241 .Case("n64", "64");
1242}
1243
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001244// Convert ABI name to the GNU tools acceptable variant.
1245static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1246 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001247 .Case("o32", "32")
1248 .Case("n64", "64")
1249 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001250}
1251
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001252// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1253// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001254static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1255 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001256 if (Arg *A =
1257 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1258 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001259 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001260 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001261 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001263 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001264 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1265 .Case("soft", mips::FloatABI::Soft)
1266 .Case("hard", mips::FloatABI::Hard)
1267 .Default(mips::FloatABI::Invalid);
1268 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001269 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 }
1272 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001273 }
1274
1275 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001276 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001277 // Assume "hard", because it's a default value used by gcc.
1278 // When we start to recognize specific target MIPS processors,
1279 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001280 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001283 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1284 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001285}
1286
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001287static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001288 std::vector<const char *> &Features,
1289 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001290 StringRef FeatureName) {
1291 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001292 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001293 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001294 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001295 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001296 }
1297}
1298
Daniel Sanders379d44b2014-07-16 11:52:23 +00001299static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1300 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001302 StringRef CPUName;
1303 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001304 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001305 ABIName = getGnuCompatibleMipsABIName(ABIName);
1306
Daniel Sandersfeb61302014-08-08 15:47:17 +00001307 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1308 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001309
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1311 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001312 // FIXME: Note, this is a hack. We need to pass the selected float
1313 // mode to the MipsTargetInfoBase to define appropriate macros there.
1314 // Now it is the only method.
1315 Features.push_back("+soft-float");
1316 }
1317
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001318 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001319 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001320 if (Val == "2008") {
1321 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1322 Features.push_back("+nan2008");
1323 else {
1324 Features.push_back("-nan2008");
1325 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1326 }
1327 } else if (Val == "legacy") {
1328 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1329 Features.push_back("-nan2008");
1330 else {
1331 Features.push_back("+nan2008");
1332 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1333 }
1334 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001335 D.Diag(diag::err_drv_unsupported_option_argument)
1336 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001337 }
1338
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001339 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1340 options::OPT_mdouble_float, "single-float");
1341 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1342 "mips16");
1343 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1344 options::OPT_mno_micromips, "micromips");
1345 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1346 "dsp");
1347 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1348 "dspr2");
1349 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1350 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001351
1352 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1353 // pass -mfpxx
1354 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1355 options::OPT_mfp64)) {
1356 if (A->getOption().matches(options::OPT_mfp32))
1357 Features.push_back(Args.MakeArgString("-fp64"));
1358 else if (A->getOption().matches(options::OPT_mfpxx)) {
1359 Features.push_back(Args.MakeArgString("+fpxx"));
1360 Features.push_back(Args.MakeArgString("+nooddspreg"));
1361 } else
1362 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001363 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001364 Features.push_back(Args.MakeArgString("+fpxx"));
1365 Features.push_back(Args.MakeArgString("+nooddspreg"));
1366 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001367
Daniel Sanders28e5d392014-07-10 10:39:51 +00001368 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1369 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001370}
1371
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001372void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001373 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001374 const Driver &D = getToolChain().getDriver();
1375 StringRef CPUName;
1376 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001377 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001378 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001379
1380 CmdArgs.push_back("-target-abi");
1381 CmdArgs.push_back(ABIName.data());
1382
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001383 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1384 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001385 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001386 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001387 CmdArgs.push_back("-mfloat-abi");
1388 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001389 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001390 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001392 CmdArgs.push_back("-mfloat-abi");
1393 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001395
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001396 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1397 if (A->getOption().matches(options::OPT_mxgot)) {
1398 CmdArgs.push_back("-mllvm");
1399 CmdArgs.push_back("-mxgot");
1400 }
1401 }
1402
Simon Atanasyanc580b322013-05-11 06:33:44 +00001403 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1404 options::OPT_mno_ldc1_sdc1)) {
1405 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mno-ldc1-sdc1");
1408 }
1409 }
1410
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1412 options::OPT_mno_check_zero_division)) {
1413 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-check-zero-division");
1416 }
1417 }
1418
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001419 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001420 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001421 CmdArgs.push_back("-mllvm");
1422 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1423 A->claim();
1424 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001425}
1426
Hal Finkel8eb59282012-06-11 22:35:19 +00001427/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1428static std::string getPPCTargetCPU(const ArgList &Args) {
1429 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001430 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001431
1432 if (CPUName == "native") {
1433 std::string CPU = llvm::sys::getHostCPUName();
1434 if (!CPU.empty() && CPU != "generic")
1435 return CPU;
1436 else
1437 return "";
1438 }
1439
1440 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001441 .Case("common", "generic")
1442 .Case("440", "440")
1443 .Case("440fp", "440")
1444 .Case("450", "450")
1445 .Case("601", "601")
1446 .Case("602", "602")
1447 .Case("603", "603")
1448 .Case("603e", "603e")
1449 .Case("603ev", "603ev")
1450 .Case("604", "604")
1451 .Case("604e", "604e")
1452 .Case("620", "620")
1453 .Case("630", "pwr3")
1454 .Case("G3", "g3")
1455 .Case("7400", "7400")
1456 .Case("G4", "g4")
1457 .Case("7450", "7450")
1458 .Case("G4+", "g4+")
1459 .Case("750", "750")
1460 .Case("970", "970")
1461 .Case("G5", "g5")
1462 .Case("a2", "a2")
1463 .Case("a2q", "a2q")
1464 .Case("e500mc", "e500mc")
1465 .Case("e5500", "e5500")
1466 .Case("power3", "pwr3")
1467 .Case("power4", "pwr4")
1468 .Case("power5", "pwr5")
1469 .Case("power5x", "pwr5x")
1470 .Case("power6", "pwr6")
1471 .Case("power6x", "pwr6x")
1472 .Case("power7", "pwr7")
1473 .Case("power8", "pwr8")
1474 .Case("pwr3", "pwr3")
1475 .Case("pwr4", "pwr4")
1476 .Case("pwr5", "pwr5")
1477 .Case("pwr5x", "pwr5x")
1478 .Case("pwr6", "pwr6")
1479 .Case("pwr6x", "pwr6x")
1480 .Case("pwr7", "pwr7")
1481 .Case("pwr8", "pwr8")
1482 .Case("powerpc", "ppc")
1483 .Case("powerpc64", "ppc64")
1484 .Case("powerpc64le", "ppc64le")
1485 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001486 }
1487
1488 return "";
1489}
1490
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001491static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1492 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001493 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001494 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001495
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001496 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1497 if (FloatABI == ppc::FloatABI::Soft &&
1498 !(Triple.getArch() == llvm::Triple::ppc64 ||
1499 Triple.getArch() == llvm::Triple::ppc64le))
1500 Features.push_back("+soft-float");
1501 else if (FloatABI == ppc::FloatABI::Soft &&
1502 (Triple.getArch() == llvm::Triple::ppc64 ||
1503 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001504 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001505 << "soft float is not supported for ppc64";
1506
Eric Christopher643bb6a2013-10-16 20:40:08 +00001507 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001508 AddTargetFeature(Args, Features, options::OPT_faltivec,
1509 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001510}
1511
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001512ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1513 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1514 if (Arg *A =
1515 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1516 options::OPT_mfloat_abi_EQ)) {
1517 if (A->getOption().matches(options::OPT_msoft_float))
1518 ABI = ppc::FloatABI::Soft;
1519 else if (A->getOption().matches(options::OPT_mhard_float))
1520 ABI = ppc::FloatABI::Hard;
1521 else {
1522 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1523 .Case("soft", ppc::FloatABI::Soft)
1524 .Case("hard", ppc::FloatABI::Hard)
1525 .Default(ppc::FloatABI::Invalid);
1526 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1527 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1528 ABI = ppc::FloatABI::Hard;
1529 }
1530 }
1531 }
1532
1533 // If unspecified, choose the default based on the platform.
1534 if (ABI == ppc::FloatABI::Invalid) {
1535 ABI = ppc::FloatABI::Hard;
1536 }
1537
1538 return ABI;
1539}
1540
Ulrich Weigand8afad612014-07-28 13:17:52 +00001541void Clang::AddPPCTargetArgs(const ArgList &Args,
1542 ArgStringList &CmdArgs) const {
1543 // Select the ABI to use.
1544 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001545 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001547 case llvm::Triple::ppc64: {
1548 // When targeting a processor that supports QPX, or if QPX is
1549 // specifically enabled, default to using the ABI that supports QPX (so
1550 // long as it is not specifically disabled).
1551 bool HasQPX = false;
1552 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1553 HasQPX = A->getValue() == StringRef("a2q");
1554 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1555 if (HasQPX) {
1556 ABIName = "elfv1-qpx";
1557 break;
1558 }
1559
Ulrich Weigand8afad612014-07-28 13:17:52 +00001560 ABIName = "elfv1";
1561 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001562 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001563 case llvm::Triple::ppc64le:
1564 ABIName = "elfv2";
1565 break;
1566 default:
1567 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001568 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001569
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001570 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1571 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1572 // the option if given as we don't have backend support for any targets
1573 // that don't use the altivec abi.
1574 if (StringRef(A->getValue()) != "altivec")
1575 ABIName = A->getValue();
1576
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001577 ppc::FloatABI FloatABI =
1578 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1579
1580 if (FloatABI == ppc::FloatABI::Soft) {
1581 // Floating point operations and argument passing are soft.
1582 CmdArgs.push_back("-msoft-float");
1583 CmdArgs.push_back("-mfloat-abi");
1584 CmdArgs.push_back("soft");
1585 } else {
1586 // Floating point operations and argument passing are hard.
1587 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1588 CmdArgs.push_back("-mfloat-abi");
1589 CmdArgs.push_back("hard");
1590 }
1591
Ulrich Weigand8afad612014-07-28 13:17:52 +00001592 if (ABIName) {
1593 CmdArgs.push_back("-target-abi");
1594 CmdArgs.push_back(ABIName);
1595 }
1596}
1597
1598bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1599 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1600 return A && (A->getValue() == StringRef(Value));
1601}
1602
Tom Stellard6674c702013-04-01 20:56:53 +00001603/// Get the (LLVM) name of the R600 gpu we are targeting.
1604static std::string getR600TargetGPU(const ArgList &Args) {
1605 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001606 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001607 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001608 .Cases("rv630", "rv635", "r600")
1609 .Cases("rv610", "rv620", "rs780", "rs880")
1610 .Case("rv740", "rv770")
1611 .Case("palm", "cedar")
1612 .Cases("sumo", "sumo2", "sumo")
1613 .Case("hemlock", "cypress")
1614 .Case("aruba", "cayman")
1615 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001616 }
1617 return "";
1618}
1619
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001620void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001622 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001623 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001624
James Y Knightb2406522015-06-15 20:51:24 +00001625 bool SoftFloatABI = false;
1626 if (Arg *A =
1627 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001628 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001629 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001630 }
1631
James Y Knightb2406522015-06-15 20:51:24 +00001632 // Only the hard-float ABI on Sparc is standardized, and it is the
1633 // default. GCC also supports a nonstandard soft-float ABI mode, and
1634 // perhaps LLVM should implement that, too. However, since llvm
1635 // currently does not support Sparc soft-float, at all, display an
1636 // error if it's requested.
1637 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001638 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1639 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001640 }
1641}
1642
Richard Sandiford4652d892013-07-19 16:51:51 +00001643static const char *getSystemZTargetCPU(const ArgList &Args) {
1644 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1645 return A->getValue();
1646 return "z10";
1647}
1648
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001649static void getSystemZTargetFeatures(const ArgList &Args,
1650 std::vector<const char *> &Features) {
1651 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001652 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001653 if (A->getOption().matches(options::OPT_mhtm))
1654 Features.push_back("+transactional-execution");
1655 else
1656 Features.push_back("-transactional-execution");
1657 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001658 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001659 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001660 if (A->getOption().matches(options::OPT_mvx))
1661 Features.push_back("+vector");
1662 else
1663 Features.push_back("-vector");
1664 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001665}
1666
Chandler Carruth953fb082013-01-13 11:46:33 +00001667static const char *getX86TargetCPU(const ArgList &Args,
1668 const llvm::Triple &Triple) {
1669 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001670 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001671 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001672 return "core-avx2";
1673
Chandler Carruth953fb082013-01-13 11:46:33 +00001674 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001675 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001676
1677 // FIXME: Reject attempts to use -march=native unless the target matches
1678 // the host.
1679 //
1680 // FIXME: We should also incorporate the detected target features for use
1681 // with -native.
1682 std::string CPU = llvm::sys::getHostCPUName();
1683 if (!CPU.empty() && CPU != "generic")
1684 return Args.MakeArgString(CPU);
1685 }
1686
Reid Kleckner3123eff2015-06-30 16:32:04 +00001687 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1688 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1689 StringRef Arch = A->getValue();
1690 const char *CPU;
1691 if (Triple.getArch() == llvm::Triple::x86) {
1692 CPU = llvm::StringSwitch<const char *>(Arch)
1693 .Case("IA32", "i386")
1694 .Case("SSE", "pentium3")
1695 .Case("SSE2", "pentium4")
1696 .Case("AVX", "sandybridge")
1697 .Case("AVX2", "haswell")
1698 .Default(nullptr);
1699 } else {
1700 CPU = llvm::StringSwitch<const char *>(Arch)
1701 .Case("AVX", "sandybridge")
1702 .Case("AVX2", "haswell")
1703 .Default(nullptr);
1704 }
1705 if (CPU)
1706 return CPU;
1707 }
1708
Chandler Carruth953fb082013-01-13 11:46:33 +00001709 // Select the default CPU if none was given (or detection failed).
1710
1711 if (Triple.getArch() != llvm::Triple::x86_64 &&
1712 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001713 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001714
1715 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1716
1717 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001718 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001719 if (Triple.getArchName() == "x86_64h")
1720 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001721 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001722 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001723
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001724 // Set up default CPU name for PS4 compilers.
1725 if (Triple.isPS4CPU())
1726 return "btver2";
1727
Alexey Bataev286d1b92014-01-31 04:07:13 +00001728 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001729 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001730 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001731
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001732 // Everything else goes to x86-64 in 64-bit mode.
1733 if (Is64Bit)
1734 return "x86-64";
1735
1736 switch (Triple.getOS()) {
1737 case llvm::Triple::FreeBSD:
1738 case llvm::Triple::NetBSD:
1739 case llvm::Triple::OpenBSD:
1740 return "i486";
1741 case llvm::Triple::Haiku:
1742 return "i586";
1743 case llvm::Triple::Bitrig:
1744 return "i686";
1745 default:
1746 // Fallback to p4.
1747 return "pentium4";
1748 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001749}
1750
Dan Gohmanc2853072015-09-03 22:51:53 +00001751/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1752static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1753 // If we have -mcpu=, use that.
1754 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1755 StringRef CPU = A->getValue();
1756
1757#ifdef __wasm__
1758 // Handle "native" by examining the host. "native" isn't meaningful when
1759 // cross compiling, so only support this when the host is also WebAssembly.
1760 if (CPU == "native")
1761 return llvm::sys::getHostCPUName();
1762#endif
1763
1764 return CPU;
1765 }
1766
1767 return "generic";
1768}
1769
Renato Golin7c542b42015-07-27 23:44:45 +00001770static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1771 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001772 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001773 default:
1774 return "";
1775
Amara Emerson703da2e2013-10-31 09:32:33 +00001776 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001777 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001778 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001779
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001780 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001781 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001782 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001783 case llvm::Triple::thumbeb: {
1784 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001785 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001786 return arm::getARMTargetCPU(MCPU, MArch, T);
1787 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 case llvm::Triple::mips:
1789 case llvm::Triple::mipsel:
1790 case llvm::Triple::mips64:
1791 case llvm::Triple::mips64el: {
1792 StringRef CPUName;
1793 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001794 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 return CPUName;
1796 }
1797
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001798 case llvm::Triple::nvptx:
1799 case llvm::Triple::nvptx64:
1800 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1801 return A->getValue();
1802 return "";
1803
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001804 case llvm::Triple::ppc:
1805 case llvm::Triple::ppc64:
1806 case llvm::Triple::ppc64le: {
1807 std::string TargetCPUName = getPPCTargetCPU(Args);
1808 // LLVM may default to generating code for the native CPU,
1809 // but, like gcc, we default to a more generic option for
1810 // each architecture. (except on Darwin)
1811 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1812 if (T.getArch() == llvm::Triple::ppc64)
1813 TargetCPUName = "ppc64";
1814 else if (T.getArch() == llvm::Triple::ppc64le)
1815 TargetCPUName = "ppc64le";
1816 else
1817 TargetCPUName = "ppc";
1818 }
1819 return TargetCPUName;
1820 }
1821
1822 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001823 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001824 case llvm::Triple::sparcv9:
1825 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001826 return A->getValue();
1827 return "";
1828
1829 case llvm::Triple::x86:
1830 case llvm::Triple::x86_64:
1831 return getX86TargetCPU(Args, T);
1832
1833 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001834 return "hexagon" +
1835 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001836
1837 case llvm::Triple::systemz:
1838 return getSystemZTargetCPU(Args);
1839
1840 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001841 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001842 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001843
1844 case llvm::Triple::wasm32:
1845 case llvm::Triple::wasm64:
1846 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001847 }
1848}
1849
Alp Tokerce365ca2013-12-02 12:43:03 +00001850static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001851 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001852 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1853 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1854 // forward.
1855 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001856 std::string Plugin =
1857 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001858 CmdArgs.push_back(Args.MakeArgString(Plugin));
1859
1860 // Try to pass driver level flags relevant to LTO code generation down to
1861 // the plugin.
1862
1863 // Handle flags for selecting CPU variants.
1864 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1865 if (!CPU.empty())
1866 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001867
James Molloyf97fdae2015-12-21 10:44:36 +00001868 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1869 StringRef OOpt;
1870 if (A->getOption().matches(options::OPT_O4) ||
1871 A->getOption().matches(options::OPT_Ofast))
1872 OOpt = "3";
1873 else if (A->getOption().matches(options::OPT_O))
1874 OOpt = A->getValue();
1875 else if (A->getOption().matches(options::OPT_O0))
1876 OOpt = "0";
1877 if (!OOpt.empty())
1878 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1879 }
1880
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001881 if (IsThinLTO)
1882 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001883
1884 // If an explicit debugger tuning argument appeared, pass it along.
1885 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1886 options::OPT_ggdbN_Group)) {
1887 if (A->getOption().matches(options::OPT_glldb))
1888 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1889 else if (A->getOption().matches(options::OPT_gsce))
1890 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1891 else
1892 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1893 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001894}
1895
Sanjay Patel2987c292015-06-11 14:53:41 +00001896/// This is a helper function for validating the optional refinement step
1897/// parameter in reciprocal argument strings. Return false if there is an error
1898/// parsing the refinement step. Otherwise, return true and set the Position
1899/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001900static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001901 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001902 const char RefinementStepToken = ':';
1903 Position = In.find(RefinementStepToken);
1904 if (Position != StringRef::npos) {
1905 StringRef Option = A.getOption().getName();
1906 StringRef RefStep = In.substr(Position + 1);
1907 // Allow exactly one numeric character for the additional refinement
1908 // step parameter. This is reasonable for all currently-supported
1909 // operations and architectures because we would expect that a larger value
1910 // of refinement steps would cause the estimate "optimization" to
1911 // under-perform the native operation. Also, if the estimate does not
1912 // converge quickly, it probably will not ever converge, so further
1913 // refinement steps will not produce a better answer.
1914 if (RefStep.size() != 1) {
1915 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1916 return false;
1917 }
1918 char RefStepChar = RefStep[0];
1919 if (RefStepChar < '0' || RefStepChar > '9') {
1920 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1921 return false;
1922 }
1923 }
1924 return true;
1925}
1926
1927/// The -mrecip flag requires processing of many optional parameters.
1928static void ParseMRecip(const Driver &D, const ArgList &Args,
1929 ArgStringList &OutStrings) {
1930 StringRef DisabledPrefixIn = "!";
1931 StringRef DisabledPrefixOut = "!";
1932 StringRef EnabledPrefixOut = "";
1933 StringRef Out = "-mrecip=";
1934
1935 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1936 if (!A)
1937 return;
1938
1939 unsigned NumOptions = A->getNumValues();
1940 if (NumOptions == 0) {
1941 // No option is the same as "all".
1942 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1943 return;
1944 }
1945
1946 // Pass through "all", "none", or "default" with an optional refinement step.
1947 if (NumOptions == 1) {
1948 StringRef Val = A->getValue(0);
1949 size_t RefStepLoc;
1950 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1951 return;
1952 StringRef ValBase = Val.slice(0, RefStepLoc);
1953 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1954 OutStrings.push_back(Args.MakeArgString(Out + Val));
1955 return;
1956 }
1957 }
1958
1959 // Each reciprocal type may be enabled or disabled individually.
1960 // Check each input value for validity, concatenate them all back together,
1961 // and pass through.
1962
1963 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001964 OptionStrings.insert(std::make_pair("divd", false));
1965 OptionStrings.insert(std::make_pair("divf", false));
1966 OptionStrings.insert(std::make_pair("vec-divd", false));
1967 OptionStrings.insert(std::make_pair("vec-divf", false));
1968 OptionStrings.insert(std::make_pair("sqrtd", false));
1969 OptionStrings.insert(std::make_pair("sqrtf", false));
1970 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1971 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001972
1973 for (unsigned i = 0; i != NumOptions; ++i) {
1974 StringRef Val = A->getValue(i);
1975
1976 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1977 // Ignore the disablement token for string matching.
1978 if (IsDisabled)
1979 Val = Val.substr(1);
1980
1981 size_t RefStep;
1982 if (!getRefinementStep(Val, D, *A, RefStep))
1983 return;
1984
1985 StringRef ValBase = Val.slice(0, RefStep);
1986 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1987 if (OptionIter == OptionStrings.end()) {
1988 // Try again specifying float suffix.
1989 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1990 if (OptionIter == OptionStrings.end()) {
1991 // The input name did not match any known option string.
1992 D.Diag(diag::err_drv_unknown_argument) << Val;
1993 return;
1994 }
1995 // The option was specified without a float or double suffix.
1996 // Make sure that the double entry was not already specified.
1997 // The float entry will be checked below.
1998 if (OptionStrings[ValBase.str() + 'd']) {
1999 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2000 return;
2001 }
2002 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002003
Sanjay Patel2987c292015-06-11 14:53:41 +00002004 if (OptionIter->second == true) {
2005 // Duplicate option specified.
2006 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2007 return;
2008 }
2009
2010 // Mark the matched option as found. Do not allow duplicate specifiers.
2011 OptionIter->second = true;
2012
2013 // If the precision was not specified, also mark the double entry as found.
2014 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2015 OptionStrings[ValBase.str() + 'd'] = true;
2016
2017 // Build the output string.
2018 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2019 Out = Args.MakeArgString(Out + Prefix + Val);
2020 if (i != NumOptions - 1)
2021 Out = Args.MakeArgString(Out + ",");
2022 }
2023
2024 OutStrings.push_back(Args.MakeArgString(Out));
2025}
2026
Eric Christopherc54920a2015-03-23 19:26:05 +00002027static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002028 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002029 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002030 // If -march=native, autodetect the feature list.
2031 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2032 if (StringRef(A->getValue()) == "native") {
2033 llvm::StringMap<bool> HostFeatures;
2034 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2035 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 Features.push_back(
2037 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002038 }
2039 }
2040
Jim Grosbach82eee262013-11-16 00:53:35 +00002041 if (Triple.getArchName() == "x86_64h") {
2042 // x86_64h implies quite a few of the more modern subtarget features
2043 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2044 Features.push_back("-rdrnd");
2045 Features.push_back("-aes");
2046 Features.push_back("-pclmul");
2047 Features.push_back("-rtm");
2048 Features.push_back("-hle");
2049 Features.push_back("-fsgsbase");
2050 }
2051
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002052 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002053 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002054 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002055 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002056 Features.push_back("+sse4.2");
2057 Features.push_back("+popcnt");
2058 } else
2059 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002060 }
2061
Eric Christopherc54920a2015-03-23 19:26:05 +00002062 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002063 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2064 StringRef Arch = A->getValue();
2065 bool ArchUsed = false;
2066 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002067 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002068 if (Arch == "AVX" || Arch == "AVX2") {
2069 ArchUsed = true;
2070 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2071 }
2072 }
2073 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002074 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002075 if (Arch == "IA32") {
2076 ArchUsed = true;
2077 } else if (Arch == "SSE" || Arch == "SSE2") {
2078 ArchUsed = true;
2079 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2080 }
2081 }
2082 if (!ArchUsed)
2083 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2084 }
2085
Jim Grosbach82eee262013-11-16 00:53:35 +00002086 // Now add any that the user explicitly requested on the command line,
2087 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002088 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002089}
2090
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002091void Clang::AddX86TargetArgs(const ArgList &Args,
2092 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002093 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002094 Args.hasArg(options::OPT_mkernel) ||
2095 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002096 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002097
Bob Wilson2616e2e2013-02-10 16:01:41 +00002098 // Default to avoid implicit floating-point for kernel/kext code, but allow
2099 // that to be overridden with -mno-soft-float.
2100 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2101 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002102 if (Arg *A = Args.getLastArg(
2103 options::OPT_msoft_float, options::OPT_mno_soft_float,
2104 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002105 const Option &O = A->getOption();
2106 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2107 O.matches(options::OPT_msoft_float));
2108 }
2109 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002110 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002111
2112 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2113 StringRef Value = A->getValue();
2114 if (Value == "intel" || Value == "att") {
2115 CmdArgs.push_back("-mllvm");
2116 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2117 } else {
2118 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2119 << A->getOption().getName() << Value;
2120 }
2121 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002122}
2123
Tony Linthicum76329bf2011-12-12 21:14:55 +00002124void Clang::AddHexagonTargetArgs(const ArgList &Args,
2125 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002126 CmdArgs.push_back("-mqdsp6-compat");
2127 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002128
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002129 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2130 std::string N = llvm::utostr(G.getValue());
2131 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002132 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002133 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002134 }
2135
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002136 if (!Args.hasArg(options::OPT_fno_short_enums))
2137 CmdArgs.push_back("-fshort-enums");
2138 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139 CmdArgs.push_back("-mllvm");
2140 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002141 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002142 CmdArgs.push_back("-mllvm");
2143 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002144}
2145
Dan Gohmane3d71e12016-01-07 01:00:21 +00002146void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2147 ArgStringList &CmdArgs) const {
2148 // Default to "hidden" visibility.
2149 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2150 options::OPT_fvisibility_ms_compat)) {
2151 CmdArgs.push_back("-fvisibility");
2152 CmdArgs.push_back("hidden");
2153 }
2154}
2155
Kevin Qin110db6f2014-07-18 07:03:22 +00002156// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002157static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002158 std::vector<const char *> &Features) {
2159 SmallVector<StringRef, 8> Split;
2160 text.split(Split, StringRef("+"), -1, false);
2161
Benjamin Kramer72e64312015-09-24 14:48:49 +00002162 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002163 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002164 .Case("fp", "+fp-armv8")
2165 .Case("simd", "+neon")
2166 .Case("crc", "+crc")
2167 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002168 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002169 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002170 .Case("nofp", "-fp-armv8")
2171 .Case("nosimd", "-neon")
2172 .Case("nocrc", "-crc")
2173 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002174 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002175 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002176 .Default(nullptr);
2177 if (result)
2178 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002179 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002180 D.Diag(diag::err_drv_no_neon_modifier);
2181 else
2182 return false;
2183 }
2184 return true;
2185}
2186
2187// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2188// decode CPU and feature.
2189static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2190 std::vector<const char *> &Features) {
2191 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2192 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002193 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002194 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2195 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002196 Features.push_back("+neon");
2197 Features.push_back("+crc");
2198 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002199 } else if (CPU == "cyclone") {
2200 Features.push_back("+neon");
2201 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002202 } else if (CPU == "generic") {
2203 Features.push_back("+neon");
2204 } else {
2205 return false;
2206 }
2207
2208 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2209 return false;
2210
2211 return true;
2212}
2213
2214static bool
2215getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2216 const ArgList &Args,
2217 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002218 std::string MarchLowerCase = March.lower();
2219 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002220
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002221 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002222 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002224 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002225 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2226 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002227 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002228 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002229 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002230
2231 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2232 return false;
2233
2234 return true;
2235}
2236
2237static bool
2238getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2239 const ArgList &Args,
2240 std::vector<const char *> &Features) {
2241 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002242 std::string McpuLowerCase = Mcpu.lower();
2243 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002244 return false;
2245
2246 return true;
2247}
2248
2249static bool
2250getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2251 const ArgList &Args,
2252 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002253 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002254 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002255 if (MtuneLowerCase == "native")
2256 MtuneLowerCase = llvm::sys::getHostCPUName();
2257 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002258 Features.push_back("+zcm");
2259 Features.push_back("+zcz");
2260 }
2261 return true;
2262}
2263
2264static bool
2265getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2266 const ArgList &Args,
2267 std::vector<const char *> &Features) {
2268 StringRef CPU;
2269 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002270 std::string McpuLowerCase = Mcpu.lower();
2271 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002272 return false;
2273
2274 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2275}
2276
Justin Bognerf9052562015-11-13 23:07:31 +00002277static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002278 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002279 Arg *A;
2280 bool success = true;
2281 // Enable NEON by default.
2282 Features.push_back("+neon");
2283 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2284 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2285 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2286 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002287 else if (Args.hasArg(options::OPT_arch))
2288 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2289 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002290
2291 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2292 success =
2293 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2294 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2295 success =
2296 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002297 else if (Args.hasArg(options::OPT_arch))
2298 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2299 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002300
2301 if (!success)
2302 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002303
2304 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2305 Features.push_back("-fp-armv8");
2306 Features.push_back("-crypto");
2307 Features.push_back("-neon");
2308 }
Bradley Smith418c5932014-05-02 15:17:51 +00002309
2310 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002311 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002312 if (A->getOption().matches(options::OPT_mcrc))
2313 Features.push_back("+crc");
2314 else
2315 Features.push_back("-crc");
2316 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002317
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002318 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2319 options::OPT_munaligned_access))
2320 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2321 Features.push_back("+strict-align");
2322
Justin Bognerf9052562015-11-13 23:07:31 +00002323 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002324 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325}
2326
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002327static void getHexagonTargetFeatures(const ArgList &Args,
2328 std::vector<const char *> &Features) {
2329 bool HasHVX = false, HasHVXD = false;
2330
Eric Christopher49062a52015-12-22 03:12:34 +00002331 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2332 // doing dependent option handling here rather than in initFeatureMap or a
2333 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002334 for (auto &A : Args) {
2335 auto &Opt = A->getOption();
2336 if (Opt.matches(options::OPT_mhexagon_hvx))
2337 HasHVX = true;
2338 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2339 HasHVXD = HasHVX = false;
2340 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2341 HasHVXD = HasHVX = true;
2342 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2343 HasHVXD = false;
2344 else
2345 continue;
2346 A->claim();
2347 }
2348
2349 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2350 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2351}
2352
Dan Gohmanc2853072015-09-03 22:51:53 +00002353static void getWebAssemblyTargetFeatures(const ArgList &Args,
2354 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002355 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002356}
2357
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002358static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002359 const ArgList &Args, ArgStringList &CmdArgs,
2360 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002361 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002362 std::vector<const char *> Features;
2363 switch (Triple.getArch()) {
2364 default:
2365 break;
2366 case llvm::Triple::mips:
2367 case llvm::Triple::mipsel:
2368 case llvm::Triple::mips64:
2369 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002370 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002371 break;
2372
2373 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002374 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002375 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002376 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002377 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002378 break;
2379
2380 case llvm::Triple::ppc:
2381 case llvm::Triple::ppc64:
2382 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002383 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002384 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002385 case llvm::Triple::systemz:
2386 getSystemZTargetFeatures(Args, Features);
2387 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002388 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002389 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002390 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002391 break;
2392 case llvm::Triple::x86:
2393 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002394 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002395 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002396 case llvm::Triple::hexagon:
2397 getHexagonTargetFeatures(Args, Features);
2398 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002399 case llvm::Triple::wasm32:
2400 case llvm::Triple::wasm64:
2401 getWebAssemblyTargetFeatures(Args, Features);
2402 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002403 }
Rafael Espindola43964802013-08-21 17:34:32 +00002404
2405 // Find the last of each feature.
2406 llvm::StringMap<unsigned> LastOpt;
2407 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2408 const char *Name = Features[I];
2409 assert(Name[0] == '-' || Name[0] == '+');
2410 LastOpt[Name + 1] = I;
2411 }
2412
2413 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2414 // If this feature was overridden, ignore it.
2415 const char *Name = Features[I];
2416 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2417 assert(LastI != LastOpt.end());
2418 unsigned Last = LastI->second;
2419 if (Last != I)
2420 continue;
2421
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002422 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002423 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002424 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002425}
2426
David Majnemerae394812014-12-09 00:12:30 +00002427static bool
2428shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2429 const llvm::Triple &Triple) {
2430 // We use the zero-cost exception tables for Objective-C if the non-fragile
2431 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2432 // later.
2433 if (runtime.isNonFragile())
2434 return true;
2435
2436 if (!Triple.isMacOSX())
2437 return false;
2438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002439 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002440 (Triple.getArch() == llvm::Triple::x86_64 ||
2441 Triple.getArch() == llvm::Triple::arm));
2442}
2443
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002444/// Adds exception related arguments to the driver command arguments. There's a
2445/// master flag, -fexceptions and also language specific flags to enable/disable
2446/// C++ and Objective-C exceptions. This makes it possible to for example
2447/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002448static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002449 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002450 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002451 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002452 const Driver &D = TC.getDriver();
2453 const llvm::Triple &Triple = TC.getTriple();
2454
Chad Rosier4fab82c2012-03-26 22:04:46 +00002455 if (KernelOrKext) {
2456 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2457 // arguments now to avoid warnings about unused arguments.
2458 Args.ClaimAllArgs(options::OPT_fexceptions);
2459 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2460 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2461 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2462 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2463 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002464 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002465 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002466
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002467 // See if the user explicitly enabled exceptions.
2468 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2469 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002470
David Majnemerae394812014-12-09 00:12:30 +00002471 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2472 // is not necessarily sensible, but follows GCC.
2473 if (types::isObjC(InputType) &&
2474 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002475 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002476 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002477
David Majnemerae394812014-12-09 00:12:30 +00002478 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002479 }
2480
2481 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002482 // Disable C++ EH by default on XCore and PS4.
2483 bool CXXExceptionsEnabled =
2484 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002485 Arg *ExceptionArg = Args.getLastArg(
2486 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2487 options::OPT_fexceptions, options::OPT_fno_exceptions);
2488 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002489 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002490 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2491 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002492
2493 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002494 if (Triple.isPS4CPU()) {
2495 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2496 assert(ExceptionArg &&
2497 "On the PS4 exceptions should only be enabled if passing "
2498 "an argument");
2499 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2500 const Arg *RTTIArg = TC.getRTTIArg();
2501 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2502 D.Diag(diag::err_drv_argument_not_allowed_with)
2503 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2504 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2505 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2506 } else
2507 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2508
Anders Carlssone96ab552011-02-28 02:27:16 +00002509 CmdArgs.push_back("-fcxx-exceptions");
2510
David Majnemer8de68642014-12-05 08:11:58 +00002511 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002512 }
2513 }
2514
David Majnemer8de68642014-12-05 08:11:58 +00002515 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002516 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002517}
2518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002519static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002520 bool Default = true;
2521 if (TC.getTriple().isOSDarwin()) {
2522 // The native darwin assembler doesn't support the linker_option directives,
2523 // so we disable them if we think the .s file will be passed to it.
2524 Default = TC.useIntegratedAs();
2525 }
2526 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2527 Default);
2528}
2529
Ted Kremenek62093662013-03-12 17:02:12 +00002530static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2531 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002532 bool UseDwarfDirectory =
2533 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2534 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002535 return !UseDwarfDirectory;
2536}
2537
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002538/// \brief Check whether the given input tree contains any compilation actions.
2539static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002540 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002541 return true;
2542
Nico Weber5a459f82016-02-23 19:30:43 +00002543 for (const auto &AI : A->inputs())
2544 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002545 return true;
2546
2547 return false;
2548}
2549
2550/// \brief Check if -relax-all should be passed to the internal assembler.
2551/// This is done by default when compiling non-assembler source with -O0.
2552static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2553 bool RelaxDefault = true;
2554
2555 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2556 RelaxDefault = A->getOption().matches(options::OPT_O0);
2557
2558 if (RelaxDefault) {
2559 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002560 for (const auto &Act : C.getActions()) {
2561 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002562 RelaxDefault = true;
2563 break;
2564 }
2565 }
2566 }
2567
2568 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002569 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002570}
2571
Paul Robinson0334a042015-12-19 19:41:48 +00002572// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2573// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002574static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002575 assert(A.getOption().matches(options::OPT_gN_Group) &&
2576 "Not a -g option that specifies a debug-info level");
2577 if (A.getOption().matches(options::OPT_g0) ||
2578 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002579 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002580 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2581 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002582 return codegenoptions::DebugLineTablesOnly;
2583 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002584}
2585
Douglas Katzman3459ce22015-10-08 04:24:12 +00002586// Extract the integer N from a string spelled "-dwarf-N", returning 0
2587// on mismatch. The StringRef input (rather than an Arg) allows
2588// for use by the "-Xassembler" option parser.
2589static unsigned DwarfVersionNum(StringRef ArgValue) {
2590 return llvm::StringSwitch<unsigned>(ArgValue)
2591 .Case("-gdwarf-2", 2)
2592 .Case("-gdwarf-3", 3)
2593 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002594 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002595 .Default(0);
2596}
2597
2598static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002599 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002600 unsigned DwarfVersion,
2601 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002602 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002603 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002604 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2605 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002606 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002607 CmdArgs.push_back("-debug-info-kind=limited");
2608 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002609 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002610 CmdArgs.push_back("-debug-info-kind=standalone");
2611 break;
2612 default:
2613 break;
2614 }
2615 if (DwarfVersion > 0)
2616 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002617 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002618 switch (DebuggerTuning) {
2619 case llvm::DebuggerKind::GDB:
2620 CmdArgs.push_back("-debugger-tuning=gdb");
2621 break;
2622 case llvm::DebuggerKind::LLDB:
2623 CmdArgs.push_back("-debugger-tuning=lldb");
2624 break;
2625 case llvm::DebuggerKind::SCE:
2626 CmdArgs.push_back("-debugger-tuning=sce");
2627 break;
2628 default:
2629 break;
2630 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002631}
2632
David Blaikie9260ed62013-07-25 21:19:01 +00002633static void CollectArgsForIntegratedAssembler(Compilation &C,
2634 const ArgList &Args,
2635 ArgStringList &CmdArgs,
2636 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637 if (UseRelaxAll(C, Args))
2638 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002639
David Majnemer2b9349d2015-12-21 22:09:34 +00002640 // Only default to -mincremental-linker-compatible if we think we are
2641 // targeting the MSVC linker.
2642 bool DefaultIncrementalLinkerCompatible =
2643 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2644 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2645 options::OPT_mno_incremental_linker_compatible,
2646 DefaultIncrementalLinkerCompatible))
2647 CmdArgs.push_back("-mincremental-linker-compatible");
2648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002649 // When passing -I arguments to the assembler we sometimes need to
2650 // unconditionally take the next argument. For example, when parsing
2651 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2652 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2653 // arg after parsing the '-I' arg.
2654 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 // When using an integrated assembler, translate -Wa, and -Xassembler
2657 // options.
2658 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002659 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002660 for (const Arg *A :
2661 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2662 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002663
Benjamin Kramer72e64312015-09-24 14:48:49 +00002664 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002665 if (TakeNextArg) {
2666 CmdArgs.push_back(Value.data());
2667 TakeNextArg = false;
2668 continue;
2669 }
David Blaikie9260ed62013-07-25 21:19:01 +00002670
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002671 switch (C.getDefaultToolChain().getArch()) {
2672 default:
2673 break;
2674 case llvm::Triple::mips:
2675 case llvm::Triple::mipsel:
2676 case llvm::Triple::mips64:
2677 case llvm::Triple::mips64el:
2678 if (Value == "--trap") {
2679 CmdArgs.push_back("-target-feature");
2680 CmdArgs.push_back("+use-tcc-in-div");
2681 continue;
2682 }
2683 if (Value == "--break") {
2684 CmdArgs.push_back("-target-feature");
2685 CmdArgs.push_back("-use-tcc-in-div");
2686 continue;
2687 }
2688 if (Value.startswith("-msoft-float")) {
2689 CmdArgs.push_back("-target-feature");
2690 CmdArgs.push_back("+soft-float");
2691 continue;
2692 }
2693 if (Value.startswith("-mhard-float")) {
2694 CmdArgs.push_back("-target-feature");
2695 CmdArgs.push_back("-soft-float");
2696 continue;
2697 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002698
2699 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2700 .Case("-mips1", "+mips1")
2701 .Case("-mips2", "+mips2")
2702 .Case("-mips3", "+mips3")
2703 .Case("-mips4", "+mips4")
2704 .Case("-mips5", "+mips5")
2705 .Case("-mips32", "+mips32")
2706 .Case("-mips32r2", "+mips32r2")
2707 .Case("-mips32r3", "+mips32r3")
2708 .Case("-mips32r5", "+mips32r5")
2709 .Case("-mips32r6", "+mips32r6")
2710 .Case("-mips64", "+mips64")
2711 .Case("-mips64r2", "+mips64r2")
2712 .Case("-mips64r3", "+mips64r3")
2713 .Case("-mips64r5", "+mips64r5")
2714 .Case("-mips64r6", "+mips64r6")
2715 .Default(nullptr);
2716 if (MipsTargetFeature)
2717 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002718 }
2719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002720 if (Value == "-force_cpusubtype_ALL") {
2721 // Do nothing, this is the default and we don't support anything else.
2722 } else if (Value == "-L") {
2723 CmdArgs.push_back("-msave-temp-labels");
2724 } else if (Value == "--fatal-warnings") {
2725 CmdArgs.push_back("-massembler-fatal-warnings");
2726 } else if (Value == "--noexecstack") {
2727 CmdArgs.push_back("-mnoexecstack");
2728 } else if (Value == "-compress-debug-sections" ||
2729 Value == "--compress-debug-sections") {
2730 CompressDebugSections = true;
2731 } else if (Value == "-nocompress-debug-sections" ||
2732 Value == "--nocompress-debug-sections") {
2733 CompressDebugSections = false;
2734 } else if (Value.startswith("-I")) {
2735 CmdArgs.push_back(Value.data());
2736 // We need to consume the next argument if the current arg is a plain
2737 // -I. The next arg will be the include directory.
2738 if (Value == "-I")
2739 TakeNextArg = true;
2740 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002741 // "-gdwarf-N" options are not cc1as options.
2742 unsigned DwarfVersion = DwarfVersionNum(Value);
2743 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2744 CmdArgs.push_back(Value.data());
2745 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002746 RenderDebugEnablingArgs(Args, CmdArgs,
2747 codegenoptions::LimitedDebugInfo,
2748 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002749 }
Renato Golin7c542b42015-07-27 23:44:45 +00002750 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2751 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2752 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 } else {
2754 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002755 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002756 }
2757 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002758 }
2759 if (CompressDebugSections) {
2760 if (llvm::zlib::isAvailable())
2761 CmdArgs.push_back("-compress-debug-sections");
2762 else
2763 D.Diag(diag::warn_debug_compression_unavailable);
2764 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002765 if (MipsTargetFeature != nullptr) {
2766 CmdArgs.push_back("-target-feature");
2767 CmdArgs.push_back(MipsTargetFeature);
2768 }
David Blaikie9260ed62013-07-25 21:19:01 +00002769}
2770
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002771// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002772// FIXME: Make sure we can also emit shared objects if they're requested
2773// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002774static void addClangRT(const ToolChain &TC, const ArgList &Args,
2775 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002776 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002777}
2778
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002779namespace {
2780enum OpenMPRuntimeKind {
2781 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2782 /// without knowing what runtime to target.
2783 OMPRT_Unknown,
2784
2785 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2786 /// the default for Clang.
2787 OMPRT_OMP,
2788
2789 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2790 /// this runtime but can swallow the pragmas, and find and link against the
2791 /// runtime library itself.
2792 OMPRT_GOMP,
2793
Chandler Carruthc6625c62015-05-28 21:10:31 +00002794 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002795 /// OpenMP runtime. We support this mode for users with existing dependencies
2796 /// on this runtime library name.
2797 OMPRT_IOMP5
2798};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002799}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002800
2801/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002802static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2803 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002804 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2805
2806 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2807 if (A)
2808 RuntimeName = A->getValue();
2809
2810 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002811 .Case("libomp", OMPRT_OMP)
2812 .Case("libgomp", OMPRT_GOMP)
2813 .Case("libiomp5", OMPRT_IOMP5)
2814 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002815
2816 if (RT == OMPRT_Unknown) {
2817 if (A)
2818 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002820 else
2821 // FIXME: We could use a nicer diagnostic here.
2822 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2823 }
2824
2825 return RT;
2826}
2827
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002828static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2829 const ArgList &Args) {
2830 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2831 options::OPT_fno_openmp, false))
2832 return;
2833
2834 switch (getOpenMPRuntime(TC, Args)) {
2835 case OMPRT_OMP:
2836 CmdArgs.push_back("-lomp");
2837 break;
2838 case OMPRT_GOMP:
2839 CmdArgs.push_back("-lgomp");
2840 break;
2841 case OMPRT_IOMP5:
2842 CmdArgs.push_back("-liomp5");
2843 break;
2844 case OMPRT_Unknown:
2845 // Already diagnosed.
2846 break;
2847 }
2848}
2849
Alexey Samsonov52550342014-09-15 19:58:40 +00002850static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2851 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002852 bool IsShared, bool IsWhole) {
2853 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002854 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002855 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002856 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002857 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002858}
2859
Alexey Samsonov52550342014-09-15 19:58:40 +00002860// Tries to use a file with the list of dynamic symbols that need to be exported
2861// from the runtime library. Returns true if the file was found.
2862static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2863 ArgStringList &CmdArgs,
2864 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002865 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002866 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2867 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002868 return true;
2869 }
2870 return false;
2871}
2872
2873static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2874 ArgStringList &CmdArgs) {
2875 // Force linking against the system libraries sanitizers depends on
2876 // (see PR15823 why this is necessary).
2877 CmdArgs.push_back("--no-as-needed");
2878 CmdArgs.push_back("-lpthread");
2879 CmdArgs.push_back("-lrt");
2880 CmdArgs.push_back("-lm");
2881 // There's no libdl on FreeBSD.
2882 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2883 CmdArgs.push_back("-ldl");
2884}
2885
2886static void
2887collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2888 SmallVectorImpl<StringRef> &SharedRuntimes,
2889 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002890 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2891 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2892 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002893 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2894 // Collect shared runtimes.
2895 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2896 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002897 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002898 // The stats_client library is also statically linked into DSOs.
2899 if (SanArgs.needsStatsRt())
2900 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002901
Alexey Samsonov52550342014-09-15 19:58:40 +00002902 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002903 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002904 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002905 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002906 }
2907 if (SanArgs.needsAsanRt()) {
2908 if (SanArgs.needsSharedAsanRt()) {
2909 HelperStaticRuntimes.push_back("asan-preinit");
2910 } else {
2911 StaticRuntimes.push_back("asan");
2912 if (SanArgs.linkCXXRuntimes())
2913 StaticRuntimes.push_back("asan_cxx");
2914 }
2915 }
2916 if (SanArgs.needsDfsanRt())
2917 StaticRuntimes.push_back("dfsan");
2918 if (SanArgs.needsLsanRt())
2919 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002920 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002921 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002922 if (SanArgs.linkCXXRuntimes())
2923 StaticRuntimes.push_back("msan_cxx");
2924 }
2925 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002926 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002927 if (SanArgs.linkCXXRuntimes())
2928 StaticRuntimes.push_back("tsan_cxx");
2929 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002930 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002931 StaticRuntimes.push_back("ubsan_standalone");
2932 if (SanArgs.linkCXXRuntimes())
2933 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002934 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002935 if (SanArgs.needsSafeStackRt())
2936 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002937 if (SanArgs.needsCfiRt())
2938 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002939 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002940 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002941 if (SanArgs.linkCXXRuntimes())
2942 StaticRuntimes.push_back("ubsan_standalone_cxx");
2943 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002944 if (SanArgs.needsStatsRt()) {
2945 NonWholeStaticRuntimes.push_back("stats");
2946 RequiredSymbols.push_back("__sanitizer_stats_register");
2947 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002948}
2949
Alexey Samsonov52550342014-09-15 19:58:40 +00002950// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2951// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2952static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002953 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002954 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002955 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002956 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002957 NonWholeStaticRuntimes, HelperStaticRuntimes,
2958 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002959 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002960 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002962 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002963 bool AddExportDynamic = false;
2964 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002965 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002966 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2967 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002968 for (auto RT : NonWholeStaticRuntimes) {
2969 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2970 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2971 }
2972 for (auto S : RequiredSymbols) {
2973 CmdArgs.push_back("-u");
2974 CmdArgs.push_back(Args.MakeArgString(S));
2975 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002976 // If there is a static runtime with no dynamic list, force all the symbols
2977 // to be dynamic to be sure we export sanitizer interface functions.
2978 if (AddExportDynamic)
2979 CmdArgs.push_back("-export-dynamic");
2980 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002981}
2982
Reid Kleckner86ea7702015-02-04 23:45:07 +00002983static bool areOptimizationsEnabled(const ArgList &Args) {
2984 // Find the last -O arg and see if it is non-zero.
2985 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2986 return !A->getOption().matches(options::OPT_O0);
2987 // Defaults to -O0.
2988 return false;
2989}
2990
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002991static bool shouldUseFramePointerForTarget(const ArgList &Args,
2992 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002993 switch (Triple.getArch()) {
2994 case llvm::Triple::xcore:
2995 case llvm::Triple::wasm32:
2996 case llvm::Triple::wasm64:
2997 // XCore never wants frame pointers, regardless of OS.
2998 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002999 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003000 default:
3001 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003002 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003003
3004 if (Triple.isOSLinux()) {
3005 switch (Triple.getArch()) {
3006 // Don't use a frame pointer on linux if optimizing for certain targets.
3007 case llvm::Triple::mips64:
3008 case llvm::Triple::mips64el:
3009 case llvm::Triple::mips:
3010 case llvm::Triple::mipsel:
3011 case llvm::Triple::systemz:
3012 case llvm::Triple::x86:
3013 case llvm::Triple::x86_64:
3014 return !areOptimizationsEnabled(Args);
3015 default:
3016 return true;
3017 }
3018 }
3019
3020 if (Triple.isOSWindows()) {
3021 switch (Triple.getArch()) {
3022 case llvm::Triple::x86:
3023 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003024 case llvm::Triple::x86_64:
3025 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003026 case llvm::Triple::arm:
3027 case llvm::Triple::thumb:
3028 // Windows on ARM builds with FPO disabled to aid fast stack walking
3029 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003030 default:
3031 // All other supported Windows ISAs use xdata unwind information, so frame
3032 // pointers are not generally useful.
3033 return false;
3034 }
3035 }
3036
3037 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003038}
3039
Rafael Espindola224dd632011-12-14 21:02:23 +00003040static bool shouldUseFramePointer(const ArgList &Args,
3041 const llvm::Triple &Triple) {
3042 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3043 options::OPT_fomit_frame_pointer))
3044 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003045 if (Args.hasArg(options::OPT_pg))
3046 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003047
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003048 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003049}
3050
Eric Christopherb7d97e92013-04-03 01:58:53 +00003051static bool shouldUseLeafFramePointer(const ArgList &Args,
3052 const llvm::Triple &Triple) {
3053 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3054 options::OPT_momit_leaf_frame_pointer))
3055 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003056 if (Args.hasArg(options::OPT_pg))
3057 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003058
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003059 if (Triple.isPS4CPU())
3060 return false;
3061
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003062 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003063}
3064
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003065/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003066static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003067 SmallString<128> cwd;
3068 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003069 CmdArgs.push_back("-fdebug-compilation-dir");
3070 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003071 }
3072}
3073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003074static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003075 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3076 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3077 SmallString<128> T(FinalOutput->getValue());
3078 llvm::sys::path::replace_extension(T, "dwo");
3079 return Args.MakeArgString(T);
3080 } else {
3081 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003082 SmallString<128> T(
3083 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003084 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003085 llvm::sys::path::replace_extension(F, "dwo");
3086 T += F;
3087 return Args.MakeArgString(F);
3088 }
3089}
3090
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003091static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3092 const JobAction &JA, const ArgList &Args,
3093 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003094 ArgStringList ExtractArgs;
3095 ExtractArgs.push_back("--extract-dwo");
3096
3097 ArgStringList StripArgs;
3098 StripArgs.push_back("--strip-dwo");
3099
3100 // Grabbing the output of the earlier compile step.
3101 StripArgs.push_back(Output.getFilename());
3102 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003103 ExtractArgs.push_back(OutFile);
3104
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003106 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003107
3108 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003109 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003110
3111 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003112 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003113}
3114
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003115/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003116/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3117static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003118 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003119 if (A->getOption().matches(options::OPT_O4) ||
3120 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003121 return true;
3122
3123 if (A->getOption().matches(options::OPT_O0))
3124 return false;
3125
3126 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3127
Rafael Espindola91780de2013-08-26 14:05:41 +00003128 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003129 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003130 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003131 return true;
3132
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003133 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003134 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003135 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003136
3137 unsigned OptLevel = 0;
3138 if (S.getAsInteger(10, OptLevel))
3139 return false;
3140
3141 return OptLevel > 1;
3142 }
3143
3144 return false;
3145}
3146
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003147/// Add -x lang to \p CmdArgs for \p Input.
3148static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3149 ArgStringList &CmdArgs) {
3150 // When using -verify-pch, we don't want to provide the type
3151 // 'precompiled-header' if it was inferred from the file extension
3152 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3153 return;
3154
3155 CmdArgs.push_back("-x");
3156 if (Args.hasArg(options::OPT_rewrite_objc))
3157 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3158 else
3159 CmdArgs.push_back(types::getTypeName(Input.getType()));
3160}
3161
David Majnemerc371ff02015-03-22 08:39:22 +00003162static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003163 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003164 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003165
3166 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003167 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003168
3169 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003171 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003172 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003173}
3174
Rafael Espindola577637a2015-01-03 00:06:04 +00003175// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003176// options that build systems might add but are unused when assembling or only
3177// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003178static void claimNoWarnArgs(const ArgList &Args) {
3179 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003180 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003181 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003182 Args.ClaimAllArgs(options::OPT_flto);
3183 Args.ClaimAllArgs(options::OPT_fno_lto);
3184}
3185
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003186static void appendUserToPath(SmallVectorImpl<char> &Result) {
3187#ifdef LLVM_ON_UNIX
3188 const char *Username = getenv("LOGNAME");
3189#else
3190 const char *Username = getenv("USERNAME");
3191#endif
3192 if (Username) {
3193 // Validate that LoginName can be used in a path, and get its length.
3194 size_t Len = 0;
3195 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003196 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003197 Username = nullptr;
3198 break;
3199 }
3200 }
3201
3202 if (Username && Len > 0) {
3203 Result.append(Username, Username + Len);
3204 return;
3205 }
3206 }
3207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003208// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003209#ifdef LLVM_ON_UNIX
3210 std::string UID = llvm::utostr(getuid());
3211#else
3212 // FIXME: Windows seems to have an 'SID' that might work.
3213 std::string UID = "9999";
3214#endif
3215 Result.append(UID.begin(), UID.end());
3216}
3217
David Majnemere11d3732015-06-08 00:22:46 +00003218VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3219 const llvm::Triple &Triple,
3220 const llvm::opt::ArgList &Args,
3221 bool IsWindowsMSVC) {
3222 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3223 IsWindowsMSVC) ||
3224 Args.hasArg(options::OPT_fmsc_version) ||
3225 Args.hasArg(options::OPT_fms_compatibility_version)) {
3226 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3227 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003228 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003229
3230 if (MSCVersion && MSCompatibilityVersion) {
3231 if (D)
3232 D->Diag(diag::err_drv_argument_not_allowed_with)
3233 << MSCVersion->getAsString(Args)
3234 << MSCompatibilityVersion->getAsString(Args);
3235 return VersionTuple();
3236 }
3237
3238 if (MSCompatibilityVersion) {
3239 VersionTuple MSVT;
3240 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3241 D->Diag(diag::err_drv_invalid_value)
3242 << MSCompatibilityVersion->getAsString(Args)
3243 << MSCompatibilityVersion->getValue();
3244 return MSVT;
3245 }
3246
3247 if (MSCVersion) {
3248 unsigned Version = 0;
3249 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3250 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3251 << MSCVersion->getValue();
3252 return getMSCompatibilityVersion(Version);
3253 }
3254
3255 unsigned Major, Minor, Micro;
3256 Triple.getEnvironmentVersion(Major, Minor, Micro);
3257 if (Major || Minor || Micro)
3258 return VersionTuple(Major, Minor, Micro);
3259
3260 return VersionTuple(18);
3261 }
3262 return VersionTuple();
3263}
3264
Diego Novilloa0545962015-07-10 18:00:07 +00003265static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3266 const InputInfo &Output, const ArgList &Args,
3267 ArgStringList &CmdArgs) {
3268 auto *ProfileGenerateArg = Args.getLastArg(
3269 options::OPT_fprofile_instr_generate,
3270 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003271 options::OPT_fprofile_generate_EQ,
3272 options::OPT_fno_profile_instr_generate);
3273 if (ProfileGenerateArg &&
3274 ProfileGenerateArg->getOption().matches(
3275 options::OPT_fno_profile_instr_generate))
3276 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003277
3278 auto *ProfileUseArg = Args.getLastArg(
3279 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003280 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3281 options::OPT_fno_profile_instr_use);
3282 if (ProfileUseArg &&
3283 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3284 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003285
3286 if (ProfileGenerateArg && ProfileUseArg)
3287 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003288 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003289
Diego Novillo758f3f52015-08-05 21:49:51 +00003290 if (ProfileGenerateArg) {
3291 if (ProfileGenerateArg->getOption().matches(
3292 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003293 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3294 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003295 else if (ProfileGenerateArg->getOption().matches(
3296 options::OPT_fprofile_generate_EQ)) {
3297 SmallString<128> Path(ProfileGenerateArg->getValue());
3298 llvm::sys::path::append(Path, "default.profraw");
3299 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003300 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3301 }
3302 // The default is to use Clang Instrumentation.
3303 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003304 }
Diego Novilloa0545962015-07-10 18:00:07 +00003305
Diego Novillo758f3f52015-08-05 21:49:51 +00003306 if (ProfileUseArg) {
3307 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003308 CmdArgs.push_back(Args.MakeArgString(
3309 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003310 else if ((ProfileUseArg->getOption().matches(
3311 options::OPT_fprofile_use_EQ) ||
3312 ProfileUseArg->getOption().matches(
3313 options::OPT_fprofile_instr_use))) {
3314 SmallString<128> Path(
3315 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3316 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3317 llvm::sys::path::append(Path, "default.profdata");
3318 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003319 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003320 }
Diego Novilloa0545962015-07-10 18:00:07 +00003321 }
3322
3323 if (Args.hasArg(options::OPT_ftest_coverage) ||
3324 Args.hasArg(options::OPT_coverage))
3325 CmdArgs.push_back("-femit-coverage-notes");
3326 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3327 false) ||
3328 Args.hasArg(options::OPT_coverage))
3329 CmdArgs.push_back("-femit-coverage-data");
3330
Diego Novilloc4b94da2015-08-05 23:27:40 +00003331 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3332 options::OPT_fno_coverage_mapping, false) &&
3333 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003334 D.Diag(diag::err_drv_argument_only_allowed_with)
3335 << "-fcoverage-mapping"
3336 << "-fprofile-instr-generate";
3337
Diego Novilloc4b94da2015-08-05 23:27:40 +00003338 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3339 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003340 CmdArgs.push_back("-fcoverage-mapping");
3341
3342 if (C.getArgs().hasArg(options::OPT_c) ||
3343 C.getArgs().hasArg(options::OPT_S)) {
3344 if (Output.isFilename()) {
3345 CmdArgs.push_back("-coverage-file");
3346 SmallString<128> CoverageFilename;
3347 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3348 CoverageFilename = FinalOutput->getValue();
3349 } else {
3350 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3351 }
3352 if (llvm::sys::path::is_relative(CoverageFilename)) {
3353 SmallString<128> Pwd;
3354 if (!llvm::sys::fs::current_path(Pwd)) {
3355 llvm::sys::path::append(Pwd, CoverageFilename);
3356 CoverageFilename.swap(Pwd);
3357 }
3358 }
3359 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3360 }
3361 }
3362}
3363
Paul Robinsond083b9a2015-12-16 17:25:27 +00003364static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3365 ArgStringList &CmdArgs) {
3366 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3367 false) ||
3368 Args.hasFlag(options::OPT_fprofile_generate,
3369 options::OPT_fno_profile_instr_generate, false) ||
3370 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3371 options::OPT_fno_profile_instr_generate, false) ||
3372 Args.hasFlag(options::OPT_fprofile_instr_generate,
3373 options::OPT_fno_profile_instr_generate, false) ||
3374 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3375 options::OPT_fno_profile_instr_generate, false) ||
3376 Args.hasArg(options::OPT_fcreate_profile) ||
3377 Args.hasArg(options::OPT_coverage)))
3378 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3379}
3380
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003381/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3382/// smooshes them together with platform defaults, to decide whether
3383/// this compile should be using PIC mode or not. Returns a tuple of
3384/// (RelocationModel, PICLevel, IsPIE).
3385static std::tuple<llvm::Reloc::Model, unsigned, bool>
3386ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3387 const ArgList &Args) {
3388 // FIXME: why does this code...and so much everywhere else, use both
3389 // ToolChain.getTriple() and Triple?
3390 bool PIE = ToolChain.isPIEDefault();
3391 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003392 // The Darwin/MachO default to use PIC does not apply when using -static.
3393 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3394 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003395 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003396 bool IsPICLevelTwo = PIC;
3397
3398 bool KernelOrKext =
3399 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3400
3401 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003402 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003403 switch (ToolChain.getArch()) {
3404 case llvm::Triple::arm:
3405 case llvm::Triple::armeb:
3406 case llvm::Triple::thumb:
3407 case llvm::Triple::thumbeb:
3408 case llvm::Triple::aarch64:
3409 case llvm::Triple::mips:
3410 case llvm::Triple::mipsel:
3411 case llvm::Triple::mips64:
3412 case llvm::Triple::mips64el:
3413 PIC = true; // "-fpic"
3414 break;
3415
3416 case llvm::Triple::x86:
3417 case llvm::Triple::x86_64:
3418 PIC = true; // "-fPIC"
3419 IsPICLevelTwo = true;
3420 break;
3421
3422 default:
3423 break;
3424 }
3425 }
3426
3427 // OpenBSD-specific defaults for PIE
3428 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3429 switch (ToolChain.getArch()) {
3430 case llvm::Triple::mips64:
3431 case llvm::Triple::mips64el:
3432 case llvm::Triple::sparcel:
3433 case llvm::Triple::x86:
3434 case llvm::Triple::x86_64:
3435 IsPICLevelTwo = false; // "-fpie"
3436 break;
3437
3438 case llvm::Triple::ppc:
3439 case llvm::Triple::sparc:
3440 case llvm::Triple::sparcv9:
3441 IsPICLevelTwo = true; // "-fPIE"
3442 break;
3443
3444 default:
3445 break;
3446 }
3447 }
3448
3449 // The last argument relating to either PIC or PIE wins, and no
3450 // other argument is used. If the last argument is any flavor of the
3451 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3452 // option implicitly enables PIC at the same level.
3453 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3454 options::OPT_fpic, options::OPT_fno_pic,
3455 options::OPT_fPIE, options::OPT_fno_PIE,
3456 options::OPT_fpie, options::OPT_fno_pie);
3457 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3458 // is forced, then neither PIC nor PIE flags will have no effect.
3459 if (!ToolChain.isPICDefaultForced()) {
3460 if (LastPICArg) {
3461 Option O = LastPICArg->getOption();
3462 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3463 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3464 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3465 PIC =
3466 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3467 IsPICLevelTwo =
3468 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3469 } else {
3470 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003471 if (Triple.isPS4CPU()) {
3472 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3473 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3474 if (Model != "kernel") {
3475 PIC = true;
3476 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3477 << LastPICArg->getSpelling();
3478 }
3479 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003480 }
3481 }
3482 }
3483
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003484 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3485 // PIC level would've been set to level 1, force it back to level 2 PIC
3486 // instead.
3487 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003488 IsPICLevelTwo |= ToolChain.isPICDefault();
3489
James Y Knightc4015d32015-08-21 04:14:55 +00003490 // This kernel flags are a trump-card: they will disable PIC/PIE
3491 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003492 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3493 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003494 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003495
3496 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3497 // This is a very special mode. It trumps the other modes, almost no one
3498 // uses it, and it isn't even valid on any OS but Darwin.
3499 if (!ToolChain.getTriple().isOSDarwin())
3500 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3501 << A->getSpelling() << ToolChain.getTriple().str();
3502
3503 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3504
3505 // Only a forced PIC mode can cause the actual compile to have PIC defines
3506 // etc., no flags are sufficient. This behavior was selected to closely
3507 // match that of llvm-gcc and Apple GCC before that.
3508 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3509
3510 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3511 }
3512
3513 if (PIC)
3514 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3515
3516 return std::make_tuple(llvm::Reloc::Static, 0, false);
3517}
3518
3519static const char *RelocationModelName(llvm::Reloc::Model Model) {
3520 switch (Model) {
3521 case llvm::Reloc::Default:
3522 return nullptr;
3523 case llvm::Reloc::Static:
3524 return "static";
3525 case llvm::Reloc::PIC_:
3526 return "pic";
3527 case llvm::Reloc::DynamicNoPIC:
3528 return "dynamic-no-pic";
3529 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003530 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003531}
3532
3533static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3534 ArgStringList &CmdArgs) {
3535 llvm::Reloc::Model RelocationModel;
3536 unsigned PICLevel;
3537 bool IsPIE;
3538 std::tie(RelocationModel, PICLevel, IsPIE) =
3539 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3540
3541 if (RelocationModel != llvm::Reloc::Static)
3542 CmdArgs.push_back("-KPIC");
3543}
3544
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003545void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003546 const InputInfo &Output, const InputInfoList &Inputs,
3547 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003548 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3549 const llvm::Triple Triple(TripleStr);
3550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003551 bool KernelOrKext =
3552 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003553 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003554 ArgStringList CmdArgs;
3555
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003556 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003557 bool IsWindowsCygnus =
3558 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003559 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003560 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003561
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003562 // Check number of inputs for sanity. We need at least one input.
3563 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003564 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003565 // CUDA compilation may have multiple inputs (source file + results of
3566 // device-side compilations). All other jobs are expected to have exactly one
3567 // input.
3568 bool IsCuda = types::isCuda(Input.getType());
3569 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003570
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003571 // Invoke ourselves in -cc1 mode.
3572 //
3573 // FIXME: Implement custom jobs for internal actions.
3574 CmdArgs.push_back("-cc1");
3575
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003576 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003577 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003578 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003579
Artem Belevichfa11ab52015-11-17 22:28:46 +00003580 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003581 if (IsCuda) {
3582 // FIXME: We need a (better) way to pass information about
3583 // particular compilation pass we're constructing here. For now we
3584 // can check which toolchain we're using and pick the other one to
3585 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003586 if (&getToolChain() == C.getCudaDeviceToolChain())
3587 AuxToolChain = C.getCudaHostToolChain();
3588 else if (&getToolChain() == C.getCudaHostToolChain())
3589 AuxToolChain = C.getCudaDeviceToolChain();
3590 else
3591 llvm_unreachable("Can't figure out CUDA compilation mode.");
3592 assert(AuxToolChain != nullptr && "No aux toolchain.");
3593 CmdArgs.push_back("-aux-triple");
3594 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003595 CmdArgs.push_back("-fcuda-target-overloads");
3596 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003597 }
3598
James Y Knight2db38f32015-08-15 03:45:25 +00003599 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3600 Triple.getArch() == llvm::Triple::thumb)) {
3601 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003602 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003603 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003604 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003605 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003606 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003607 }
3608
Tim Northover336f1892014-03-29 13:16:12 +00003609 // Push all default warning arguments that are specific to
3610 // the given target. These come before user provided warning options
3611 // are provided.
3612 getToolChain().addClangWarningOptions(CmdArgs);
3613
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003614 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003615 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003616
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003617 if (isa<AnalyzeJobAction>(JA)) {
3618 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3619 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003620 } else if (isa<MigrateJobAction>(JA)) {
3621 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003622 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003623 if (Output.getType() == types::TY_Dependencies)
3624 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003625 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003626 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003627 if (Args.hasArg(options::OPT_rewrite_objc) &&
3628 !Args.hasArg(options::OPT_g_Group))
3629 CmdArgs.push_back("-P");
3630 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003631 } else if (isa<AssembleJobAction>(JA)) {
3632 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003633
David Blaikie9260ed62013-07-25 21:19:01 +00003634 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003635
3636 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003637 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003638 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003639 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003640 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003641
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003642 if (JA.getType() == types::TY_Nothing)
3643 CmdArgs.push_back("-fsyntax-only");
3644 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003645 CmdArgs.push_back("-emit-pch");
3646 else
3647 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003648 } else if (isa<VerifyPCHJobAction>(JA)) {
3649 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003650 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003651 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3652 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003653 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003654 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003655 } else if (JA.getType() == types::TY_LLVM_IR ||
3656 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003657 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003658 } else if (JA.getType() == types::TY_LLVM_BC ||
3659 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003660 CmdArgs.push_back("-emit-llvm-bc");
3661 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003662 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003663 } else if (JA.getType() == types::TY_AST) {
3664 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003665 } else if (JA.getType() == types::TY_ModuleFile) {
3666 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003667 } else if (JA.getType() == types::TY_RewrittenObjC) {
3668 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003669 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003670 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3671 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003672 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003673 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003674 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003675 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003676
3677 // Preserve use-list order by default when emitting bitcode, so that
3678 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3679 // same result as running passes here. For LTO, we don't need to preserve
3680 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003681 if (JA.getType() == types::TY_LLVM_BC)
3682 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003683
3684 if (D.isUsingLTO())
3685 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003686 }
3687
Teresa Johnsonaff22322015-12-07 19:21:34 +00003688 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3689 if (!types::isLLVMIR(Input.getType()))
3690 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3691 << "-x ir";
3692 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3693 }
3694
Steven Wu574b0f22016-03-01 01:07:58 +00003695 // Embed-bitcode option.
3696 if (C.getDriver().embedBitcodeEnabled() &&
3697 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3698 // Add flags implied by -fembed-bitcode.
3699 CmdArgs.push_back("-fembed-bitcode");
3700 // Disable all llvm IR level optimizations.
3701 CmdArgs.push_back("-disable-llvm-optzns");
3702 }
3703 if (C.getDriver().embedBitcodeMarkerOnly())
3704 CmdArgs.push_back("-fembed-bitcode-marker");
3705
Justin Bognera88f0122014-06-20 22:59:50 +00003706 // We normally speed up the clang process a bit by skipping destructors at
3707 // exit, but when we're generating diagnostics we can rely on some of the
3708 // cleanup.
3709 if (!C.isForDiagnostics())
3710 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003711
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003712// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003713#ifdef NDEBUG
3714 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003715 // Discard LLVM value names in -asserts builds.
3716 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003717#endif
3718
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003719 // Set the main file name, so that debug info works even with
3720 // -save-temps.
3721 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003722 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003723
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003724 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003725 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003726 if (Args.hasArg(options::OPT_static))
3727 CmdArgs.push_back("-static-define");
3728
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003729 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003730 // Enable region store model by default.
3731 CmdArgs.push_back("-analyzer-store=region");
3732
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003733 // Treat blocks as analysis entry points.
3734 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3735
Ted Kremenek49c79792011-03-24 00:28:47 +00003736 CmdArgs.push_back("-analyzer-eagerly-assume");
3737
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003738 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003739 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003740 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003741
Devin Coughlin65c77082016-01-21 20:09:49 +00003742 if (!IsWindowsMSVC) {
3743 CmdArgs.push_back("-analyzer-checker=unix");
3744 } else {
3745 // Enable "unix" checkers that also work on Windows.
3746 CmdArgs.push_back("-analyzer-checker=unix.API");
3747 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3748 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3749 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3750 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3751 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3752 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003753
Sean Evesonb38c32b2016-01-06 10:03:58 +00003754 // Disable some unix checkers for PS4.
3755 if (IsPS4CPU) {
3756 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3757 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3758 }
3759
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003760 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003761 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003763 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003764
Artem Belevichba558952015-05-06 18:20:23 +00003765 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003766 CmdArgs.push_back("-analyzer-checker=cplusplus");
3767
Sean Evesonb38c32b2016-01-06 10:03:58 +00003768 if (!IsPS4CPU) {
3769 CmdArgs.push_back(
3770 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3771 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3772 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3773 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3774 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3775 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3776 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003777
3778 // Default nullability checks.
3779 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3780 CmdArgs.push_back(
3781 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003782 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003783
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003784 // Set the output format. The default is plist, for (lame) historical
3785 // reasons.
3786 CmdArgs.push_back("-analyzer-output");
3787 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003788 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003789 else
3790 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003791
Ted Kremenekfe449a22010-03-22 22:32:05 +00003792 // Disable the presentation of standard compiler warnings when
3793 // using --analyze. We only want to show static analyzer diagnostics
3794 // or frontend errors.
3795 CmdArgs.push_back("-w");
3796
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003797 // Add -Xanalyzer arguments when running as analyzer.
3798 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003799 }
3800
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003801 CheckCodeGenerationOptions(D, Args);
3802
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003803 llvm::Reloc::Model RelocationModel;
3804 unsigned PICLevel;
3805 bool IsPIE;
3806 std::tie(RelocationModel, PICLevel, IsPIE) =
3807 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003808
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003809 const char *RMName = RelocationModelName(RelocationModel);
3810 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003811 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003812 CmdArgs.push_back(RMName);
3813 }
3814 if (PICLevel > 0) {
3815 CmdArgs.push_back("-pic-level");
3816 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3817 if (IsPIE) {
3818 CmdArgs.push_back("-pie-level");
3819 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003820 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003821 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003822
Renato Golin4854d802015-11-09 12:40:41 +00003823 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3824 CmdArgs.push_back("-meabi");
3825 CmdArgs.push_back(A->getValue());
3826 }
3827
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003828 CmdArgs.push_back("-mthread-model");
3829 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3830 CmdArgs.push_back(A->getValue());
3831 else
3832 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3833
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003834 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3835
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003836 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3837 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003838 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003839
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003840 // LLVM Code Generator Options.
3841
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003842 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3843 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003844 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3845 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003846 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003847 CmdArgs.push_back(A->getValue());
3848 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003849 }
3850 }
3851
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003852 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3853 StringRef v = A->getValue();
3854 CmdArgs.push_back("-mllvm");
3855 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3856 A->claim();
3857 }
3858
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003859 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3860 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003861 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003862 }
3863
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003864 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3865 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003866 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003867 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003868 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003869 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3870 CmdArgs.push_back("-fpcc-struct-return");
3871 } else {
3872 assert(A->getOption().matches(options::OPT_freg_struct_return));
3873 CmdArgs.push_back("-freg-struct-return");
3874 }
3875 }
3876
Roman Divacky65b88cd2011-03-01 17:40:53 +00003877 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3878 CmdArgs.push_back("-mrtd");
3879
Rafael Espindola224dd632011-12-14 21:02:23 +00003880 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003881 CmdArgs.push_back("-mdisable-fp-elim");
3882 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3883 options::OPT_fno_zero_initialized_in_bss))
3884 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003885
3886 bool OFastEnabled = isOptimizationLevelFast(Args);
3887 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3888 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003889 OptSpecifier StrictAliasingAliasOption =
3890 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003891 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3892 // doesn't do any TBAA.
3893 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003894 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003895 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003896 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003897 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3898 options::OPT_fno_struct_path_tbaa))
3899 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003900 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3901 false))
3902 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003903 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3904 options::OPT_fno_strict_vtable_pointers,
3905 false))
3906 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003907 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3908 options::OPT_fno_optimize_sibling_calls))
3909 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003910
Eric Christopher006208c2013-04-04 06:29:47 +00003911 // Handle segmented stacks.
3912 if (Args.hasArg(options::OPT_fsplit_stack))
3913 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003914
3915 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3916 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003917 OptSpecifier FastMathAliasOption =
3918 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3919
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003920 // Handle various floating point optimization flags, mapping them to the
3921 // appropriate LLVM code generation flags. The pattern for all of these is to
3922 // default off the codegen optimizations, and if any flag enables them and no
3923 // flag disables them after the flag enabling them, enable the codegen
3924 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003925 if (Arg *A = Args.getLastArg(
3926 options::OPT_ffast_math, FastMathAliasOption,
3927 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3928 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3929 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003930 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3931 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003932 A->getOption().getID() != options::OPT_fhonor_infinities)
3933 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003934 if (Arg *A = Args.getLastArg(
3935 options::OPT_ffast_math, FastMathAliasOption,
3936 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3937 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3938 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003939 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3940 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003941 A->getOption().getID() != options::OPT_fhonor_nans)
3942 CmdArgs.push_back("-menable-no-nans");
3943
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003944 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3945 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003946 if (Arg *A =
3947 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3948 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3949 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003950 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3951 // However, turning *off* -ffast_math merely restores the toolchain default
3952 // (which may be false).
3953 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3954 A->getOption().getID() == options::OPT_ffast_math ||
3955 A->getOption().getID() == options::OPT_Ofast)
3956 MathErrno = false;
3957 else if (A->getOption().getID() == options::OPT_fmath_errno)
3958 MathErrno = true;
3959 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003960 if (MathErrno)
3961 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003962
3963 // There are several flags which require disabling very specific
3964 // optimizations. Any of these being disabled forces us to turn off the
3965 // entire set of LLVM optimizations, so collect them through all the flag
3966 // madness.
3967 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003968 if (Arg *A = Args.getLastArg(
3969 options::OPT_ffast_math, FastMathAliasOption,
3970 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3971 options::OPT_fno_unsafe_math_optimizations,
3972 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003973 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3974 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003975 A->getOption().getID() != options::OPT_fno_associative_math)
3976 AssociativeMath = true;
3977 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003978 if (Arg *A = Args.getLastArg(
3979 options::OPT_ffast_math, FastMathAliasOption,
3980 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3981 options::OPT_fno_unsafe_math_optimizations,
3982 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003983 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3984 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003985 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3986 ReciprocalMath = true;
3987 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003988 if (Arg *A = Args.getLastArg(
3989 options::OPT_ffast_math, FastMathAliasOption,
3990 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3991 options::OPT_fno_unsafe_math_optimizations,
3992 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003993 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3994 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003995 A->getOption().getID() != options::OPT_fsigned_zeros)
3996 SignedZeros = false;
3997 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003998 if (Arg *A = Args.getLastArg(
3999 options::OPT_ffast_math, FastMathAliasOption,
4000 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4001 options::OPT_fno_unsafe_math_optimizations,
4002 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004003 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4004 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004005 A->getOption().getID() != options::OPT_ftrapping_math)
4006 TrappingMath = false;
4007 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4008 !TrappingMath)
4009 CmdArgs.push_back("-menable-unsafe-fp-math");
4010
Sanjay Patel76c9e092015-01-23 16:40:50 +00004011 if (!SignedZeros)
4012 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004013
Sanjay Patel359b1052015-04-09 15:03:23 +00004014 if (ReciprocalMath)
4015 CmdArgs.push_back("-freciprocal-math");
4016
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004017 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004018 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004019 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004020 options::OPT_ffp_contract)) {
4021 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004022 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004023 if (Val == "fast" || Val == "on" || Val == "off") {
4024 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4025 } else {
4026 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004028 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004029 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4030 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004031 // If fast-math is set then set the fp-contract mode to fast.
4032 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4033 }
4034 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004035
Sanjay Patel2987c292015-06-11 14:53:41 +00004036 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004037
Bob Wilson6a039162012-07-19 03:52:53 +00004038 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4039 // and if we find them, tell the frontend to provide the appropriate
4040 // preprocessor macros. This is distinct from enabling any optimizations as
4041 // these options induce language changes which must survive serialization
4042 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004043 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4044 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004045 if (!A->getOption().matches(options::OPT_fno_fast_math))
4046 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004047 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4048 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004049 if (A->getOption().matches(options::OPT_ffinite_math_only))
4050 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004051
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004052 // Decide whether to use verbose asm. Verbose assembly is the default on
4053 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004054 bool IsIntegratedAssemblerDefault =
4055 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004056 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004057 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004058 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004059 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004060
Rafael Espindolab8a12932015-05-22 20:44:03 +00004061 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4062 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004063 CmdArgs.push_back("-no-integrated-as");
4064
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004065 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4066 CmdArgs.push_back("-mdebug-pass");
4067 CmdArgs.push_back("Structure");
4068 }
4069 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4070 CmdArgs.push_back("-mdebug-pass");
4071 CmdArgs.push_back("Arguments");
4072 }
4073
Justin Lebar710a35f2016-01-25 22:36:35 +00004074 // Enable -mconstructor-aliases except on darwin, where we have to work around
4075 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4076 // aliases aren't supported.
4077 if (!getToolChain().getTriple().isOSDarwin() &&
4078 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004079 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004080
John McCall7ef5cb32011-03-18 02:56:14 +00004081 // Darwin's kernel doesn't support guard variables; just die if we
4082 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004083 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004084 CmdArgs.push_back("-fforbid-guard-variables");
4085
Akira Hatanaka02028482015-11-12 17:21:22 +00004086 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4087 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004088 CmdArgs.push_back("-mms-bitfields");
4089 }
John McCall8517abc2010-02-19 02:45:38 +00004090
Daniel Dunbar306945d2009-09-16 06:17:29 +00004091 // This is a coarse approximation of what llvm-gcc actually does, both
4092 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4093 // complicated ways.
4094 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004095 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4096 options::OPT_fno_asynchronous_unwind_tables,
4097 (getToolChain().IsUnwindTablesDefault() ||
4098 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4099 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004100 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4101 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004102 CmdArgs.push_back("-munwind-tables");
4103
Chandler Carruth05fb5852012-11-21 23:40:23 +00004104 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004105
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004106 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4107 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004108 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004109 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004110
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004111 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004112 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004113
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004114 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004115 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004116 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004117 }
4118
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004119 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004120 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004121 if (!CPU.empty()) {
4122 CmdArgs.push_back("-target-cpu");
4123 CmdArgs.push_back(Args.MakeArgString(CPU));
4124 }
4125
Rafael Espindolaeb265472013-08-21 21:59:03 +00004126 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4127 CmdArgs.push_back("-mfpmath");
4128 CmdArgs.push_back(A->getValue());
4129 }
4130
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004131 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004132 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004133
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004134 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004135 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004136 default:
4137 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004138
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004139 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004140 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004141 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004142 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004143 // Use the effective triple, which takes into account the deployment target.
4144 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004145 break;
4146
Tim Northover573cbee2014-05-24 12:52:07 +00004147 case llvm::Triple::aarch64:
4148 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004149 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004150 break;
4151
Eric Christopher0b26a612010-03-02 02:41:08 +00004152 case llvm::Triple::mips:
4153 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004154 case llvm::Triple::mips64:
4155 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004156 AddMIPSTargetArgs(Args, CmdArgs);
4157 break;
4158
Ulrich Weigand8afad612014-07-28 13:17:52 +00004159 case llvm::Triple::ppc:
4160 case llvm::Triple::ppc64:
4161 case llvm::Triple::ppc64le:
4162 AddPPCTargetArgs(Args, CmdArgs);
4163 break;
4164
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004165 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004166 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004167 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004168 AddSparcTargetArgs(Args, CmdArgs);
4169 break;
4170
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004171 case llvm::Triple::x86:
4172 case llvm::Triple::x86_64:
4173 AddX86TargetArgs(Args, CmdArgs);
4174 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004175
4176 case llvm::Triple::hexagon:
4177 AddHexagonTargetArgs(Args, CmdArgs);
4178 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004179
4180 case llvm::Triple::wasm32:
4181 case llvm::Triple::wasm64:
4182 AddWebAssemblyTargetArgs(Args, CmdArgs);
4183 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004184 }
4185
Douglas Katzman3459ce22015-10-08 04:24:12 +00004186 // The 'g' groups options involve a somewhat intricate sequence of decisions
4187 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004188 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004189 // * what level of debug info to generate
4190 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004191 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004192 // This avoids having to monkey around further in cc1 other than to disable
4193 // codeview if not running in a Windows environment. Perhaps even that
4194 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004195 unsigned DwarfVersion = 0;
4196 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4197 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004198 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004199 bool EmitCodeView = false;
4200
Hans Wennborg75958c42013-08-08 00:17:41 +00004201 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004202 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004203 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004204 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004205
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004206 // Pass the linker version in use.
4207 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4208 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004209 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004210 }
4211
Eric Christopherb7d97e92013-04-03 01:58:53 +00004212 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004213 CmdArgs.push_back("-momit-leaf-frame-pointer");
4214
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004215 // Explicitly error on some things we know we don't support and can't just
4216 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004217 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4218 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004219 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004220 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004221 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4222 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004223 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004224 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004225 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004226 }
4227
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004228 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004229 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004230 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004231 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004232 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4233 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004234 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004235 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004236 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004237
Chad Rosierbe10f982011-08-02 17:58:04 +00004238 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004239 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004240 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4241 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004242 }
4243
Rafael Espindola08a692a2010-03-07 04:46:18 +00004244 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004245 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004246 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004247 // If the last option explicitly specified a debug-info level, use it.
4248 if (A->getOption().matches(options::OPT_gN_Group)) {
4249 DebugInfoKind = DebugLevelToInfoKind(*A);
4250 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4251 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4252 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004253 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004254 A->getIndex() > SplitDwarfArg->getIndex())
4255 SplitDwarfArg = nullptr;
4256 } else
4257 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004258 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004259 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004260
Paul Robinson0334a042015-12-19 19:41:48 +00004261 // If a debugger tuning argument appeared, remember it.
4262 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4263 options::OPT_ggdbN_Group)) {
4264 if (A->getOption().matches(options::OPT_glldb))
4265 DebuggerTuning = llvm::DebuggerKind::LLDB;
4266 else if (A->getOption().matches(options::OPT_gsce))
4267 DebuggerTuning = llvm::DebuggerKind::SCE;
4268 else
4269 DebuggerTuning = llvm::DebuggerKind::GDB;
4270 }
4271
4272 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004273 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004274 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004275 DwarfVersion = DwarfVersionNum(A->getSpelling());
4276
Reid Kleckner124955a2015-08-05 18:51:13 +00004277 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004278 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4279 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4280 // DwarfVersion remains at 0 if no explicit choice was made.
4281 CmdArgs.push_back("-gcodeview");
4282 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004283 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004284 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4285 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004286
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004287 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4288 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004289
4290 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004291 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004292 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004293 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004294
Eric Christopher138c32b2013-09-13 22:37:55 +00004295 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004296 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004297 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004298 CmdArgs.push_back("-dwarf-ext-refs");
4299 CmdArgs.push_back("-fmodule-format=obj");
4300 }
4301
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004302 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4303 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004304 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004305 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004306 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004307 CmdArgs.push_back("-backend-option");
4308 CmdArgs.push_back("-split-dwarf=Enable");
4309 }
4310
Douglas Katzman3459ce22015-10-08 04:24:12 +00004311 // After we've dealt with all combinations of things that could
4312 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4313 // figure out if we need to "upgrade" it to standalone debug info.
4314 // We parse these two '-f' options whether or not they will be used,
4315 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4316 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4317 options::OPT_fno_standalone_debug,
4318 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004319 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4320 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004321 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4322 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004323
Eric Christopher138c32b2013-09-13 22:37:55 +00004324 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4325 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4326 CmdArgs.push_back("-backend-option");
4327 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4328 }
Eric Christophereec89c22013-06-18 00:03:50 +00004329
Eric Christopher0d403d22014-02-14 01:27:03 +00004330 // -gdwarf-aranges turns on the emission of the aranges section in the
4331 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004332 // Always enabled on the PS4.
4333 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004334 CmdArgs.push_back("-backend-option");
4335 CmdArgs.push_back("-generate-arange-section");
4336 }
4337
David Blaikief36d9ba2014-01-27 18:52:43 +00004338 if (Args.hasFlag(options::OPT_fdebug_types_section,
4339 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004340 CmdArgs.push_back("-backend-option");
4341 CmdArgs.push_back("-generate-type-units");
4342 }
Eric Christophereec89c22013-06-18 00:03:50 +00004343
Dan Gohmana5b804b2016-01-07 00:50:27 +00004344 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4345 // default.
4346 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4347 Triple.getArch() == llvm::Triple::wasm32 ||
4348 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004349
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004350 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004351 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004352 CmdArgs.push_back("-ffunction-sections");
4353 }
4354
Peter Collingbourneceef1452016-02-24 22:03:06 +00004355 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4356 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004357 if (!D.isUsingLTO())
4358 D.Diag(diag::err_drv_argument_only_allowed_with)
4359 << "-fwhole-program-vtables"
4360 << "-flto";
4361 CmdArgs.push_back("-fwhole-program-vtables");
4362
4363 clang::SmallString<64> Path(D.ResourceDir);
4364 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4365 if (llvm::sys::fs::exists(Path)) {
4366 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4367 BlacklistOpt += Path.str();
4368 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4369 }
4370
4371 for (const Arg *A :
4372 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4373 A->claim();
4374 if (!llvm::sys::fs::exists(A->getValue()))
4375 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4376 }
4377
4378 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4379 }
4380
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004381 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4382 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004383 CmdArgs.push_back("-fdata-sections");
4384 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004385
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004386 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004387 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004388 CmdArgs.push_back("-fno-unique-section-names");
4389
Chris Lattner3c77a352010-06-22 00:03:40 +00004390 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4391
Diego Novilloa0545962015-07-10 18:00:07 +00004392 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004393
Paul Robinsond083b9a2015-12-16 17:25:27 +00004394 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4395 if (getToolChain().getTriple().isPS4CPU())
4396 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4397
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004398 // Pass options for controlling the default header search paths.
4399 if (Args.hasArg(options::OPT_nostdinc)) {
4400 CmdArgs.push_back("-nostdsysteminc");
4401 CmdArgs.push_back("-nobuiltininc");
4402 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004403 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004404 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004405 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4406 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4407 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004408
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004409 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004410 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004411 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004412
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004413 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4414
Ted Kremenekf7639e12012-03-06 20:06:33 +00004415 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004416 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004417 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004418 options::OPT_ccc_arcmt_modify,
4419 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004420 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004421 switch (A->getOption().getID()) {
4422 default:
4423 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004424 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004425 CmdArgs.push_back("-arcmt-check");
4426 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004427 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004428 CmdArgs.push_back("-arcmt-modify");
4429 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004430 case options::OPT_ccc_arcmt_migrate:
4431 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004432 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004433 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004434
4435 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4436 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004437 break;
John McCalld70fb982011-06-15 23:25:17 +00004438 }
4439 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004440 } else {
4441 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4442 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4443 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004444 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004445
Ted Kremenekf7639e12012-03-06 20:06:33 +00004446 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4447 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004448 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4449 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004450 }
4451 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004452 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004453
4454 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004455 options::OPT_objcmt_migrate_subscripting,
4456 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004457 // None specified, means enable them all.
4458 CmdArgs.push_back("-objcmt-migrate-literals");
4459 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004460 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004461 } else {
4462 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4463 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004464 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004465 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004466 } else {
4467 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4468 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4469 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4470 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4471 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4472 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004473 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004474 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4475 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4476 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4477 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4478 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4479 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4480 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004481 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004482 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004483 }
4484
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004485 // Add preprocessing options like -I, -D, etc. if we are using the
4486 // preprocessor.
4487 //
4488 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004489 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004490 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4491 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004492
Rafael Espindolaa7431922011-07-21 23:40:37 +00004493 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4494 // that "The compiler can only warn and ignore the option if not recognized".
4495 // When building with ccache, it will pass -D options to clang even on
4496 // preprocessed inputs and configure concludes that -fPIC is not supported.
4497 Args.ClaimAllArgs(options::OPT_D);
4498
Alp Toker7874bdc2013-11-15 20:40:58 +00004499 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004500 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4501 if (A->getOption().matches(options::OPT_O4)) {
4502 CmdArgs.push_back("-O3");
4503 D.Diag(diag::warn_O4_is_O3);
4504 } else {
4505 A->render(Args, CmdArgs);
4506 }
4507 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004508
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004509 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004510 for (const Arg *A :
4511 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4512 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004513 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004514 }
4515
Rafael Espindola577637a2015-01-03 00:06:04 +00004516 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004517
Richard Smith3be1cb22014-08-07 00:24:21 +00004518 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004519 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004520 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4521 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004522 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004523 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004524
4525 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004526 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004527 //
4528 // If a std is supplied, only add -trigraphs if it follows the
4529 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004530 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004531 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4532 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004533 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004534 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004535 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004536 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004537 else
4538 Std->render(Args, CmdArgs);
4539
Nico Weber00721502014-12-23 22:32:37 +00004540 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004541 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004542 options::OPT_ftrigraphs,
4543 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004544 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004545 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004546 } else {
4547 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004548 //
4549 // FIXME: Clang doesn't correctly handle -std= when the input language
4550 // doesn't match. For the time being just ignore this for C++ inputs;
4551 // eventually we want to do all the standard defaulting here instead of
4552 // splitting it between the driver and clang -cc1.
4553 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004554 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4555 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004556 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004557 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004558
Nico Weber00721502014-12-23 22:32:37 +00004559 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4560 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004561 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004562
Richard Smith282b4492013-09-04 22:50:31 +00004563 // GCC's behavior for -Wwrite-strings is a bit strange:
4564 // * In C, this "warning flag" changes the types of string literals from
4565 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4566 // for the discarded qualifier.
4567 // * In C++, this is just a normal warning flag.
4568 //
4569 // Implementing this warning correctly in C is hard, so we follow GCC's
4570 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4571 // a non-const char* in C, rather than using this crude hack.
4572 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004573 // FIXME: This should behave just like a warning flag, and thus should also
4574 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4575 Arg *WriteStrings =
4576 Args.getLastArg(options::OPT_Wwrite_strings,
4577 options::OPT_Wno_write_strings, options::OPT_w);
4578 if (WriteStrings &&
4579 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004580 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004581 }
4582
Chandler Carruth61fbf622011-04-23 09:27:53 +00004583 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004584 // during C++ compilation, which it is by default. GCC keeps this define even
4585 // in the presence of '-w', match this behavior bug-for-bug.
4586 if (types::isCXX(InputType) &&
4587 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4588 true)) {
4589 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004590 }
4591
Chandler Carruthe0391482010-05-22 02:21:53 +00004592 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4593 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4594 if (Asm->getOption().matches(options::OPT_fasm))
4595 CmdArgs.push_back("-fgnu-keywords");
4596 else
4597 CmdArgs.push_back("-fno-gnu-keywords");
4598 }
4599
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004600 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4601 CmdArgs.push_back("-fno-dwarf-directory-asm");
4602
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004603 if (ShouldDisableAutolink(Args, getToolChain()))
4604 CmdArgs.push_back("-fno-autolink");
4605
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004606 // Add in -fdebug-compilation-dir if necessary.
4607 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004608
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004609 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4610 StringRef Map = A->getValue();
4611 if (Map.find('=') == StringRef::npos)
4612 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4613 else
4614 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4615 A->claim();
4616 }
4617
Richard Smith9a568822011-11-21 19:36:32 +00004618 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4619 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004620 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004621 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004622 }
4623
Richard Smith79c927b2013-11-06 19:31:51 +00004624 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4625 CmdArgs.push_back("-foperator-arrow-depth");
4626 CmdArgs.push_back(A->getValue());
4627 }
4628
Richard Smith9a568822011-11-21 19:36:32 +00004629 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4630 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004631 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004632 }
4633
Richard Smitha3d3bd22013-05-08 02:12:03 +00004634 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4635 CmdArgs.push_back("-fconstexpr-steps");
4636 CmdArgs.push_back(A->getValue());
4637 }
4638
Richard Smithb3a14522013-02-22 01:59:51 +00004639 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4640 CmdArgs.push_back("-fbracket-depth");
4641 CmdArgs.push_back(A->getValue());
4642 }
4643
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004644 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4645 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004646 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004647 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004648 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4649 } else
4650 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004651 }
4652
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004653 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004654 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004655
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004656 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4657 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004658 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004659 }
David Chisnall5778fce2009-08-31 16:41:57 +00004660
Chris Lattnere23003d2010-01-09 21:54:33 +00004661 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4662 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004663 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004664 }
4665
Chris Lattnerb35583d2010-04-07 20:49:23 +00004666 CmdArgs.push_back("-ferror-limit");
4667 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004668 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004669 else
4670 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004671
Chandler Carrutha77a7272010-05-06 04:55:18 +00004672 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4673 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004674 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004675 }
4676
4677 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4678 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004679 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004680 }
4681
Richard Smithf6f003a2011-12-16 19:06:07 +00004682 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4683 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004684 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004685 }
4686
Nick Lewycky24653262014-12-16 21:39:02 +00004687 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4688 CmdArgs.push_back("-fspell-checking-limit");
4689 CmdArgs.push_back(A->getValue());
4690 }
4691
Daniel Dunbar2c978472009-11-04 06:24:47 +00004692 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004693 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004694 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004695 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004696 } else {
4697 // If -fmessage-length=N was not specified, determine whether this is a
4698 // terminal and, if so, implicitly define -fmessage-length appropriately.
4699 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004700 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004701 }
4702
John McCallb4a99d32013-02-19 01:57:35 +00004703 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4704 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4705 options::OPT_fvisibility_ms_compat)) {
4706 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4707 CmdArgs.push_back("-fvisibility");
4708 CmdArgs.push_back(A->getValue());
4709 } else {
4710 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4711 CmdArgs.push_back("-fvisibility");
4712 CmdArgs.push_back("hidden");
4713 CmdArgs.push_back("-ftype-visibility");
4714 CmdArgs.push_back("default");
4715 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004716 }
4717
Douglas Gregor08329632010-06-15 17:05:35 +00004718 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004719
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004720 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4721
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004722 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004723 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4724 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004725 CmdArgs.push_back("-ffreestanding");
4726
Daniel Dunbare357d562009-12-03 18:42:11 +00004727 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004728 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004729 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004730 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004731 // Emulated TLS is enabled by default on Android, and can be enabled manually
4732 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004733 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004734 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4735 EmulatedTLSDefault))
4736 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004737 // AltiVec-like language extensions aren't relevant for assembling.
4738 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004739 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004740 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4741 }
Richard Trieu91844232012-06-26 18:18:47 +00004742 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4743 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004744
Alexey Bataevdb390212015-05-20 04:24:19 +00004745 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004746 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4747 options::OPT_fno_openmp, false))
4748 switch (getOpenMPRuntime(getToolChain(), Args)) {
4749 case OMPRT_OMP:
4750 case OMPRT_IOMP5:
4751 // Clang can generate useful OpenMP code for these two runtime libraries.
4752 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004753
4754 // If no option regarding the use of TLS in OpenMP codegeneration is
4755 // given, decide a default based on the target. Otherwise rely on the
4756 // options and pass the right information to the frontend.
4757 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004758 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004759 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004760 break;
4761 default:
4762 // By default, if Clang doesn't know how to generate useful OpenMP code
4763 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4764 // down to the actual compilation.
4765 // FIXME: It would be better to have a mode which *only* omits IR
4766 // generation based on the OpenMP support so that we get consistent
4767 // semantic analysis, etc.
4768 break;
4769 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004770
Peter Collingbourne32701642013-11-01 18:16:25 +00004771 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004772 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004773
Eric Christopher459d2712013-02-19 06:16:53 +00004774 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004775 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4776 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4777 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4778 Arch == llvm::Triple::ppc64le))
4779 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4780 << "ppc/ppc64/ppc64le";
4781 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004782
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004783 // -fzvector is incompatible with -faltivec.
4784 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4785 if (Args.hasArg(options::OPT_faltivec))
4786 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4787 << "-faltivec";
4788
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004789 if (getToolChain().SupportsProfiling())
4790 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004791
4792 // -flax-vector-conversions is default.
4793 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4794 options::OPT_fno_lax_vector_conversions))
4795 CmdArgs.push_back("-fno-lax-vector-conversions");
4796
John Brawna7b4ec02015-08-10 11:11:28 +00004797 if (Args.getLastArg(options::OPT_fapple_kext) ||
4798 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004799 CmdArgs.push_back("-fapple-kext");
4800
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004801 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004802 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004803 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004804 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4805 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004806
4807 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4808 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004809 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004810 }
4811
Bob Wilson14adb362012-02-03 06:27:22 +00004812 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004813
Chandler Carruth6e501032011-03-27 00:04:55 +00004814 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4815 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004816 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004817 if (A->getOption().matches(options::OPT_fwrapv))
4818 CmdArgs.push_back("-fwrapv");
4819 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4820 options::OPT_fno_strict_overflow)) {
4821 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4822 CmdArgs.push_back("-fwrapv");
4823 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004824
4825 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4826 options::OPT_fno_reroll_loops))
4827 if (A->getOption().matches(options::OPT_freroll_loops))
4828 CmdArgs.push_back("-freroll-loops");
4829
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004830 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004831 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4832 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004833
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004834 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4835
Daniel Dunbar4930e332009-11-17 08:07:36 +00004836 // -stack-protector=0 is default.
4837 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004838 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4839 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4840 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4841 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4842 Args.ClaimAllArgs(options::OPT_fstack_protector);
4843 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004844 options::OPT_fstack_protector_all,
4845 options::OPT_fstack_protector_strong,
4846 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004847 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004848 StackProtectorLevel = std::max<unsigned>(
4849 LangOptions::SSPOn,
4850 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004851 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004852 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004853 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004854 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004855 } else {
4856 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004857 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004858 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004859 if (StackProtectorLevel) {
4860 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004861 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004862 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004863
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004864 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004865 for (const Arg *A : Args.filtered(options::OPT__param)) {
4866 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004867 if (Str.startswith("ssp-buffer-size=")) {
4868 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004869 CmdArgs.push_back("-stack-protector-buffer-size");
4870 // FIXME: Verify the argument is a valid integer.
4871 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004872 }
Sean Silva14facf32015-06-09 01:57:17 +00004873 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004874 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004875 }
4876
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004877 // Translate -mstackrealign
4878 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004879 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004880 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004881
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004882 if (Args.hasArg(options::OPT_mstack_alignment)) {
4883 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4884 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004885 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004886
Hans Wennborg77dc2362015-01-20 19:45:50 +00004887 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4888 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4889
4890 if (!Size.empty())
4891 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4892 else
4893 CmdArgs.push_back("-mstack-probe-size=0");
4894 }
4895
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004896 switch (getToolChain().getArch()) {
4897 case llvm::Triple::aarch64:
4898 case llvm::Triple::aarch64_be:
4899 case llvm::Triple::arm:
4900 case llvm::Triple::armeb:
4901 case llvm::Triple::thumb:
4902 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004903 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004904 break;
4905
4906 default:
4907 break;
4908 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004909
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004910 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4911 options::OPT_mno_restrict_it)) {
4912 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4913 CmdArgs.push_back("-backend-option");
4914 CmdArgs.push_back("-arm-restrict-it");
4915 } else {
4916 CmdArgs.push_back("-backend-option");
4917 CmdArgs.push_back("-arm-no-restrict-it");
4918 }
James Y Knight2db38f32015-08-15 03:45:25 +00004919 } else if (Triple.isOSWindows() &&
4920 (Triple.getArch() == llvm::Triple::arm ||
4921 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004922 // Windows on ARM expects restricted IT blocks
4923 CmdArgs.push_back("-backend-option");
4924 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004925 }
4926
Daniel Dunbard18049a2009-04-07 21:16:11 +00004927 // Forward -f options with positive and negative forms; we translate
4928 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004929 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4930 StringRef fname = A->getValue();
4931 if (!llvm::sys::fs::exists(fname))
4932 D.Diag(diag::err_drv_no_such_file) << fname;
4933 else
4934 A->render(Args, CmdArgs);
4935 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004936
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004937 // -fbuiltin is default unless -mkernel is used.
4938 bool UseBuiltins =
4939 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4940 !Args.hasArg(options::OPT_mkernel));
4941 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004942 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004943
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004944 // -ffreestanding implies -fno-builtin.
4945 if (Args.hasArg(options::OPT_ffreestanding))
4946 UseBuiltins = false;
4947
4948 // Process the -fno-builtin-* options.
4949 for (const auto &Arg : Args) {
4950 const Option &O = Arg->getOption();
4951 if (!O.matches(options::OPT_fno_builtin_))
4952 continue;
4953
4954 Arg->claim();
4955 // If -fno-builtin is specified, then there's no need to pass the option to
4956 // the frontend.
4957 if (!UseBuiltins)
4958 continue;
4959
4960 StringRef FuncName = Arg->getValue();
4961 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4962 }
4963
Nuno Lopes13c88c72009-12-16 16:59:22 +00004964 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4965 options::OPT_fno_assume_sane_operator_new))
4966 CmdArgs.push_back("-fno-assume-sane-operator-new");
4967
Daniel Dunbar4930e332009-11-17 08:07:36 +00004968 // -fblocks=0 is default.
4969 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004970 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004971 (Args.hasArg(options::OPT_fgnu_runtime) &&
4972 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4973 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004974 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004976 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004977 !getToolChain().hasBlocksRuntime())
4978 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004979 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004980
Richard Smith47972af2015-06-16 00:08:24 +00004981 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004982 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004983 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004984 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004985 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004986 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4987 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004988 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004989 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004990 HaveModules = true;
4991 }
4992 }
4993
Richard Smith47972af2015-06-16 00:08:24 +00004994 // -fmodule-maps enables implicit reading of module map files. By default,
4995 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004996 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4997 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004998 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004999 }
5000
Daniel Jasperac42b752013-10-21 06:34:34 +00005001 // -fmodules-decluse checks that modules used are declared so (off by
5002 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005003 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005004 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005005 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005006 }
5007
Daniel Jasper962b38e2014-04-11 11:47:45 +00005008 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5009 // all #included headers are part of modules.
5010 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005011 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005012 CmdArgs.push_back("-fmodules-strict-decluse");
5013 }
5014
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005015 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5016 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5017 options::OPT_fno_implicit_modules)) {
5018 CmdArgs.push_back("-fno-implicit-modules");
5019 }
5020
Daniel Jasperac42b752013-10-21 06:34:34 +00005021 // -fmodule-name specifies the module that is currently being built (or
5022 // used for header checking by -fmodule-maps).
Richard Smith7e82e012016-02-19 22:25:36 +00005023 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
Daniel Jasperac42b752013-10-21 06:34:34 +00005024
Richard Smith9887d792014-10-17 01:42:53 +00005025 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00005026 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00005027 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00005028
Richard Smithe842a472014-10-22 02:05:46 +00005029 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00005030 if (HaveModules)
5031 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5032 else
5033 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00005034
5035 // -fmodule-cache-path specifies where our implicitly-built module files
5036 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00005037 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00005038 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00005039 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005040 if (HaveModules) {
5041 if (C.isForDiagnostics()) {
5042 // When generating crash reports, we want to emit the modules along with
5043 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005044 Path = Output.getFilename();
5045 llvm::sys::path::replace_extension(Path, ".cache");
5046 llvm::sys::path::append(Path, "modules");
5047 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005048 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005049 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005050 llvm::sys::path::append(Path, "org.llvm.clang.");
5051 appendUserToPath(Path);
5052 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005053 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005054 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005055 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5056 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005057 }
5058
5059 // When building modules and generating crashdumps, we need to dump a module
5060 // dependency VFS alongside the output.
5061 if (HaveModules && C.isForDiagnostics()) {
5062 SmallString<128> VFSDir(Output.getFilename());
5063 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005064 // Add the cache directory as a temp so the crash diagnostics pick it up.
5065 C.addTempFile(Args.MakeArgString(VFSDir));
5066
Justin Bognera88f0122014-06-20 22:59:50 +00005067 llvm::sys::path::append(VFSDir, "vfs");
5068 CmdArgs.push_back("-module-dependency-dir");
5069 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005070 }
5071
Richard Smith9887d792014-10-17 01:42:53 +00005072 if (HaveModules)
5073 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005074
Douglas Gregor35b04d62013-02-07 19:01:24 +00005075 // Pass through all -fmodules-ignore-macro arguments.
5076 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005077 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5078 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005079
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005080 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5081
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005082 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5083 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5084 D.Diag(diag::err_drv_argument_not_allowed_with)
5085 << A->getAsString(Args) << "-fbuild-session-timestamp";
5086
5087 llvm::sys::fs::file_status Status;
5088 if (llvm::sys::fs::status(A->getValue(), Status))
5089 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005090 CmdArgs.push_back(Args.MakeArgString(
5091 "-fbuild-session-timestamp=" +
5092 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005093 }
5094
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005095 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005096 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5097 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005098 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5099
5100 Args.AddLastArg(CmdArgs,
5101 options::OPT_fmodules_validate_once_per_build_session);
5102 }
5103
Ben Langmuirdcf73862014-03-12 00:06:17 +00005104 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5105
John McCalldfea9982010-04-09 19:12:06 +00005106 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005107 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005108 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005109 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005110
Anders Carlssond470fef2010-11-21 00:09:52 +00005111 // -felide-constructors is the default.
5112 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005113 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005114 CmdArgs.push_back("-fno-elide-constructors");
5115
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005116 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005117
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005118 if (KernelOrKext || (types::isCXX(InputType) &&
5119 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5120 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005121 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005122
Tony Linthicum76329bf2011-12-12 21:14:55 +00005123 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005124 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5125 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005126 CmdArgs.push_back("-fshort-enums");
5127
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005128 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005129 if (Arg *A = Args.getLastArg(
5130 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5131 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5132 if (A->getOption().matches(options::OPT_funsigned_char) ||
5133 A->getOption().matches(options::OPT_fno_signed_char)) {
5134 CmdArgs.push_back("-fno-signed-char");
5135 }
5136 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005137 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005138 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005139
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005140 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005141 if (!Args.hasFlag(
5142 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5143 !IsWindowsCygnus && !IsWindowsGNU &&
5144 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5145 getToolChain().getArch() != llvm::Triple::hexagon &&
5146 getToolChain().getArch() != llvm::Triple::xcore &&
5147 ((getToolChain().getTriple().getVendor() !=
5148 llvm::Triple::MipsTechnologies) ||
5149 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005150 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005151 CmdArgs.push_back("-fno-use-cxa-atexit");
5152
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005153 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005154 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005155 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005156 CmdArgs.push_back("-fms-extensions");
5157
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005158 // -fno-use-line-directives is default.
5159 if (Args.hasFlag(options::OPT_fuse_line_directives,
5160 options::OPT_fno_use_line_directives, false))
5161 CmdArgs.push_back("-fuse-line-directives");
5162
Francois Pichet1b4f1632011-09-17 04:32:15 +00005163 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005165 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005166 (IsWindowsMSVC &&
5167 Args.hasFlag(options::OPT_fms_extensions,
5168 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005169 CmdArgs.push_back("-fms-compatibility");
5170
David Majnemerc371ff02015-03-22 08:39:22 +00005171 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005172 VersionTuple MSVT = visualstudio::getMSVCVersion(
5173 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5174 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005175 CmdArgs.push_back(
5176 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005177
David Majnemer8db91762015-05-18 04:49:30 +00005178 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5179 if (ImplyVCPPCXXVer) {
5180 if (IsMSVC2015Compatible)
5181 CmdArgs.push_back("-std=c++14");
5182 else
5183 CmdArgs.push_back("-std=c++11");
5184 }
5185
Eric Christopher5ecce122013-02-18 00:38:31 +00005186 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005187 if (Args.hasFlag(options::OPT_fborland_extensions,
5188 options::OPT_fno_borland_extensions, false))
5189 CmdArgs.push_back("-fborland-extensions");
5190
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005191 // -fno-declspec is default, except for PS4.
5192 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5193 getToolChain().getTriple().isPS4()))
5194 CmdArgs.push_back("-fdeclspec");
5195 else if (Args.hasArg(options::OPT_fno_declspec))
5196 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5197
David Majnemerc371ff02015-03-22 08:39:22 +00005198 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5199 // than 19.
5200 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5201 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005202 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005203 CmdArgs.push_back("-fno-threadsafe-statics");
5204
Francois Pichet02744872011-09-01 16:38:08 +00005205 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5206 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005207 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005208 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005209 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005210
Chandler Carruthe03aa552010-04-17 20:17:31 +00005211 // -fgnu-keywords default varies depending on language; only pass if
5212 // specified.
5213 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005214 options::OPT_fno_gnu_keywords))
5215 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005216
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005217 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005218 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005219 CmdArgs.push_back("-fgnu89-inline");
5220
Chad Rosier9c76d242012-03-15 22:31:42 +00005221 if (Args.hasArg(options::OPT_fno_inline))
5222 CmdArgs.push_back("-fno-inline");
5223
Chad Rosier64d6be92012-03-06 21:17:19 +00005224 if (Args.hasArg(options::OPT_fno_inline_functions))
5225 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005226
John McCall5fb5df92012-06-20 06:18:46 +00005227 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005228
John McCall5fb5df92012-06-20 06:18:46 +00005229 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005230 // legacy is the default. Except for deployment taget of 10.5,
5231 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5232 // gets ignored silently.
5233 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005234 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5235 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005236 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005237 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005238 if (getToolChain().UseObjCMixedDispatch())
5239 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5240 else
5241 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5242 }
5243 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005244
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005245 // When ObjectiveC legacy runtime is in effect on MacOSX,
5246 // turn on the option to do Array/Dictionary subscripting
5247 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005248 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005249 getToolChain().getTriple().isMacOSX() &&
5250 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5251 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005252 objcRuntime.isNeXTFamily())
5253 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005254
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005255 // -fencode-extended-block-signature=1 is default.
5256 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5257 CmdArgs.push_back("-fencode-extended-block-signature");
5258 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005259
John McCall24fc0de2011-07-06 00:26:06 +00005260 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5261 // NOTE: This logic is duplicated in ToolChains.cpp.
5262 bool ARC = isObjCAutoRefCount(Args);
5263 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005264 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005265
John McCall24fc0de2011-07-06 00:26:06 +00005266 CmdArgs.push_back("-fobjc-arc");
5267
Chandler Carruth491db322011-11-04 07:34:47 +00005268 // FIXME: It seems like this entire block, and several around it should be
5269 // wrapped in isObjC, but for now we just use it here as this is where it
5270 // was being used previously.
5271 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5272 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5273 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5274 else
5275 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5276 }
5277
John McCall24fc0de2011-07-06 00:26:06 +00005278 // Allow the user to enable full exceptions code emission.
5279 // We define off for Objective-CC, on for Objective-C++.
5280 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5281 options::OPT_fno_objc_arc_exceptions,
5282 /*default*/ types::isCXX(InputType)))
5283 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005284
John McCall24fc0de2011-07-06 00:26:06 +00005285 }
5286
5287 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5288 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005289 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005290 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005291
John McCall24fc0de2011-07-06 00:26:06 +00005292 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5293 // takes precedence.
5294 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5295 if (!GCArg)
5296 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5297 if (GCArg) {
5298 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005299 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005300 } else if (getToolChain().SupportsObjCGC()) {
5301 GCArg->render(Args, CmdArgs);
5302 } else {
5303 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005304 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005305 }
5306 }
5307
John McCallfbe5ed72015-11-05 19:19:56 +00005308 // Pass down -fobjc-weak or -fno-objc-weak if present.
5309 if (types::isObjC(InputType)) {
5310 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5311 options::OPT_fno_objc_weak);
5312 if (!WeakArg) {
5313 // nothing to do
5314 } else if (GCArg) {
5315 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5316 D.Diag(diag::err_objc_weak_with_gc);
5317 } else if (!objcRuntime.allowsWeak()) {
5318 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5319 D.Diag(diag::err_objc_weak_unsupported);
5320 } else {
5321 WeakArg->render(Args, CmdArgs);
5322 }
5323 }
5324
Bob Wilsonb111ec92015-03-02 19:01:14 +00005325 if (Args.hasFlag(options::OPT_fapplication_extension,
5326 options::OPT_fno_application_extension, false))
5327 CmdArgs.push_back("-fapplication-extension");
5328
Reid Klecknerc542d372014-06-27 17:02:02 +00005329 // Handle GCC-style exception args.
5330 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005331 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5332 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005333
Tim Northovere931f9f2015-10-30 16:30:41 +00005334 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005335 CmdArgs.push_back("-fsjlj-exceptions");
5336
5337 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005338 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5339 options::OPT_fno_assume_sane_operator_new))
5340 CmdArgs.push_back("-fno-assume-sane-operator-new");
5341
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005342 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5343 // most platforms.
5344 if (Args.hasFlag(options::OPT_fsized_deallocation,
5345 options::OPT_fno_sized_deallocation, false))
5346 CmdArgs.push_back("-fsized-deallocation");
5347
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005348 // -fconstant-cfstrings is default, and may be subject to argument translation
5349 // on Darwin.
5350 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5351 options::OPT_fno_constant_cfstrings) ||
5352 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5353 options::OPT_mno_constant_cfstrings))
5354 CmdArgs.push_back("-fno-constant-cfstrings");
5355
John Thompsoned4e2952009-11-05 20:14:16 +00005356 // -fshort-wchar default varies depending on platform; only
5357 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005358 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5359 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005360 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005361
Hans Wennborg28c96312013-07-31 23:39:13 +00005362 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005363 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005365 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005366
Daniel Dunbar096ed292011-10-05 21:04:55 +00005367 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5368 // -fno-pack-struct doesn't apply to -fpack-struct=.
5369 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005370 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005371 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005372 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005373 } else if (Args.hasFlag(options::OPT_fpack_struct,
5374 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005375 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005376 }
5377
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005378 // Handle -fmax-type-align=N and -fno-type-align
5379 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5380 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5381 if (!SkipMaxTypeAlign) {
5382 std::string MaxTypeAlignStr = "-fmax-type-align=";
5383 MaxTypeAlignStr += A->getValue();
5384 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5385 }
5386 } else if (getToolChain().getTriple().isOSDarwin()) {
5387 if (!SkipMaxTypeAlign) {
5388 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5389 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5390 }
5391 }
5392
John Brawna7b4ec02015-08-10 11:11:28 +00005393 // -fcommon is the default unless compiling kernel code or the target says so
5394 bool NoCommonDefault =
5395 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5396 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5397 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005398 CmdArgs.push_back("-fno-common");
5399
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005400 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005401 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005402 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005403 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005404 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005405 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005406
Daniel Dunbar6358d682010-10-15 22:30:42 +00005407 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005408 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005409 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005410 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005411
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005412 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005413 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5414 StringRef value = inputCharset->getValue();
5415 if (value != "UTF-8")
5416 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5417 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005418 }
5419
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005420 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005421 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5422 StringRef value = execCharset->getValue();
5423 if (value != "UTF-8")
5424 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5425 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005426 }
5427
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005428 // -fcaret-diagnostics is default.
5429 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5430 options::OPT_fno_caret_diagnostics, true))
5431 CmdArgs.push_back("-fno-caret-diagnostics");
5432
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005433 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005434 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005435 options::OPT_fno_diagnostics_fixit_info))
5436 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005437
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005438 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005439 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005440 options::OPT_fno_diagnostics_show_option))
5441 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005442
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005443 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005444 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005445 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005446 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005447 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005449 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005450 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005451 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005452 }
5453
Chandler Carruthb6766f02011-03-27 01:50:55 +00005454 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005455 options::OPT_fdiagnostics_show_note_include_stack,
5456 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005457 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005458 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005459 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5460 else
5461 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5462 }
5463
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005464 // Color diagnostics are the default, unless the terminal doesn't support
5465 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005466 // Support both clang's -f[no-]color-diagnostics and gcc's
5467 // -f[no-]diagnostics-colors[=never|always|auto].
5468 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005469 for (const auto &Arg : Args) {
5470 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005471 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5472 !O.matches(options::OPT_fdiagnostics_color) &&
5473 !O.matches(options::OPT_fno_color_diagnostics) &&
5474 !O.matches(options::OPT_fno_diagnostics_color) &&
5475 !O.matches(options::OPT_fdiagnostics_color_EQ))
5476 continue;
5477
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005478 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005479 if (O.matches(options::OPT_fcolor_diagnostics) ||
5480 O.matches(options::OPT_fdiagnostics_color)) {
5481 ShowColors = Colors_On;
5482 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5483 O.matches(options::OPT_fno_diagnostics_color)) {
5484 ShowColors = Colors_Off;
5485 } else {
5486 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005487 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005488 if (value == "always")
5489 ShowColors = Colors_On;
5490 else if (value == "never")
5491 ShowColors = Colors_Off;
5492 else if (value == "auto")
5493 ShowColors = Colors_Auto;
5494 else
5495 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005496 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005497 }
5498 }
5499 if (ShowColors == Colors_On ||
5500 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005501 CmdArgs.push_back("-fcolor-diagnostics");
5502
Nico Rieck7857d462013-09-11 00:38:02 +00005503 if (Args.hasArg(options::OPT_fansi_escape_codes))
5504 CmdArgs.push_back("-fansi-escape-codes");
5505
Daniel Dunbardb097022009-06-08 21:13:54 +00005506 if (!Args.hasFlag(options::OPT_fshow_source_location,
5507 options::OPT_fno_show_source_location))
5508 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005509
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005510 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005511 true))
5512 CmdArgs.push_back("-fno-show-column");
5513
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005514 if (!Args.hasFlag(options::OPT_fspell_checking,
5515 options::OPT_fno_spell_checking))
5516 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005517
Chad Rosierc8e56e82012-12-05 21:08:21 +00005518 // -fno-asm-blocks is default.
5519 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5520 false))
5521 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005522
Steven Wucb0d13f2015-01-16 23:05:28 +00005523 // -fgnu-inline-asm is default.
5524 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5525 options::OPT_fno_gnu_inline_asm, true))
5526 CmdArgs.push_back("-fno-gnu-inline-asm");
5527
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005528 // Enable vectorization per default according to the optimization level
5529 // selected. For optimization levels that want vectorization we use the alias
5530 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005531 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005532 OptSpecifier VectorizeAliasOption =
5533 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005534 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005535 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005536 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005537
Chad Rosier136d67d2014-04-28 19:30:57 +00005538 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005539 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005540 OptSpecifier SLPVectAliasOption =
5541 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005542 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005543 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005544 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005545
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005546 // -fno-slp-vectorize-aggressive is default.
5547 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005548 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005549 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005550
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005551 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5552 A->render(Args, CmdArgs);
5553
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005554 // -fdollars-in-identifiers default varies depending on platform and
5555 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005556 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005557 options::OPT_fno_dollars_in_identifiers)) {
5558 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005559 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005560 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005561 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005562 }
5563
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005564 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5565 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005566 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005567 options::OPT_fno_unit_at_a_time)) {
5568 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005569 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005570 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005571
Eli Friedman055c9702011-11-02 01:53:16 +00005572 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5573 options::OPT_fno_apple_pragma_pack, false))
5574 CmdArgs.push_back("-fapple-pragma-pack");
5575
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005576 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005577 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5578 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005579 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005580 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005581 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005582
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005583// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5584//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005585// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005586#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005587 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005588 (getToolChain().getArch() == llvm::Triple::arm ||
5589 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005590 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5591 CmdArgs.push_back("-fno-builtin-strcat");
5592 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5593 CmdArgs.push_back("-fno-builtin-strcpy");
5594 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005595#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005596
Justin Bognera88f0122014-06-20 22:59:50 +00005597 // Enable rewrite includes if the user's asked for it or if we're generating
5598 // diagnostics.
5599 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5600 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005601 if (Args.hasFlag(options::OPT_frewrite_includes,
5602 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005603 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005604 CmdArgs.push_back("-frewrite-includes");
5605
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005606 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005607 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005608 options::OPT_traditional_cpp)) {
5609 if (isa<PreprocessJobAction>(JA))
5610 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005611 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005612 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005613 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005614
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005615 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005616 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005617
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005618 // Handle serialized diagnostics.
5619 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5620 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005621 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005622 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005623
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005624 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5625 CmdArgs.push_back("-fretain-comments-from-system-headers");
5626
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005627 // Forward -fcomment-block-commands to -cc1.
5628 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005629 // Forward -fparse-all-comments to -cc1.
5630 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005631
John Brawnad31ace2015-09-23 13:55:40 +00005632 // Turn -fplugin=name.so into -load name.so
5633 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5634 CmdArgs.push_back("-load");
5635 CmdArgs.push_back(A->getValue());
5636 A->claim();
5637 }
5638
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005639 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5640 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005641 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005642 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5643 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005644
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005645 // We translate this by hand to the -cc1 argument, since nightly test uses
5646 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005647 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005648 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005649 } else
Sean Silva14facf32015-06-09 01:57:17 +00005650 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005651 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005652
Bob Wilson23a55f12014-12-21 07:00:00 +00005653 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005654 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5655 // by the frontend.
5656 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5657 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005658
Daniel Dunbard67a3222009-03-30 06:36:42 +00005659 if (Output.getType() == types::TY_Dependencies) {
5660 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005661 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005662 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005663 CmdArgs.push_back(Output.getFilename());
5664 } else {
5665 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005666 }
5667
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005668 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005669
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005670 if (Input.isFilename())
5671 CmdArgs.push_back(Input.getFilename());
5672 else
5673 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005674
Chris Lattnere9d7d782009-11-03 19:50:27 +00005675 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5676
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005677 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005678
5679 // Optionally embed the -cc1 level arguments into the debug info, for build
5680 // analysis.
5681 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005682 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005683 for (const auto &Arg : Args)
5684 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005685
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005686 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005687 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005688 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005689 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005690 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005691 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005692 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005693 }
5694 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005695 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005696 }
5697
Eric Christopherd3804002013-02-22 20:12:52 +00005698 // Add the split debug info name to the command lines here so we
5699 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005700 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005701 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5702 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005703 const char *SplitDwarfOut;
5704 if (SplitDwarf) {
5705 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005706 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005707 CmdArgs.push_back(SplitDwarfOut);
5708 }
5709
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005710 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5711 // Include them with -fcuda-include-gpubinary.
5712 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005713 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005714 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005715 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005716 }
5717
Eric Christopherd3804002013-02-22 20:12:52 +00005718 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005719 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005720 Output.getType() == types::TY_Object &&
5721 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005722 auto CLCommand =
5723 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005724 C.addCommand(llvm::make_unique<FallbackCommand>(
5725 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005726 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5727 isa<PrecompileJobAction>(JA)) {
5728 // In /fallback builds, run the main compilation even if the pch generation
5729 // fails, so that the main compilation's fallback to cl.exe runs.
5730 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5731 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005732 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005733 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005734 }
5735
Eric Christopherf1545832013-02-22 23:50:16 +00005736 // Handle the debug info splitting at object creation time if we're
5737 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005738 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005739 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005740 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005741
Roman Divacky178e01602011-02-10 16:52:03 +00005742 if (Arg *A = Args.getLastArg(options::OPT_pg))
5743 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005744 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5745 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005746
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005747 // Claim some arguments which clang supports automatically.
5748
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005749 // -fpch-preprocess is used with gcc to add a special marker in the output to
5750 // include the PCH file. Clang's PTH solution is completely transparent, so we
5751 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005752 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005753
Daniel Dunbar17731772009-03-23 19:03:36 +00005754 // Claim some arguments which clang doesn't support, but we don't
5755 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005756 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5757 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005758
Rafael Espindolab0092d72013-09-04 19:37:35 +00005759 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005760 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005761}
5762
John McCall5fb5df92012-06-20 06:18:46 +00005763/// Add options related to the Objective-C runtime/ABI.
5764///
5765/// Returns true if the runtime is non-fragile.
5766ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5767 ArgStringList &cmdArgs,
5768 RewriteKind rewriteKind) const {
5769 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005770 Arg *runtimeArg =
5771 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5772 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005773
5774 // Just forward -fobjc-runtime= to the frontend. This supercedes
5775 // options about fragility.
5776 if (runtimeArg &&
5777 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5778 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005779 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005780 if (runtime.tryParse(value)) {
5781 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005782 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005783 }
5784
5785 runtimeArg->render(args, cmdArgs);
5786 return runtime;
5787 }
5788
5789 // Otherwise, we'll need the ABI "version". Version numbers are
5790 // slightly confusing for historical reasons:
5791 // 1 - Traditional "fragile" ABI
5792 // 2 - Non-fragile ABI, version 1
5793 // 3 - Non-fragile ABI, version 2
5794 unsigned objcABIVersion = 1;
5795 // If -fobjc-abi-version= is present, use that to set the version.
5796 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005797 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005798 if (value == "1")
5799 objcABIVersion = 1;
5800 else if (value == "2")
5801 objcABIVersion = 2;
5802 else if (value == "3")
5803 objcABIVersion = 3;
5804 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005805 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005806 } else {
5807 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005808 bool nonFragileABIIsDefault =
5809 (rewriteKind == RK_NonFragile ||
5810 (rewriteKind == RK_None &&
5811 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005812 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5813 options::OPT_fno_objc_nonfragile_abi,
5814 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005815// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005816#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5817 unsigned nonFragileABIVersion = 1;
5818#else
5819 unsigned nonFragileABIVersion = 2;
5820#endif
5821
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005822 if (Arg *abiArg =
5823 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005824 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005825 if (value == "1")
5826 nonFragileABIVersion = 1;
5827 else if (value == "2")
5828 nonFragileABIVersion = 2;
5829 else
5830 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005831 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005832 }
5833
5834 objcABIVersion = 1 + nonFragileABIVersion;
5835 } else {
5836 objcABIVersion = 1;
5837 }
5838 }
5839
5840 // We don't actually care about the ABI version other than whether
5841 // it's non-fragile.
5842 bool isNonFragile = objcABIVersion != 1;
5843
5844 // If we have no runtime argument, ask the toolchain for its default runtime.
5845 // However, the rewriter only really supports the Mac runtime, so assume that.
5846 ObjCRuntime runtime;
5847 if (!runtimeArg) {
5848 switch (rewriteKind) {
5849 case RK_None:
5850 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5851 break;
5852 case RK_Fragile:
5853 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5854 break;
5855 case RK_NonFragile:
5856 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5857 break;
5858 }
5859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005860 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005861 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5862 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005863 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005864 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5865
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005866 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005867 } else {
5868 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5869 }
5870
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005871 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005872 } else {
5873 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005874 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005875 // non-fragile mode or the GCC runtime in fragile mode.
5876 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005877 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005878 else
5879 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005880 }
5881
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005882 cmdArgs.push_back(
5883 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005884 return runtime;
5885}
5886
Reid Klecknerc542d372014-06-27 17:02:02 +00005887static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5888 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5889 I += HaveDash;
5890 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005891}
Reid Klecknerc542d372014-06-27 17:02:02 +00005892
Benjamin Kramere003ca22015-10-28 13:54:16 +00005893namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005894struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005895 bool Synch = false;
5896 bool Asynch = false;
5897 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005898};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005899} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005900
5901/// /EH controls whether to run destructor cleanups when exceptions are
5902/// thrown. There are three modifiers:
5903/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5904/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5905/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005906/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005907/// The default is /EHs-c-, meaning cleanups are disabled.
5908static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5909 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005910
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005911 std::vector<std::string> EHArgs =
5912 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005913 for (auto EHVal : EHArgs) {
5914 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5915 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005916 case 'a':
5917 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005918 if (EH.Asynch)
5919 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005920 continue;
5921 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005922 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005923 continue;
5924 case 's':
5925 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005926 if (EH.Synch)
5927 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005928 continue;
5929 default:
5930 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005931 }
5932 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5933 break;
5934 }
5935 }
David Majnemerb8809092016-02-20 09:23:44 +00005936 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005937 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005938 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005939 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5940 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005941 EH.Synch = true;
5942 EH.NoUnwindC = true;
5943 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005944
Reid Klecknerc542d372014-06-27 17:02:02 +00005945 return EH;
5946}
5947
David Majnemercd5855e2016-02-29 01:40:36 +00005948void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5949 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005950 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005951 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005952 unsigned RTOptionID = options::OPT__SLASH_MT;
5953
Hans Wennborgf1a74252013-09-10 20:18:04 +00005954 if (Args.hasArg(options::OPT__SLASH_LDd))
5955 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5956 // but defining _DEBUG is sticky.
5957 RTOptionID = options::OPT__SLASH_MTd;
5958
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005959 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005960 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005961
David Majnemere2afb472015-07-24 06:49:13 +00005962 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005963 switch (RTOptionID) {
5964 case options::OPT__SLASH_MD:
5965 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005966 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005967 CmdArgs.push_back("-D_MT");
5968 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005969 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005970 break;
5971 case options::OPT__SLASH_MDd:
5972 CmdArgs.push_back("-D_DEBUG");
5973 CmdArgs.push_back("-D_MT");
5974 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005975 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005976 break;
5977 case options::OPT__SLASH_MT:
5978 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005979 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005980 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005981 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005982 break;
5983 case options::OPT__SLASH_MTd:
5984 CmdArgs.push_back("-D_DEBUG");
5985 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005986 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005987 break;
5988 default:
5989 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005990 }
5991
David Majnemere2afb472015-07-24 06:49:13 +00005992 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5993 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5994 } else {
5995 CmdArgs.push_back(FlagForCRT.data());
5996
5997 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5998 // users want. The /Za flag to cl.exe turns this off, but it's not
5999 // implemented in clang.
6000 CmdArgs.push_back("--dependent-lib=oldnames");
6001 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006002
Hans Wennborg8858a032014-07-21 23:42:07 +00006003 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6004 // would produce interleaved output, so ignore /showIncludes in such cases.
6005 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6006 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6007 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006008
David Majnemerf6072342014-07-01 22:24:56 +00006009 // This controls whether or not we emit RTTI data for polymorphic types.
6010 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6011 /*default=*/false))
6012 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006013
Reid Kleckner124955a2015-08-05 18:51:13 +00006014 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006015 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006016 if (*EmitCodeView)
6017 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006018 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006019 CmdArgs.push_back("-gcodeview");
6020
Reid Klecknerc542d372014-06-27 17:02:02 +00006021 const Driver &D = getToolChain().getDriver();
6022 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006023 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006024 if (types::isCXX(InputType))
6025 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006026 CmdArgs.push_back("-fexceptions");
6027 }
David Majnemercd5855e2016-02-29 01:40:36 +00006028 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6029 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006030
Hans Wennborge50cec32014-06-13 20:59:54 +00006031 // /EP should expand to -E -P.
6032 if (Args.hasArg(options::OPT__SLASH_EP)) {
6033 CmdArgs.push_back("-E");
6034 CmdArgs.push_back("-P");
6035 }
6036
David Majnemera5b195a2015-02-14 01:35:12 +00006037 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006038 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6039 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006040 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6041 else
6042 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6043
6044 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6045 VolatileOptionID = A->getOption().getID();
6046
6047 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6048 CmdArgs.push_back("-fms-volatile");
6049
David Majnemer86c318f2014-02-11 21:05:00 +00006050 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6051 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6052 if (MostGeneralArg && BestCaseArg)
6053 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6054 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6055
6056 if (MostGeneralArg) {
6057 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6058 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6059 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6060
6061 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6062 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6063 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6064 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6065 << FirstConflict->getAsString(Args)
6066 << SecondConflict->getAsString(Args);
6067
6068 if (SingleArg)
6069 CmdArgs.push_back("-fms-memptr-rep=single");
6070 else if (MultipleArg)
6071 CmdArgs.push_back("-fms-memptr-rep=multiple");
6072 else
6073 CmdArgs.push_back("-fms-memptr-rep=virtual");
6074 }
6075
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006076 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6077 A->render(Args, CmdArgs);
6078
Hans Wennborg81f74482013-09-10 01:07:07 +00006079 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6080 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006081 if (Args.hasArg(options::OPT__SLASH_fallback))
6082 CmdArgs.push_back("msvc-fallback");
6083 else
6084 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006085 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006086}
6087
Douglas Katzman95354292015-06-23 20:42:09 +00006088visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006089 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006090 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006091 return CLFallback.get();
6092}
6093
Daniel Sanders7f933f42015-01-30 17:35:23 +00006094void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6095 ArgStringList &CmdArgs) const {
6096 StringRef CPUName;
6097 StringRef ABIName;
6098 const llvm::Triple &Triple = getToolChain().getTriple();
6099 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6100
6101 CmdArgs.push_back("-target-abi");
6102 CmdArgs.push_back(ABIName.data());
6103}
6104
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006105void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006106 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006107 const ArgList &Args,
6108 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006109 ArgStringList CmdArgs;
6110
6111 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6112 const InputInfo &Input = Inputs[0];
6113
James Y Knight2db38f32015-08-15 03:45:25 +00006114 std::string TripleStr =
6115 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6116 const llvm::Triple Triple(TripleStr);
6117
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006118 // Don't warn about "clang -w -c foo.s"
6119 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006120 // and "clang -emit-llvm -c foo.s"
6121 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006122
Rafael Espindola577637a2015-01-03 00:06:04 +00006123 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006124
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006125 // Invoke ourselves in -cc1as mode.
6126 //
6127 // FIXME: Implement custom jobs for internal actions.
6128 CmdArgs.push_back("-cc1as");
6129
6130 // Add the "effective" target triple.
6131 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006132 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6133
6134 // Set the output mode, we currently only expect to be used as a real
6135 // assembler.
6136 CmdArgs.push_back("-filetype");
6137 CmdArgs.push_back("obj");
6138
Eric Christopher45f2e712012-12-18 00:31:10 +00006139 // Set the main file name, so that debug info works even with
6140 // -save-temps or preprocessed assembly.
6141 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006142 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006143
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006144 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006145 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006146 if (!CPU.empty()) {
6147 CmdArgs.push_back("-target-cpu");
6148 CmdArgs.push_back(Args.MakeArgString(CPU));
6149 }
6150
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006151 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006152 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006153
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006154 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006155 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006156
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006157 // Pass along any -I options so we get proper .include search paths.
6158 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6159
Eric Christopherfc3ee562012-01-10 00:38:01 +00006160 // Determine the original source input.
6161 const Action *SourceAction = &JA;
6162 while (SourceAction->getKind() != Action::InputClass) {
6163 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6164 SourceAction = SourceAction->getInputs()[0];
6165 }
6166
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006167 // Forward -g and handle debug info related flags, assuming we are dealing
6168 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006169 if (SourceAction->getType() == types::TY_Asm ||
6170 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006171 bool WantDebug = false;
6172 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006173 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006174 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006175 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6176 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006177 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006178 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006179 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006180 if (DwarfVersion == 0)
6181 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006182 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006183 (WantDebug ? codegenoptions::LimitedDebugInfo
6184 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006185 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006186
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006187 // Add the -fdebug-compilation-dir flag if needed.
6188 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006189
6190 // Set the AT_producer to the clang version when using the integrated
6191 // assembler on assembly source files.
6192 CmdArgs.push_back("-dwarf-debug-producer");
6193 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006194
6195 // And pass along -I options
6196 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006197 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006198
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006199 // Handle -fPIC et al -- the relocation-model affects the assembler
6200 // for some targets.
6201 llvm::Reloc::Model RelocationModel;
6202 unsigned PICLevel;
6203 bool IsPIE;
6204 std::tie(RelocationModel, PICLevel, IsPIE) =
6205 ParsePICArgs(getToolChain(), Triple, Args);
6206
6207 const char *RMName = RelocationModelName(RelocationModel);
6208 if (RMName) {
6209 CmdArgs.push_back("-mrelocation-model");
6210 CmdArgs.push_back(RMName);
6211 }
6212
Kevin Enderby292dc082011-12-22 19:31:58 +00006213 // Optionally embed the -cc1as level arguments into the debug info, for build
6214 // analysis.
6215 if (getToolChain().UseDwarfDebugFlags()) {
6216 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006217 for (const auto &Arg : Args)
6218 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006219
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006220 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006221 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6222 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006223 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006224 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006225 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006226 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006227 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006228 }
6229 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006230 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006231 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006232
6233 // FIXME: Add -static support, once we have it.
6234
Daniel Sanders7f933f42015-01-30 17:35:23 +00006235 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006236 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006237 default:
6238 break;
6239
6240 case llvm::Triple::mips:
6241 case llvm::Triple::mipsel:
6242 case llvm::Triple::mips64:
6243 case llvm::Triple::mips64el:
6244 AddMIPSTargetArgs(Args, CmdArgs);
6245 break;
6246 }
6247
David Blaikie372d9502014-01-17 03:17:40 +00006248 // Consume all the warning flags. Usually this would be handled more
6249 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6250 // doesn't handle that so rather than warning about unused flags that are
6251 // actually used, we'll lie by omission instead.
6252 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006253 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006254
David Blaikie9260ed62013-07-25 21:19:01 +00006255 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6256 getToolChain().getDriver());
6257
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006258 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006259
6260 assert(Output.isFilename() && "Unexpected lipo output.");
6261 CmdArgs.push_back("-o");
6262 CmdArgs.push_back(Output.getFilename());
6263
Daniel Dunbarb440f562010-08-02 02:38:21 +00006264 assert(Input.isFilename() && "Invalid input.");
6265 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006266
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006267 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006268 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006269
6270 // Handle the debug info splitting at object creation time if we're
6271 // creating an object.
6272 // TODO: Currently only works on linux with newer objcopy.
6273 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006274 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006275 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006276 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006277}
6278
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006279void GnuTool::anchor() {}
6280
Daniel Dunbara3246a02009-03-18 08:07:30 +00006281void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006282 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006283 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006284 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006285 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006286 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006287
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006288 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006289 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006290 // It is unfortunate that we have to claim here, as this means
6291 // we will basically never report anything interesting for
6292 // platforms using a generic gcc, even if we are just using gcc
6293 // to get to the assembler.
6294 A->claim();
6295
Daniel Dunbar939c1212010-08-03 16:14:14 +00006296 // Don't forward any -g arguments to assembly steps.
6297 if (isa<AssembleJobAction>(JA) &&
6298 A->getOption().matches(options::OPT_g_Group))
6299 continue;
6300
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006301 // Don't forward any -W arguments to assembly and link steps.
6302 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6303 A->getOption().matches(options::OPT_W_Group))
6304 continue;
6305
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006306 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006307 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006308 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006309
Daniel Dunbar4e295052010-01-25 22:35:08 +00006310 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006311
6312 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006313 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006314 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006315 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006316 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006317 }
6318
Daniel Dunbar5716d872009-05-02 21:41:52 +00006319 // Try to force gcc to match the tool chain we want, if we recognize
6320 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006321 //
6322 // FIXME: The triple class should directly provide the information we want
6323 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006324 switch (getToolChain().getArch()) {
6325 default:
6326 break;
6327 case llvm::Triple::x86:
6328 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006329 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006330 break;
6331 case llvm::Triple::x86_64:
6332 case llvm::Triple::ppc64:
6333 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006334 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006335 break;
6336 case llvm::Triple::sparcel:
6337 CmdArgs.push_back("-EL");
6338 break;
6339 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006340
Daniel Dunbarb440f562010-08-02 02:38:21 +00006341 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006342 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006343 CmdArgs.push_back(Output.getFilename());
6344 } else {
6345 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006346 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006347 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006348
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006349 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006350
6351 // Only pass -x if gcc will understand it; otherwise hope gcc
6352 // understands the suffix correctly. The main use case this would go
6353 // wrong in is for linker inputs if they happened to have an odd
6354 // suffix; really the only way to get this to happen is a command
6355 // like '-x foobar a.c' which will treat a.c like a linker input.
6356 //
6357 // FIXME: For the linker case specifically, can we safely convert
6358 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006359 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006360 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006361 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006362 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006363 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006364 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006365 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006366 else if (II.getType() == types::TY_ModuleFile)
6367 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006368 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006369
Daniel Dunbara3246a02009-03-18 08:07:30 +00006370 if (types::canTypeBeUserSpecified(II.getType())) {
6371 CmdArgs.push_back("-x");
6372 CmdArgs.push_back(types::getTypeName(II.getType()));
6373 }
6374
Daniel Dunbarb440f562010-08-02 02:38:21 +00006375 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006376 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006377 else {
6378 const Arg &A = II.getInputArg();
6379
6380 // Reverse translate some rewritten options.
6381 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6382 CmdArgs.push_back("-lstdc++");
6383 continue;
6384 }
6385
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006386 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006387 A.render(Args, CmdArgs);
6388 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006389 }
6390
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006391 const std::string customGCCName = D.getCCCGenericGCCName();
6392 const char *GCCName;
6393 if (!customGCCName.empty())
6394 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006395 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006396 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006397 } else
6398 GCCName = "gcc";
6399
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006400 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006401 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006402}
6403
Douglas Katzman95354292015-06-23 20:42:09 +00006404void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6405 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006406 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006407}
6408
Douglas Katzman95354292015-06-23 20:42:09 +00006409void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6410 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006411 const Driver &D = getToolChain().getDriver();
6412
Eric Christophercc7ff502015-01-29 00:56:17 +00006413 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006414 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006415 case types::TY_LLVM_IR:
6416 case types::TY_LTO_IR:
6417 case types::TY_LLVM_BC:
6418 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006419 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006420 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006421 // We assume we've got an "integrated" assembler in that gcc will produce an
6422 // object file itself.
6423 case types::TY_Object:
6424 CmdArgs.push_back("-c");
6425 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006426 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006427 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006428 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006429 case types::TY_Nothing:
6430 CmdArgs.push_back("-fsyntax-only");
6431 break;
6432 default:
6433 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006434 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006435}
6436
Douglas Katzman95354292015-06-23 20:42:09 +00006437void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6438 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006439 // The types are (hopefully) good enough.
6440}
6441
Tony Linthicum76329bf2011-12-12 21:14:55 +00006442// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006443void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006444 ArgStringList &CmdArgs) const {
6445}
6446
Douglas Katzman95354292015-06-23 20:42:09 +00006447void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6448 const InputInfo &Output,
6449 const InputInfoList &Inputs,
6450 const ArgList &Args,
6451 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006452 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006453
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006454 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6455 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006456 ArgStringList CmdArgs;
6457
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006458 std::string MArchString = "-march=hexagon";
6459 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006460
6461 RenderExtraToolArgs(JA, CmdArgs);
6462
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006463 std::string AsName = "hexagon-llvm-mc";
6464 std::string MCpuString = "-mcpu=hexagon" +
6465 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6466 CmdArgs.push_back("-filetype=obj");
6467 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6468
Tony Linthicum76329bf2011-12-12 21:14:55 +00006469 if (Output.isFilename()) {
6470 CmdArgs.push_back("-o");
6471 CmdArgs.push_back(Output.getFilename());
6472 } else {
6473 assert(Output.isNothing() && "Unexpected output");
6474 CmdArgs.push_back("-fsyntax-only");
6475 }
6476
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006477 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6478 std::string N = llvm::utostr(G.getValue());
6479 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6480 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006482 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006483
Tony Linthicum76329bf2011-12-12 21:14:55 +00006484 // Only pass -x if gcc will understand it; otherwise hope gcc
6485 // understands the suffix correctly. The main use case this would go
6486 // wrong in is for linker inputs if they happened to have an odd
6487 // suffix; really the only way to get this to happen is a command
6488 // like '-x foobar a.c' which will treat a.c like a linker input.
6489 //
6490 // FIXME: For the linker case specifically, can we safely convert
6491 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006492 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006493 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006494 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006495 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006496 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006497 else if (II.getType() == types::TY_AST)
6498 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006499 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006500 else if (II.getType() == types::TY_ModuleFile)
6501 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006502 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006503
6504 if (II.isFilename())
6505 CmdArgs.push_back(II.getFilename());
6506 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006507 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006508 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006509 II.getInputArg().render(Args, CmdArgs);
6510 }
6511
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006513 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006514}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006515
Douglas Katzman95354292015-06-23 20:42:09 +00006516void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6517 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006518}
6519
Douglas Katzman54366072015-07-27 16:53:08 +00006520static void
6521constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006522 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006523 const InputInfo &Output, const InputInfoList &Inputs,
6524 const ArgList &Args, ArgStringList &CmdArgs,
6525 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006526
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006527 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006528
Matthew Curtise689b052012-12-06 15:46:07 +00006529 //----------------------------------------------------------------------------
6530 //
6531 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006532 bool IsStatic = Args.hasArg(options::OPT_static);
6533 bool IsShared = Args.hasArg(options::OPT_shared);
6534 bool IsPIE = Args.hasArg(options::OPT_pie);
6535 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6536 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6537 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6538 bool UseG0 = false;
6539 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006540
Matthew Curtise689b052012-12-06 15:46:07 +00006541 //----------------------------------------------------------------------------
6542 // Silence warnings for various options
6543 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006544 Args.ClaimAllArgs(options::OPT_g_Group);
6545 Args.ClaimAllArgs(options::OPT_emit_llvm);
6546 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6547 // handled somewhere else.
6548 Args.ClaimAllArgs(options::OPT_static_libgcc);
6549
6550 //----------------------------------------------------------------------------
6551 //
6552 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006553 if (Args.hasArg(options::OPT_s))
6554 CmdArgs.push_back("-s");
6555
6556 if (Args.hasArg(options::OPT_r))
6557 CmdArgs.push_back("-r");
6558
6559 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006560 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006561
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006562 CmdArgs.push_back("-march=hexagon");
6563 std::string CpuVer =
6564 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6565 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6566 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006567
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006569 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 // The following should be the default, but doing as hexagon-gcc does.
6571 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006572 }
6573
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006575 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006576
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006578 CmdArgs.push_back("-pie");
6579
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006580 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6581 std::string N = llvm::utostr(G.getValue());
6582 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6583 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006584 }
6585
Matthew Curtise689b052012-12-06 15:46:07 +00006586 //----------------------------------------------------------------------------
6587 //
6588 //----------------------------------------------------------------------------
6589 CmdArgs.push_back("-o");
6590 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006591
Matthew Curtise689b052012-12-06 15:46:07 +00006592 //----------------------------------------------------------------------------
6593 // moslib
6594 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006595 std::vector<std::string> OsLibs;
6596 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006597
Sean Silva14facf32015-06-09 01:57:17 +00006598 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6599 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006600 OsLibs.emplace_back(A->getValue());
6601 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006602 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006603 if (OsLibs.empty()) {
6604 OsLibs.push_back("standalone");
6605 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006606 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006607
Matthew Curtise689b052012-12-06 15:46:07 +00006608 //----------------------------------------------------------------------------
6609 // Start Files
6610 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006611 const std::string MCpuSuffix = "/" + CpuVer;
6612 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6613 const std::string RootDir =
6614 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6615 const std::string StartSubDir =
6616 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006617
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006618 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6619 const char *Name) -> std::string {
6620 std::string RelName = SubDir + Name;
6621 std::string P = HTC.GetFilePath(RelName.c_str());
6622 if (llvm::sys::fs::exists(P))
6623 return P;
6624 return RootDir + RelName;
6625 };
6626
6627 if (IncStdLib && IncStartFiles) {
6628 if (!IsShared) {
6629 if (HasStandalone) {
6630 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6631 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006632 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006633 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6634 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006635 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006636 std::string Init = UseShared
6637 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6638 : Find(RootDir, StartSubDir, "/init.o");
6639 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006640 }
6641
6642 //----------------------------------------------------------------------------
6643 // Library Search Paths
6644 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6646 for (const auto &LibPath : LibPaths)
6647 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006648
6649 //----------------------------------------------------------------------------
6650 //
6651 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006652 Args.AddAllArgs(CmdArgs,
6653 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6654 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006655
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006656 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006657
6658 //----------------------------------------------------------------------------
6659 // Libraries
6660 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006661 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006662 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006663 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006664 CmdArgs.push_back("-lm");
6665 }
6666
6667 CmdArgs.push_back("--start-group");
6668
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006669 if (!IsShared) {
6670 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006671 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006672 CmdArgs.push_back("-lc");
6673 }
6674 CmdArgs.push_back("-lgcc");
6675
6676 CmdArgs.push_back("--end-group");
6677 }
6678
6679 //----------------------------------------------------------------------------
6680 // End files
6681 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006682 if (IncStdLib && IncStartFiles) {
6683 std::string Fini = UseShared
6684 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6685 : Find(RootDir, StartSubDir, "/fini.o");
6686 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006687 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006688}
6689
Douglas Katzman95354292015-06-23 20:42:09 +00006690void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6691 const InputInfo &Output,
6692 const InputInfoList &Inputs,
6693 const ArgList &Args,
6694 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006695 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006696
6697 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006698 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006699 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006700
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006701 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006702 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006703 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006704}
6705// Hexagon tools end.
6706
Tom Stellard8fa33092015-07-18 01:49:05 +00006707void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6708 const InputInfo &Output,
6709 const InputInfoList &Inputs,
6710 const ArgList &Args,
6711 const char *LinkingOutput) const {
6712
6713 std::string Linker = getToolChain().GetProgramPath(getShortName());
6714 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006715 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6716 CmdArgs.push_back("-o");
6717 CmdArgs.push_back(Output.getFilename());
6718 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6719 CmdArgs, Inputs));
6720}
6721// AMDGPU tools end.
6722
Dan Gohman52816862015-12-16 23:30:41 +00006723wasm::Linker::Linker(const ToolChain &TC)
6724 : GnuTool("wasm::Linker", "lld", TC) {}
6725
6726bool wasm::Linker::isLinkJob() const {
6727 return true;
6728}
6729
6730bool wasm::Linker::hasIntegratedCPP() const {
6731 return false;
6732}
6733
6734void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6735 const InputInfo &Output,
6736 const InputInfoList &Inputs,
6737 const ArgList &Args,
6738 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006739
6740 const ToolChain &ToolChain = getToolChain();
6741 const Driver &D = ToolChain.getDriver();
6742 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006743 ArgStringList CmdArgs;
6744 CmdArgs.push_back("-flavor");
6745 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006746
6747 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006748 // size is of particular importance. This is significantly facilitated by
6749 // the enabling of -ffunction-sections and -fdata-sections in
6750 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006751 if (areOptimizationsEnabled(Args))
6752 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006753
Dan Gohman57b62c52016-02-22 19:26:15 +00006754 if (Args.hasArg(options::OPT_rdynamic))
6755 CmdArgs.push_back("-export-dynamic");
6756 if (Args.hasArg(options::OPT_s))
6757 CmdArgs.push_back("--strip-all");
6758 if (Args.hasArg(options::OPT_shared))
6759 CmdArgs.push_back("-shared");
6760 if (Args.hasArg(options::OPT_static))
6761 CmdArgs.push_back("-Bstatic");
6762
6763 Args.AddAllArgs(CmdArgs, options::OPT_L);
6764 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6765
6766 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6767 if (Args.hasArg(options::OPT_shared))
6768 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6769 else if (Args.hasArg(options::OPT_pie))
6770 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6771 else
6772 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6773
6774 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6775 }
6776
6777 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6778
6779 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6780 if (D.CCCIsCXX())
6781 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6782
6783 if (Args.hasArg(options::OPT_pthread))
6784 CmdArgs.push_back("-lpthread");
6785
6786 CmdArgs.push_back("-lc");
6787 CmdArgs.push_back("-lcompiler_rt");
6788 }
6789
6790 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6791 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6792
Dan Gohman52816862015-12-16 23:30:41 +00006793 CmdArgs.push_back("-o");
6794 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006795
Dan Gohman52816862015-12-16 23:30:41 +00006796 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6797}
6798
Renato Golin7c542b42015-07-27 23:44:45 +00006799const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006800 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006801 if (!Arch.empty())
6802 MArch = Arch;
6803 else
Bernard Ogden31561762013-12-12 13:27:11 +00006804 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006805 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006806
6807 // Handle -march=native.
6808 if (MArch == "native") {
6809 std::string CPU = llvm::sys::getHostCPUName();
6810 if (CPU != "generic") {
6811 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006812 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006813 // If there is no valid architecture suffix for this CPU we don't know how
6814 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006815 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006816 MArch = "";
6817 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006818 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006819 }
6820 }
6821
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006822 return MArch;
6823}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006824
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006825/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006826StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006827 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006828 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6829 // here means an -march=native that we can't handle, so instead return no CPU.
6830 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006831 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006832
John Brawna95c1a82015-05-08 12:52:18 +00006833 // We need to return an empty string here on invalid MArch values as the
6834 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006835 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006836}
6837
6838/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006839std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006840 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006841 // FIXME: Warn on inconsistent use of -mcpu and -march.
6842 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006843 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006844 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006845 // Handle -mcpu=native.
6846 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006847 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006848 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006849 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006850 }
6851
Renato Goline17c5802015-07-27 23:44:42 +00006852 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006853}
6854
6855/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006856/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006857// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006858StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6859 const llvm::Triple &Triple) {
6860 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006861 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006862 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006863 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006864 if (ArchKind == llvm::ARM::AK_INVALID)
6865 // In case of generic Arch, i.e. "arm",
6866 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006867 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006868 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006869 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6870 // armv7k triple if it's actually been specified via "-arch armv7k".
6871 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006872 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006873 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006874 }
Renato Golin3c007252015-05-28 15:05:53 +00006875 if (ArchKind == llvm::ARM::AK_INVALID)
6876 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006877 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006878}
6879
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006880void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006881 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006882 if (Args.hasArg(options::OPT_r))
6883 return;
6884
John Brawn94fd9632015-05-21 12:19:49 +00006885 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6886 // to generate BE-8 executables.
6887 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6888 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006889}
6890
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006891mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006892 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6893 // was first introduced in Release 3. However, other compilers have
6894 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006895 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6896 .Case("mips1", NanLegacy)
6897 .Case("mips2", NanLegacy)
6898 .Case("mips3", NanLegacy)
6899 .Case("mips4", NanLegacy)
6900 .Case("mips5", NanLegacy)
6901 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006902 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006903 .Case("mips32r3", NanLegacy | Nan2008)
6904 .Case("mips32r5", NanLegacy | Nan2008)
6905 .Case("mips32r6", Nan2008)
6906 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006907 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006908 .Case("mips64r3", NanLegacy | Nan2008)
6909 .Case("mips64r5", NanLegacy | Nan2008)
6910 .Case("mips64r6", Nan2008)
6911 .Default(NanLegacy);
6912}
6913
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006914bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6915 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6916 return A && (A->getValue() == StringRef(Value));
6917}
6918
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006919bool mips::isUCLibc(const ArgList &Args) {
6920 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006921 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006922}
6923
Daniel Sanders2bf13662014-07-10 14:40:57 +00006924bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006925 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6926 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006927 .Case("2008", true)
6928 .Case("legacy", false)
6929 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006930
6931 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006932 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006933 .Cases("mips32r6", "mips64r6", true)
6934 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006935
6936 return false;
6937}
6938
Daniel Sanders379d44b2014-07-16 11:52:23 +00006939bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006940 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006941 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006942 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006943 return false;
6944
6945 if (ABIName != "32")
6946 return false;
6947
Toma Tabacu94ea6862015-06-16 13:54:13 +00006948 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6949 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006950 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006951 return false;
6952
Daniel Sanders379d44b2014-07-16 11:52:23 +00006953 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006954 .Cases("mips2", "mips3", "mips4", "mips5", true)
6955 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6956 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6957 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006958}
6959
Toma Tabacu94ea6862015-06-16 13:54:13 +00006960bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6961 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006962 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006963 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6964
6965 // FPXX shouldn't be used if -msingle-float is present.
6966 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6967 options::OPT_mdouble_float))
6968 if (A->getOption().matches(options::OPT_msingle_float))
6969 UseFPXX = false;
6970
6971 return UseFPXX;
6972}
6973
Tim Northover157d9112014-01-16 08:48:16 +00006974llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006975 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6976 // archs which Darwin doesn't use.
6977
6978 // The matching this routine does is fairly pointless, since it is neither the
6979 // complete architecture list, nor a reasonable subset. The problem is that
6980 // historically the driver driver accepts this and also ties its -march=
6981 // handling to the architecture name, so we need to be careful before removing
6982 // support for it.
6983
6984 // This code must be kept in sync with Clang's Darwin specific argument
6985 // translation.
6986
6987 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006988 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6989 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6990 .Case("ppc64", llvm::Triple::ppc64)
6991 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6992 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6993 llvm::Triple::x86)
6994 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6995 // This is derived from the driver driver.
6996 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6997 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6998 .Cases("armv7s", "xscale", llvm::Triple::arm)
6999 .Case("arm64", llvm::Triple::aarch64)
7000 .Case("r600", llvm::Triple::r600)
7001 .Case("amdgcn", llvm::Triple::amdgcn)
7002 .Case("nvptx", llvm::Triple::nvptx)
7003 .Case("nvptx64", llvm::Triple::nvptx64)
7004 .Case("amdil", llvm::Triple::amdil)
7005 .Case("spir", llvm::Triple::spir)
7006 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007007}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007008
Tim Northover157d9112014-01-16 08:48:16 +00007009void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007010 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007011 T.setArch(Arch);
7012
7013 if (Str == "x86_64h")
7014 T.setArchName(Str);
7015 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7016 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007017 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007018 }
7019}
7020
Bob Wilsondecc03e2012-11-23 06:14:39 +00007021const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007022 const InputInfo &Input) {
7023 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007024}
7025
Bob Wilsondecc03e2012-11-23 06:14:39 +00007026const char *Clang::getBaseInputStem(const ArgList &Args,
7027 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007028 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007029
Chris Lattner906bb902011-01-16 08:14:11 +00007030 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007031 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007032
7033 return Str;
7034}
7035
Bob Wilsondecc03e2012-11-23 06:14:39 +00007036const char *Clang::getDependencyFileName(const ArgList &Args,
7037 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007038 // FIXME: Think about this more.
7039 std::string Res;
7040
7041 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007042 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007043 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007044 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007045 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007046 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007047 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007048}
7049
Douglas Katzman95354292015-06-23 20:42:09 +00007050void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7051 const InputInfo &Output,
7052 const InputInfoList &Inputs,
7053 const ArgList &Args,
7054 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007055 const ToolChain &ToolChain = getToolChain();
7056 const Driver &D = ToolChain.getDriver();
7057 ArgStringList CmdArgs;
7058
7059 // Silence warning for "clang -g foo.o -o foo"
7060 Args.ClaimAllArgs(options::OPT_g_Group);
7061 // and "clang -emit-llvm foo.o -o foo"
7062 Args.ClaimAllArgs(options::OPT_emit_llvm);
7063 // and for "clang -w foo.o -o foo". Other warning options are already
7064 // handled somewhere else.
7065 Args.ClaimAllArgs(options::OPT_w);
7066
7067 if (!D.SysRoot.empty())
7068 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7069
7070 // CloudABI only supports static linkage.
7071 CmdArgs.push_back("-Bstatic");
7072 CmdArgs.push_back("--eh-frame-hdr");
7073 CmdArgs.push_back("--gc-sections");
7074
7075 if (Output.isFilename()) {
7076 CmdArgs.push_back("-o");
7077 CmdArgs.push_back(Output.getFilename());
7078 } else {
7079 assert(Output.isNothing() && "Invalid output.");
7080 }
7081
Douglas Katzman78b37b02015-11-17 20:28:07 +00007082 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007083 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7084 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7085 }
7086
7087 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007088 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007089 Args.AddAllArgs(CmdArgs,
7090 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7091 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007092
Teresa Johnson945bc502015-10-15 20:35:53 +00007093 if (D.isUsingLTO())
7094 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007095
7096 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7097
Douglas Katzman78b37b02015-11-17 20:28:07 +00007098 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007099 if (D.CCCIsCXX())
7100 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7101 CmdArgs.push_back("-lc");
7102 CmdArgs.push_back("-lcompiler_rt");
7103 }
7104
Douglas Katzman78b37b02015-11-17 20:28:07 +00007105 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007106 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7107
7108 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007109 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007110}
7111
Douglas Katzman95354292015-06-23 20:42:09 +00007112void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7113 const InputInfo &Output,
7114 const InputInfoList &Inputs,
7115 const ArgList &Args,
7116 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007117 ArgStringList CmdArgs;
7118
7119 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7120 const InputInfo &Input = Inputs[0];
7121
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007122 // Determine the original source input.
7123 const Action *SourceAction = &JA;
7124 while (SourceAction->getKind() != Action::InputClass) {
7125 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7126 SourceAction = SourceAction->getInputs()[0];
7127 }
7128
Eric Christopherf5a8f492015-12-08 00:10:10 +00007129 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007130 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007131 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7132 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007133 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007134 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007135 const llvm::Triple &T(getToolChain().getTriple());
7136 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007137 CmdArgs.push_back("-Q");
7138 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007139
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007140 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007141 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007142 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007143 if (Args.hasArg(options::OPT_gstabs))
7144 CmdArgs.push_back("--gstabs");
7145 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007146 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007147 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007148
Daniel Dunbarbe220842009-03-20 16:06:39 +00007149 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007150 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007151
Daniel Dunbar6d484762010-07-22 01:47:22 +00007152 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007153 if (getToolChain().getArch() == llvm::Triple::x86 ||
7154 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007155 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7156 CmdArgs.push_back("-force_cpusubtype_ALL");
7157
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007158 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007159 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007160 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007161 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007162 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007163 CmdArgs.push_back("-static");
7164
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007165 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007166
7167 assert(Output.isFilename() && "Unexpected lipo output.");
7168 CmdArgs.push_back("-o");
7169 CmdArgs.push_back(Output.getFilename());
7170
Daniel Dunbarb440f562010-08-02 02:38:21 +00007171 assert(Input.isFilename() && "Invalid input.");
7172 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007173
7174 // asm_final spec is empty.
7175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007176 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007177 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007178}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007179
Tim Northover157d9112014-01-16 08:48:16 +00007180void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007181
Tim Northover157d9112014-01-16 08:48:16 +00007182void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7183 ArgStringList &CmdArgs) const {
7184 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007185
Daniel Dunbarc1964212009-03-26 16:23:12 +00007186 // Derived from darwin_arch spec.
7187 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007188 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007189
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007190 // FIXME: Is this needed anymore?
7191 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007192 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007193}
7194
Douglas Katzman95354292015-06-23 20:42:09 +00007195bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007196 // We only need to generate a temp path for LTO if we aren't compiling object
7197 // files. When compiling source files, we run 'dsymutil' after linking. We
7198 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007199 for (const auto &Input : Inputs)
7200 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007201 return true;
7202
7203 return false;
7204}
7205
Douglas Katzman95354292015-06-23 20:42:09 +00007206void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7207 ArgStringList &CmdArgs,
7208 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007209 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007210 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007211
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007212 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007213 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7214 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007215 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7216 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007217 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007218 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007219 }
7220
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007221 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007222 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007223 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7224 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007225
Bob Wilson3d27dad2013-08-02 22:25:34 +00007226 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7227 CmdArgs.push_back("-export_dynamic");
7228
Bob Wilsonb111ec92015-03-02 19:01:14 +00007229 // If we are using App Extension restrictions, pass a flag to the linker
7230 // telling it that the compiled code has been audited.
7231 if (Args.hasFlag(options::OPT_fapplication_extension,
7232 options::OPT_fno_application_extension, false))
7233 CmdArgs.push_back("-application_extension");
7234
Teresa Johnson945bc502015-10-15 20:35:53 +00007235 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007236 // If we are using LTO, then automatically create a temporary file path for
7237 // the linker to use, so that it's lifetime will extend past a possible
7238 // dsymutil step.
7239 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7240 const char *TmpPath = C.getArgs().MakeArgString(
7241 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7242 C.addTempFile(TmpPath);
7243 CmdArgs.push_back("-object_path_lto");
7244 CmdArgs.push_back(TmpPath);
7245 }
7246
7247 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7248 // it in clang installed libraries. If not found, the option is not used
7249 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7250 if (Version[0] >= 133) {
7251 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7252 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7253 SmallString<128> LibLTOPath(P);
7254 llvm::sys::path::append(LibLTOPath, "lib");
7255 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7256 if (llvm::sys::fs::exists(LibLTOPath)) {
7257 CmdArgs.push_back("-lto_library");
7258 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7259 } else {
7260 D.Diag(diag::warn_drv_lto_libpath);
7261 }
7262 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007263 }
7264
Daniel Dunbarc1964212009-03-26 16:23:12 +00007265 // Derived from the "link" spec.
7266 Args.AddAllArgs(CmdArgs, options::OPT_static);
7267 if (!Args.hasArg(options::OPT_static))
7268 CmdArgs.push_back("-dynamic");
7269 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7270 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7271 // here. How do we wish to handle such things?
7272 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007273
Daniel Dunbarc1964212009-03-26 16:23:12 +00007274 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007275 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007276 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007277 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007278
7279 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7280 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7281 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7282
7283 Arg *A;
7284 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7285 (A = Args.getLastArg(options::OPT_current__version)) ||
7286 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007287 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7288 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007289
7290 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7291 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7292 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7293 } else {
7294 CmdArgs.push_back("-dylib");
7295
7296 Arg *A;
7297 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7298 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7299 (A = Args.getLastArg(options::OPT_client__name)) ||
7300 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7301 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7302 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007303 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7304 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007305
Daniel Dunbarc1964212009-03-26 16:23:12 +00007306 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7307 "-dylib_compatibility_version");
7308 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7309 "-dylib_current_version");
7310
Tim Northover157d9112014-01-16 08:48:16 +00007311 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007312
7313 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7314 "-dylib_install_name");
7315 }
7316
7317 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7318 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7319 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007320 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007321 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007322 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7323 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7324 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7325 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7326 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7327 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007328 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007329 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7330 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7331 Args.AddAllArgs(CmdArgs, options::OPT_init);
7332
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007333 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007334 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007335
Daniel Dunbarc1964212009-03-26 16:23:12 +00007336 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7337 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7338 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7339 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7340 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007341
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007342 if (const Arg *A =
7343 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7344 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007345 if (A->getOption().matches(options::OPT_fpie) ||
7346 A->getOption().matches(options::OPT_fPIE))
7347 CmdArgs.push_back("-pie");
7348 else
7349 CmdArgs.push_back("-no_pie");
7350 }
Steven Wu574b0f22016-03-01 01:07:58 +00007351 // for embed-bitcode, use -bitcode_bundle in linker command
7352 if (C.getDriver().embedBitcodeEnabled() ||
7353 C.getDriver().embedBitcodeMarkerOnly()) {
7354 // Check if the toolchain supports bitcode build flow.
7355 if (MachOTC.SupportsEmbeddedBitcode())
7356 CmdArgs.push_back("-bitcode_bundle");
7357 else
7358 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7359 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007360
7361 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7362 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7363 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7364 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7365 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7366 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7367 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7368 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7369 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7370 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7371 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7372 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7373 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7374 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7375 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7376 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007377
Daniel Dunbar84384642011-05-02 21:03:47 +00007378 // Give --sysroot= preference, over the Apple specific behavior to also use
7379 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007380 StringRef sysroot = C.getSysRoot();
7381 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007382 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007383 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007384 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7385 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007386 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007387 }
7388
Daniel Dunbarc1964212009-03-26 16:23:12 +00007389 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7390 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7391 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7392 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7393 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007394 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007395 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7396 Args.AddAllArgs(CmdArgs, options::OPT_y);
7397 Args.AddLastArg(CmdArgs, options::OPT_w);
7398 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7399 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7400 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7401 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7402 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7403 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7404 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7405 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7406 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7407 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7408 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7409 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7410}
7411
Douglas Katzman95354292015-06-23 20:42:09 +00007412void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7413 const InputInfo &Output,
7414 const InputInfoList &Inputs,
7415 const ArgList &Args,
7416 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007417 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007418
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007419 // If the number of arguments surpasses the system limits, we will encode the
7420 // input files in a separate file, shortening the command line. To this end,
7421 // build a list of input file names that can be passed via a file with the
7422 // -filelist linker option.
7423 llvm::opt::ArgStringList InputFileList;
7424
Daniel Dunbarc1964212009-03-26 16:23:12 +00007425 // The logic here is derived from gcc's behavior; most of which
7426 // comes from specs (starting with link_command). Consult gcc for
7427 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007428 ArgStringList CmdArgs;
7429
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007430 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7431 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7432 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007433 for (const auto &Arg : Args)
7434 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007435 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007436 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007437 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007438 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007439 return;
7440 }
7441
Daniel Dunbarc1964212009-03-26 16:23:12 +00007442 // I'm not sure why this particular decomposition exists in gcc, but
7443 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007444 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007445
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007446 // It seems that the 'e' option is completely ignored for dynamic executables
7447 // (the default), and with static executables, the last one wins, as expected.
7448 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7449 options::OPT_Z_Flag, options::OPT_u_Group,
7450 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007451
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007452 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7453 // members of static archive libraries which implement Objective-C classes or
7454 // categories.
7455 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7456 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007457
Daniel Dunbarc1964212009-03-26 16:23:12 +00007458 CmdArgs.push_back("-o");
7459 CmdArgs.push_back(Output.getFilename());
7460
Douglas Katzman78b37b02015-11-17 20:28:07 +00007461 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007462 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007463
Peter Collingbournec4122c12015-06-15 21:08:13 +00007464 // SafeStack requires its own runtime libraries
7465 // These libraries should be linked first, to make sure the
7466 // __safestack_init constructor executes before everything else
7467 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7468 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7469 "libclang_rt.safestack_osx.a",
7470 /*AlwaysLink=*/true);
7471 }
7472
Daniel Dunbarc1964212009-03-26 16:23:12 +00007473 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007474
Douglas Gregor9295df02012-05-15 21:00:27 +00007475 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007476 // Build the input file for -filelist (list of linker input files) in case we
7477 // need it later
7478 for (const auto &II : Inputs) {
7479 if (!II.isFilename()) {
7480 // This is a linker input argument.
7481 // We cannot mix input arguments and file names in a -filelist input, thus
7482 // we prematurely stop our list (remaining files shall be passed as
7483 // arguments).
7484 if (InputFileList.size() > 0)
7485 break;
7486
7487 continue;
7488 }
7489
7490 InputFileList.push_back(II.getFilename());
7491 }
7492
Douglas Katzman78b37b02015-11-17 20:28:07 +00007493 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007494 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7495
Douglas Katzman78b37b02015-11-17 20:28:07 +00007496 if (isObjCRuntimeLinked(Args) &&
7497 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007498 // We use arclite library for both ARC and subscripting support.
7499 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7500
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007501 CmdArgs.push_back("-framework");
7502 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007503 // Link libobj.
7504 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007505 }
John McCall31168b02011-06-15 23:02:42 +00007506
Daniel Dunbarc1964212009-03-26 16:23:12 +00007507 if (LinkingOutput) {
7508 CmdArgs.push_back("-arch_multiple");
7509 CmdArgs.push_back("-final_output");
7510 CmdArgs.push_back(LinkingOutput);
7511 }
7512
Daniel Dunbarc1964212009-03-26 16:23:12 +00007513 if (Args.hasArg(options::OPT_fnested_functions))
7514 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007515
Justin Bognerc7701242015-05-12 05:44:36 +00007516 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7517
Douglas Katzman78b37b02015-11-17 20:28:07 +00007518 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007519 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007520 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007521
Daniel Dunbarc1964212009-03-26 16:23:12 +00007522 // link_ssp spec is empty.
7523
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007524 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007525 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007526 }
7527
Douglas Katzman78b37b02015-11-17 20:28:07 +00007528 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007529 // endfile_spec is empty.
7530 }
7531
7532 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7533 Args.AddAllArgs(CmdArgs, options::OPT_F);
7534
Steven Wu3ffb61b2015-02-06 18:08:29 +00007535 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007536 for (const Arg *A : Args.filtered(options::OPT_iframework))
7537 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007538
Douglas Katzman78b37b02015-11-17 20:28:07 +00007539 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007540 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7541 if (A->getValue() == StringRef("Accelerate")) {
7542 CmdArgs.push_back("-framework");
7543 CmdArgs.push_back("Accelerate");
7544 }
7545 }
7546 }
7547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007548 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007549 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007550 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007551 Cmd->setInputFileList(std::move(InputFileList));
7552 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007553}
7554
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007555void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007556 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007557 const InputInfoList &Inputs,
7558 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007559 const char *LinkingOutput) const {
7560 ArgStringList CmdArgs;
7561
7562 CmdArgs.push_back("-create");
7563 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007564
7565 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007566 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007567
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007568 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007569 assert(II.isFilename() && "Unexpected lipo input.");
7570 CmdArgs.push_back(II.getFilename());
7571 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007572
7573 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007574 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007575}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007576
Daniel Dunbar88299622010-06-04 18:28:36 +00007577void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007578 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007579 const InputInfoList &Inputs,
7580 const ArgList &Args,
7581 const char *LinkingOutput) const {
7582 ArgStringList CmdArgs;
7583
Daniel Dunbareb86b042011-05-09 17:23:16 +00007584 CmdArgs.push_back("-o");
7585 CmdArgs.push_back(Output.getFilename());
7586
Daniel Dunbar88299622010-06-04 18:28:36 +00007587 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7588 const InputInfo &Input = Inputs[0];
7589 assert(Input.isFilename() && "Unexpected dsymutil input.");
7590 CmdArgs.push_back(Input.getFilename());
7591
Daniel Dunbar88299622010-06-04 18:28:36 +00007592 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007593 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007594 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007595}
7596
Eric Christopher551ef452011-08-23 17:56:55 +00007597void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007598 const InputInfo &Output,
7599 const InputInfoList &Inputs,
7600 const ArgList &Args,
7601 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007602 ArgStringList CmdArgs;
7603 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007604 CmdArgs.push_back("--debug-info");
7605 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007606 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007607
7608 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7609 const InputInfo &Input = Inputs[0];
7610 assert(Input.isFilename() && "Unexpected verify input");
7611
7612 // Grabbing the output of the earlier dsymutil run.
7613 CmdArgs.push_back(Input.getFilename());
7614
7615 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007616 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007617 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007618}
7619
Douglas Katzman95354292015-06-23 20:42:09 +00007620void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007621 const InputInfo &Output,
7622 const InputInfoList &Inputs,
7623 const ArgList &Args,
7624 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007625 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007626 ArgStringList CmdArgs;
7627
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007628 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007629
7630 CmdArgs.push_back("-o");
7631 CmdArgs.push_back(Output.getFilename());
7632
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007633 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007634 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007635
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007636 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007637 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007638}
7639
Douglas Katzman95354292015-06-23 20:42:09 +00007640void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7641 const InputInfo &Output,
7642 const InputInfoList &Inputs,
7643 const ArgList &Args,
7644 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007645 ArgStringList CmdArgs;
7646
David Chisnall272a0712012-02-29 15:06:12 +00007647 // Demangle C++ names in errors
7648 CmdArgs.push_back("-C");
7649
Douglas Katzman78b37b02015-11-17 20:28:07 +00007650 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007651 CmdArgs.push_back("-e");
7652 CmdArgs.push_back("_start");
7653 }
7654
7655 if (Args.hasArg(options::OPT_static)) {
7656 CmdArgs.push_back("-Bstatic");
7657 CmdArgs.push_back("-dn");
7658 } else {
7659 CmdArgs.push_back("-Bdynamic");
7660 if (Args.hasArg(options::OPT_shared)) {
7661 CmdArgs.push_back("-shared");
7662 } else {
7663 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007664 CmdArgs.push_back(
7665 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007666 }
7667 }
7668
7669 if (Output.isFilename()) {
7670 CmdArgs.push_back("-o");
7671 CmdArgs.push_back(Output.getFilename());
7672 } else {
7673 assert(Output.isNothing() && "Invalid output.");
7674 }
7675
Douglas Katzman78b37b02015-11-17 20:28:07 +00007676 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007677 if (!Args.hasArg(options::OPT_shared))
7678 CmdArgs.push_back(
7679 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7680
7681 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7682 CmdArgs.push_back(
7683 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7684 CmdArgs.push_back(
7685 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007686 }
7687
Douglas Katzman6059ef92015-11-17 17:41:23 +00007688 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007689
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007690 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7691 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007692
7693 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7694
Douglas Katzman78b37b02015-11-17 20:28:07 +00007695 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007696 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007697 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007698 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007699 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007700 if (!Args.hasArg(options::OPT_shared)) {
7701 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007702 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007703 }
David Chisnallf571cde2012-02-15 13:39:01 +00007704 }
7705
Douglas Katzman78b37b02015-11-17 20:28:07 +00007706 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007707 CmdArgs.push_back(
7708 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007709 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007710 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007711
Xinliang David Li69306c02015-10-22 06:15:31 +00007712 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007713
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007714 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007715 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007716}
7717
Douglas Katzman95354292015-06-23 20:42:09 +00007718void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7719 const InputInfo &Output,
7720 const InputInfoList &Inputs,
7721 const ArgList &Args,
7722 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007723 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007724 ArgStringList CmdArgs;
7725
Rafael Espindolacc126272014-02-28 01:55:21 +00007726 switch (getToolChain().getArch()) {
7727 case llvm::Triple::x86:
7728 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7729 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007730 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007731 break;
7732
7733 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007734 CmdArgs.push_back("-mppc");
7735 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007736 break;
7737
7738 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007739 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007740 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007741 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7742 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7743 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007744 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007745 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007746
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007747 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007748 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007749 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7750 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7751 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007752 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007753 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007754
7755 case llvm::Triple::mips64:
7756 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007757 StringRef CPUName;
7758 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007759 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007760
7761 CmdArgs.push_back("-mabi");
7762 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7763
7764 if (getToolChain().getArch() == llvm::Triple::mips64)
7765 CmdArgs.push_back("-EB");
7766 else
7767 CmdArgs.push_back("-EL");
7768
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007769 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007770 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007771 }
7772
Rafael Espindolacc126272014-02-28 01:55:21 +00007773 default:
7774 break;
7775 }
7776
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007777 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007778
7779 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007780 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007781
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007782 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007783 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007784
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007785 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007786 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007787}
7788
Douglas Katzman95354292015-06-23 20:42:09 +00007789void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7790 const InputInfo &Output,
7791 const InputInfoList &Inputs,
7792 const ArgList &Args,
7793 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007794 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007795 ArgStringList CmdArgs;
7796
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007797 // Silence warning for "clang -g foo.o -o foo"
7798 Args.ClaimAllArgs(options::OPT_g_Group);
7799 // and "clang -emit-llvm foo.o -o foo"
7800 Args.ClaimAllArgs(options::OPT_emit_llvm);
7801 // and for "clang -w foo.o -o foo". Other warning options are already
7802 // handled somewhere else.
7803 Args.ClaimAllArgs(options::OPT_w);
7804
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007805 if (getToolChain().getArch() == llvm::Triple::mips64)
7806 CmdArgs.push_back("-EB");
7807 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7808 CmdArgs.push_back("-EL");
7809
Douglas Katzman78b37b02015-11-17 20:28:07 +00007810 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007811 CmdArgs.push_back("-e");
7812 CmdArgs.push_back("__start");
7813 }
7814
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007815 if (Args.hasArg(options::OPT_static)) {
7816 CmdArgs.push_back("-Bstatic");
7817 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007818 if (Args.hasArg(options::OPT_rdynamic))
7819 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007820 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007821 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007822 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007823 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007824 } else {
7825 CmdArgs.push_back("-dynamic-linker");
7826 CmdArgs.push_back("/usr/libexec/ld.so");
7827 }
7828 }
7829
Rafael Espindola044f7832013-06-05 04:28:55 +00007830 if (Args.hasArg(options::OPT_nopie))
7831 CmdArgs.push_back("-nopie");
7832
Daniel Dunbarb440f562010-08-02 02:38:21 +00007833 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007834 CmdArgs.push_back("-o");
7835 CmdArgs.push_back(Output.getFilename());
7836 } else {
7837 assert(Output.isNothing() && "Invalid output.");
7838 }
7839
Douglas Katzman78b37b02015-11-17 20:28:07 +00007840 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007841 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007842 if (Args.hasArg(options::OPT_pg))
7843 CmdArgs.push_back(
7844 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007845 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007846 CmdArgs.push_back(
7847 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7848 CmdArgs.push_back(
7849 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007850 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007851 CmdArgs.push_back(
7852 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007853 }
7854 }
7855
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007856 std::string Triple = getToolChain().getTripleString();
7857 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007858 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007859 CmdArgs.push_back(
7860 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007861
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007862 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7863 options::OPT_e, options::OPT_s, options::OPT_t,
7864 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007865
Daniel Dunbar54423b22010-09-17 00:24:54 +00007866 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007867
Douglas Katzman78b37b02015-11-17 20:28:07 +00007868 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007869 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007870 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007871 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007872 CmdArgs.push_back("-lm_p");
7873 else
7874 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007875 }
7876
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007877 // FIXME: For some reason GCC passes -lgcc before adding
7878 // the default system libraries. Just mimic this for now.
7879 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007880
Eric Christopher17674ec2012-09-13 06:32:34 +00007881 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007882 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7883 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007884 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007885 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007886 }
7887
Chandler Carruth45661652011-12-17 22:32:42 +00007888 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007889 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007890 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007891 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007892 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007893 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007894
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007895 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007896 }
7897
Douglas Katzman78b37b02015-11-17 20:28:07 +00007898 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007899 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007900 CmdArgs.push_back(
7901 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007902 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007903 CmdArgs.push_back(
7904 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007905 }
7906
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007907 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007908 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007909}
Ed Schoutene33194b2009-04-02 19:13:12 +00007910
Douglas Katzman95354292015-06-23 20:42:09 +00007911void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7912 const InputInfo &Output,
7913 const InputInfoList &Inputs,
7914 const ArgList &Args,
7915 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007916 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007917 ArgStringList CmdArgs;
7918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007919 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007920
7921 CmdArgs.push_back("-o");
7922 CmdArgs.push_back(Output.getFilename());
7923
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007924 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007925 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007926
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007927 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007928 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007929}
7930
Douglas Katzman95354292015-06-23 20:42:09 +00007931void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7932 const InputInfo &Output,
7933 const InputInfoList &Inputs,
7934 const ArgList &Args,
7935 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007936 const Driver &D = getToolChain().getDriver();
7937 ArgStringList CmdArgs;
7938
Douglas Katzman78b37b02015-11-17 20:28:07 +00007939 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007940 CmdArgs.push_back("-e");
7941 CmdArgs.push_back("__start");
7942 }
7943
7944 if (Args.hasArg(options::OPT_static)) {
7945 CmdArgs.push_back("-Bstatic");
7946 } else {
7947 if (Args.hasArg(options::OPT_rdynamic))
7948 CmdArgs.push_back("-export-dynamic");
7949 CmdArgs.push_back("--eh-frame-hdr");
7950 CmdArgs.push_back("-Bdynamic");
7951 if (Args.hasArg(options::OPT_shared)) {
7952 CmdArgs.push_back("-shared");
7953 } else {
7954 CmdArgs.push_back("-dynamic-linker");
7955 CmdArgs.push_back("/usr/libexec/ld.so");
7956 }
7957 }
7958
7959 if (Output.isFilename()) {
7960 CmdArgs.push_back("-o");
7961 CmdArgs.push_back(Output.getFilename());
7962 } else {
7963 assert(Output.isNothing() && "Invalid output.");
7964 }
7965
Douglas Katzman78b37b02015-11-17 20:28:07 +00007966 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007967 if (!Args.hasArg(options::OPT_shared)) {
7968 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007969 CmdArgs.push_back(
7970 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007971 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007972 CmdArgs.push_back(
7973 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7974 CmdArgs.push_back(
7975 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007976 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007977 CmdArgs.push_back(
7978 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007979 }
7980 }
7981
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007982 Args.AddAllArgs(CmdArgs,
7983 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007984
7985 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7986
Douglas Katzman78b37b02015-11-17 20:28:07 +00007987 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007988 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007989 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7990 if (Args.hasArg(options::OPT_pg))
7991 CmdArgs.push_back("-lm_p");
7992 else
7993 CmdArgs.push_back("-lm");
7994 }
7995
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007996 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007997 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007998 CmdArgs.push_back("-lpthread_p");
7999 else
8000 CmdArgs.push_back("-lpthread");
8001 }
8002
Eli Friedman9fa28852012-08-08 23:57:20 +00008003 if (!Args.hasArg(options::OPT_shared)) {
8004 if (Args.hasArg(options::OPT_pg))
8005 CmdArgs.push_back("-lc_p");
8006 else
8007 CmdArgs.push_back("-lc");
8008 }
8009
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008010 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008011 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008012 case llvm::Triple::arm:
8013 MyArch = "arm";
8014 break;
8015 case llvm::Triple::x86:
8016 MyArch = "i386";
8017 break;
8018 case llvm::Triple::x86_64:
8019 MyArch = "amd64";
8020 break;
8021 default:
8022 llvm_unreachable("Unsupported architecture");
8023 }
8024 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008025 }
8026
Douglas Katzman78b37b02015-11-17 20:28:07 +00008027 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008028 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008029 CmdArgs.push_back(
8030 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008031 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008032 CmdArgs.push_back(
8033 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008034 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008035
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008036 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008037 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008038}
8039
Douglas Katzman95354292015-06-23 20:42:09 +00008040void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8041 const InputInfo &Output,
8042 const InputInfoList &Inputs,
8043 const ArgList &Args,
8044 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008045 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008046 ArgStringList CmdArgs;
8047
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008048 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8049 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008050 switch (getToolChain().getArch()) {
8051 default:
8052 break;
8053 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008054 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008055 break;
8056 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008057 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008058 break;
8059 case llvm::Triple::mips:
8060 case llvm::Triple::mipsel:
8061 case llvm::Triple::mips64:
8062 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008063 StringRef CPUName;
8064 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008065 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008066
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008067 CmdArgs.push_back("-march");
8068 CmdArgs.push_back(CPUName.data());
8069
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008070 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008071 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008072
8073 if (getToolChain().getArch() == llvm::Triple::mips ||
8074 getToolChain().getArch() == llvm::Triple::mips64)
8075 CmdArgs.push_back("-EB");
8076 else
8077 CmdArgs.push_back("-EL");
8078
Dimitry Andric46f338c2015-12-27 10:36:44 +00008079 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8080 StringRef v = A->getValue();
8081 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8082 A->claim();
8083 }
8084
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008085 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008086 break;
8087 }
8088 case llvm::Triple::arm:
8089 case llvm::Triple::armeb:
8090 case llvm::Triple::thumb:
8091 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008092 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008093
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008094 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008095 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008096 else
Renato Golinf4421f72014-02-19 10:44:07 +00008097 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008098
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008099 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008100 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008101 case llvm::Triple::GNUEABI:
8102 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008103 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008104 break;
8105
8106 default:
8107 CmdArgs.push_back("-matpcs");
8108 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008109 break;
8110 }
8111 case llvm::Triple::sparc:
8112 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008113 case llvm::Triple::sparcv9: {
8114 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8115 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008116 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008117 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008118 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008119 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008120
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008121 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008122
8123 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008124 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008125
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008126 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008127 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008128
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008129 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008130 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008131}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008132
Douglas Katzman95354292015-06-23 20:42:09 +00008133void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8134 const InputInfo &Output,
8135 const InputInfoList &Inputs,
8136 const ArgList &Args,
8137 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008138 const toolchains::FreeBSD &ToolChain =
8139 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008140 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008141 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008142 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008143 !Args.hasArg(options::OPT_shared) &&
8144 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008145 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008146
8147 // Silence warning for "clang -g foo.o -o foo"
8148 Args.ClaimAllArgs(options::OPT_g_Group);
8149 // and "clang -emit-llvm foo.o -o foo"
8150 Args.ClaimAllArgs(options::OPT_emit_llvm);
8151 // and for "clang -w foo.o -o foo". Other warning options are already
8152 // handled somewhere else.
8153 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008154
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008155 if (!D.SysRoot.empty())
8156 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8157
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008158 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008159 CmdArgs.push_back("-pie");
8160
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008161 if (Args.hasArg(options::OPT_static)) {
8162 CmdArgs.push_back("-Bstatic");
8163 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008164 if (Args.hasArg(options::OPT_rdynamic))
8165 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008166 CmdArgs.push_back("--eh-frame-hdr");
8167 if (Args.hasArg(options::OPT_shared)) {
8168 CmdArgs.push_back("-Bshareable");
8169 } else {
8170 CmdArgs.push_back("-dynamic-linker");
8171 CmdArgs.push_back("/libexec/ld-elf.so.1");
8172 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008173 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008174 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8175 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8176 CmdArgs.push_back("--hash-style=both");
8177 }
8178 }
8179 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008180 }
8181
8182 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8183 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008184 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008185 CmdArgs.push_back("-m");
8186 CmdArgs.push_back("elf_i386_fbsd");
8187 }
8188
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008189 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008190 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008191 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008192 }
8193
Dimitry Andric904895f2015-12-27 06:47:09 +00008194 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8195 if (ToolChain.getArch() == llvm::Triple::mips ||
8196 ToolChain.getArch() == llvm::Triple::mipsel ||
8197 ToolChain.getArch() == llvm::Triple::mips64 ||
8198 ToolChain.getArch() == llvm::Triple::mips64el) {
8199 StringRef v = A->getValue();
8200 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8201 A->claim();
8202 }
8203 }
8204
Daniel Dunbarb440f562010-08-02 02:38:21 +00008205 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008206 CmdArgs.push_back("-o");
8207 CmdArgs.push_back(Output.getFilename());
8208 } else {
8209 assert(Output.isNothing() && "Invalid output.");
8210 }
8211
Douglas Katzman78b37b02015-11-17 20:28:07 +00008212 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008213 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008214 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008215 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008216 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008217 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008218 crt1 = "Scrt1.o";
8219 else
8220 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008221 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008222 if (crt1)
8223 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8224
8225 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8226
Craig Topper92fc2df2014-05-17 16:56:41 +00008227 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008228 if (Args.hasArg(options::OPT_static))
8229 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008230 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008231 crtbegin = "crtbeginS.o";
8232 else
8233 crtbegin = "crtbegin.o";
8234
8235 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008236 }
8237
8238 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008239 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008240 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8241 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008242 Args.AddAllArgs(CmdArgs, options::OPT_s);
8243 Args.AddAllArgs(CmdArgs, options::OPT_t);
8244 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8245 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008246
Teresa Johnson945bc502015-10-15 20:35:53 +00008247 if (D.isUsingLTO())
8248 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008249
Alexey Samsonov52550342014-09-15 19:58:40 +00008250 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008251 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008252
Douglas Katzman78b37b02015-11-17 20:28:07 +00008253 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008254 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008255 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008256 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008257 if (Args.hasArg(options::OPT_pg))
8258 CmdArgs.push_back("-lm_p");
8259 else
8260 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008261 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008262 if (NeedsSanitizerDeps)
8263 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008264 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8265 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008266 if (Args.hasArg(options::OPT_pg))
8267 CmdArgs.push_back("-lgcc_p");
8268 else
8269 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008270 if (Args.hasArg(options::OPT_static)) {
8271 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008272 } else if (Args.hasArg(options::OPT_pg)) {
8273 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008274 } else {
8275 CmdArgs.push_back("--as-needed");
8276 CmdArgs.push_back("-lgcc_s");
8277 CmdArgs.push_back("--no-as-needed");
8278 }
8279
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008280 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008281 if (Args.hasArg(options::OPT_pg))
8282 CmdArgs.push_back("-lpthread_p");
8283 else
8284 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008285 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008286
Roman Divacky66f22762011-02-10 16:59:40 +00008287 if (Args.hasArg(options::OPT_pg)) {
8288 if (Args.hasArg(options::OPT_shared))
8289 CmdArgs.push_back("-lc");
8290 else
8291 CmdArgs.push_back("-lc_p");
8292 CmdArgs.push_back("-lgcc_p");
8293 } else {
8294 CmdArgs.push_back("-lc");
8295 CmdArgs.push_back("-lgcc");
8296 }
8297
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008298 if (Args.hasArg(options::OPT_static)) {
8299 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008300 } else if (Args.hasArg(options::OPT_pg)) {
8301 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008302 } else {
8303 CmdArgs.push_back("--as-needed");
8304 CmdArgs.push_back("-lgcc_s");
8305 CmdArgs.push_back("--no-as-needed");
8306 }
8307 }
8308
Douglas Katzman78b37b02015-11-17 20:28:07 +00008309 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008310 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008311 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008312 else
8313 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008314 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008315 }
8316
Xinliang David Li69306c02015-10-22 06:15:31 +00008317 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008319 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008320 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008321}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008322
Douglas Katzman95354292015-06-23 20:42:09 +00008323void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008324 const InputInfo &Output,
8325 const InputInfoList &Inputs,
8326 const ArgList &Args,
8327 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008328 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008329 ArgStringList CmdArgs;
8330
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008331 // GNU as needs different flags for creating the correct output format
8332 // on architectures with different ABIs or optional feature sets.
8333 switch (getToolChain().getArch()) {
8334 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008335 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008336 break;
8337 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008338 case llvm::Triple::armeb:
8339 case llvm::Triple::thumb:
8340 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008341 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008342 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8343 std::string Arch =
8344 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008345 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008346 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008347 }
8348
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008349 case llvm::Triple::mips:
8350 case llvm::Triple::mipsel:
8351 case llvm::Triple::mips64:
8352 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008353 StringRef CPUName;
8354 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008355 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008356
8357 CmdArgs.push_back("-march");
8358 CmdArgs.push_back(CPUName.data());
8359
8360 CmdArgs.push_back("-mabi");
8361 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8362
8363 if (getToolChain().getArch() == llvm::Triple::mips ||
8364 getToolChain().getArch() == llvm::Triple::mips64)
8365 CmdArgs.push_back("-EB");
8366 else
8367 CmdArgs.push_back("-EL");
8368
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008369 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008370 break;
8371 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008372
8373 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008374 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008375 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008376 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8377 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008378 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008379 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008380 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008381
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008382 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008383 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008384 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8385 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008386 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008387 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008388 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008389
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008390 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008391 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008392 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008393
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008394 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008395
8396 CmdArgs.push_back("-o");
8397 CmdArgs.push_back(Output.getFilename());
8398
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008399 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008400 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008401
David Chisnallddbd68f2011-09-27 22:03:18 +00008402 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008403 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008404}
8405
Douglas Katzman95354292015-06-23 20:42:09 +00008406void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8407 const InputInfo &Output,
8408 const InputInfoList &Inputs,
8409 const ArgList &Args,
8410 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008411 const Driver &D = getToolChain().getDriver();
8412 ArgStringList CmdArgs;
8413
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008414 if (!D.SysRoot.empty())
8415 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8416
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008417 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008418 if (Args.hasArg(options::OPT_static)) {
8419 CmdArgs.push_back("-Bstatic");
8420 } else {
8421 if (Args.hasArg(options::OPT_rdynamic))
8422 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008423 if (Args.hasArg(options::OPT_shared)) {
8424 CmdArgs.push_back("-Bshareable");
8425 } else {
8426 CmdArgs.push_back("-dynamic-linker");
8427 CmdArgs.push_back("/libexec/ld.elf_so");
8428 }
8429 }
8430
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008431 // Many NetBSD architectures support more than one ABI.
8432 // Determine the correct emulation for ld.
8433 switch (getToolChain().getArch()) {
8434 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008435 CmdArgs.push_back("-m");
8436 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008437 break;
8438 case llvm::Triple::arm:
8439 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008440 CmdArgs.push_back("-m");
8441 switch (getToolChain().getTriple().getEnvironment()) {
8442 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008443 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008444 CmdArgs.push_back("armelf_nbsd_eabi");
8445 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008446 case llvm::Triple::EABIHF:
8447 case llvm::Triple::GNUEABIHF:
8448 CmdArgs.push_back("armelf_nbsd_eabihf");
8449 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008450 default:
8451 CmdArgs.push_back("armelf_nbsd");
8452 break;
8453 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008454 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008455 case llvm::Triple::armeb:
8456 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008457 arm::appendEBLinkFlags(
8458 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008459 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008460 CmdArgs.push_back("-m");
8461 switch (getToolChain().getTriple().getEnvironment()) {
8462 case llvm::Triple::EABI:
8463 case llvm::Triple::GNUEABI:
8464 CmdArgs.push_back("armelfb_nbsd_eabi");
8465 break;
8466 case llvm::Triple::EABIHF:
8467 case llvm::Triple::GNUEABIHF:
8468 CmdArgs.push_back("armelfb_nbsd_eabihf");
8469 break;
8470 default:
8471 CmdArgs.push_back("armelfb_nbsd");
8472 break;
8473 }
8474 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008475 case llvm::Triple::mips64:
8476 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008477 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008478 CmdArgs.push_back("-m");
8479 if (getToolChain().getArch() == llvm::Triple::mips64)
8480 CmdArgs.push_back("elf32btsmip");
8481 else
8482 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008483 } else if (mips::hasMipsAbiArg(Args, "64")) {
8484 CmdArgs.push_back("-m");
8485 if (getToolChain().getArch() == llvm::Triple::mips64)
8486 CmdArgs.push_back("elf64btsmip");
8487 else
8488 CmdArgs.push_back("elf64ltsmip");
8489 }
8490 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008491 case llvm::Triple::ppc:
8492 CmdArgs.push_back("-m");
8493 CmdArgs.push_back("elf32ppc_nbsd");
8494 break;
8495
8496 case llvm::Triple::ppc64:
8497 case llvm::Triple::ppc64le:
8498 CmdArgs.push_back("-m");
8499 CmdArgs.push_back("elf64ppc");
8500 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008501
8502 case llvm::Triple::sparc:
8503 CmdArgs.push_back("-m");
8504 CmdArgs.push_back("elf32_sparc");
8505 break;
8506
8507 case llvm::Triple::sparcv9:
8508 CmdArgs.push_back("-m");
8509 CmdArgs.push_back("elf64_sparc");
8510 break;
8511
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008512 default:
8513 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008514 }
8515
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008516 if (Output.isFilename()) {
8517 CmdArgs.push_back("-o");
8518 CmdArgs.push_back(Output.getFilename());
8519 } else {
8520 assert(Output.isNothing() && "Invalid output.");
8521 }
8522
Douglas Katzman78b37b02015-11-17 20:28:07 +00008523 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008524 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008525 CmdArgs.push_back(
8526 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8527 CmdArgs.push_back(
8528 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8529 CmdArgs.push_back(
8530 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008531 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008532 CmdArgs.push_back(
8533 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8534 CmdArgs.push_back(
8535 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008536 }
8537 }
8538
8539 Args.AddAllArgs(CmdArgs, options::OPT_L);
8540 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8541 Args.AddAllArgs(CmdArgs, options::OPT_e);
8542 Args.AddAllArgs(CmdArgs, options::OPT_s);
8543 Args.AddAllArgs(CmdArgs, options::OPT_t);
8544 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8545 Args.AddAllArgs(CmdArgs, options::OPT_r);
8546
8547 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8548
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008549 unsigned Major, Minor, Micro;
8550 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8551 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008552 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008553 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008554 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008555 case llvm::Triple::arm:
8556 case llvm::Triple::armeb:
8557 case llvm::Triple::thumb:
8558 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008559 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008560 case llvm::Triple::ppc64:
8561 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008562 case llvm::Triple::sparc:
8563 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008564 case llvm::Triple::x86:
8565 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008566 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008567 break;
8568 default:
8569 break;
8570 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008571 }
8572
Douglas Katzman78b37b02015-11-17 20:28:07 +00008573 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008574 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008575 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008576 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8577 CmdArgs.push_back("-lm");
8578 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008579 if (Args.hasArg(options::OPT_pthread))
8580 CmdArgs.push_back("-lpthread");
8581 CmdArgs.push_back("-lc");
8582
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008583 if (useLibgcc) {
8584 if (Args.hasArg(options::OPT_static)) {
8585 // libgcc_eh depends on libc, so resolve as much as possible,
8586 // pull in any new requirements from libc and then get the rest
8587 // of libgcc.
8588 CmdArgs.push_back("-lgcc_eh");
8589 CmdArgs.push_back("-lc");
8590 CmdArgs.push_back("-lgcc");
8591 } else {
8592 CmdArgs.push_back("-lgcc");
8593 CmdArgs.push_back("--as-needed");
8594 CmdArgs.push_back("-lgcc_s");
8595 CmdArgs.push_back("--no-as-needed");
8596 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008597 }
8598 }
8599
Douglas Katzman78b37b02015-11-17 20:28:07 +00008600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008601 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008602 CmdArgs.push_back(
8603 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008604 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008605 CmdArgs.push_back(
8606 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8607 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008608 }
8609
Xinliang David Li69306c02015-10-22 06:15:31 +00008610 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008611
Logan Chieneb9162f2014-06-26 14:23:45 +00008612 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008613 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008614}
8615
Douglas Katzman95354292015-06-23 20:42:09 +00008616void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8617 const InputInfo &Output,
8618 const InputInfoList &Inputs,
8619 const ArgList &Args,
8620 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008621 claimNoWarnArgs(Args);
8622
James Y Knight2db38f32015-08-15 03:45:25 +00008623 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8624 llvm::Triple Triple = llvm::Triple(TripleStr);
8625
Rafael Espindola92b00932010-08-10 00:25:48 +00008626 ArgStringList CmdArgs;
8627
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008628 llvm::Reloc::Model RelocationModel;
8629 unsigned PICLevel;
8630 bool IsPIE;
8631 std::tie(RelocationModel, PICLevel, IsPIE) =
8632 ParsePICArgs(getToolChain(), Triple, Args);
8633
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008634 switch (getToolChain().getArch()) {
8635 default:
8636 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008637 // Add --32/--64 to make sure we get the format we want.
8638 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008639 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008640 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008641 break;
8642 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008643 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8644 CmdArgs.push_back("--x32");
8645 else
8646 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008647 break;
8648 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008649 CmdArgs.push_back("-a32");
8650 CmdArgs.push_back("-mppc");
8651 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008652 break;
8653 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008654 CmdArgs.push_back("-a64");
8655 CmdArgs.push_back("-mppc64");
8656 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008657 break;
8658 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008659 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008660 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008661 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008662 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008663 break;
8664 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008665 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008666 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008667 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8668 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8669 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008670 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008671 }
8672 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008673 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008674 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8675 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8676 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008677 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008678 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008679 case llvm::Triple::arm:
8680 case llvm::Triple::armeb:
8681 case llvm::Triple::thumb:
8682 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008683 const llvm::Triple &Triple2 = getToolChain().getTriple();
8684 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008685 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008686 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008687 break;
8688 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008689 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008690 break;
8691 default:
8692 break;
8693 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008694
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008695 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008696 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8697 case arm::FloatABI::Soft:
8698 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8699 break;
8700 case arm::FloatABI::SoftFP:
8701 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8702 break;
8703 case arm::FloatABI::Hard:
8704 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8705 break;
8706 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008707
8708 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008709
8710 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008711 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008712 // march from being picked in the absence of a cpu flag.
8713 Arg *A;
8714 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008715 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008716 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008717 else
8718 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008719 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008720 break;
8721 }
8722 case llvm::Triple::mips:
8723 case llvm::Triple::mipsel:
8724 case llvm::Triple::mips64:
8725 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008726 StringRef CPUName;
8727 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008728 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008729 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008730
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008731 CmdArgs.push_back("-march");
8732 CmdArgs.push_back(CPUName.data());
8733
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008734 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008735 CmdArgs.push_back(ABIName.data());
8736
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008737 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8738 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008739 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008740 CmdArgs.push_back("-mno-shared");
8741
Daniel Sanders379d44b2014-07-16 11:52:23 +00008742 // LLVM doesn't support -mplt yet and acts as if it is always given.
8743 // However, -mplt has no effect with the N64 ABI.
8744 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008745
8746 if (getToolChain().getArch() == llvm::Triple::mips ||
8747 getToolChain().getArch() == llvm::Triple::mips64)
8748 CmdArgs.push_back("-EB");
8749 else
8750 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008751
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008752 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8753 if (StringRef(A->getValue()) == "2008")
8754 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8755 }
8756
Daniel Sanders379d44b2014-07-16 11:52:23 +00008757 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8758 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8759 options::OPT_mfp64)) {
8760 A->claim();
8761 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008762 } else if (mips::shouldUseFPXX(
8763 Args, getToolChain().getTriple(), CPUName, ABIName,
8764 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008765 CmdArgs.push_back("-mfpxx");
8766
8767 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8768 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008769 if (Arg *A =
8770 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008771 if (A->getOption().matches(options::OPT_mips16)) {
8772 A->claim();
8773 A->render(Args, CmdArgs);
8774 } else {
8775 A->claim();
8776 CmdArgs.push_back("-no-mips16");
8777 }
8778 }
8779
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008780 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8781 options::OPT_mno_micromips);
8782 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8783 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8784
Simon Atanasyanbd986632013-11-26 11:58:04 +00008785 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8786 // Do not use AddLastArg because not all versions of MIPS assembler
8787 // support -mmsa / -mno-msa options.
8788 if (A->getOption().matches(options::OPT_mmsa))
8789 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8790 }
8791
Daniel Sanders379d44b2014-07-16 11:52:23 +00008792 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8793 options::OPT_msoft_float);
8794
Toma Tabacub36d6102015-06-11 12:13:18 +00008795 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8796 options::OPT_msingle_float);
8797
Daniel Sanders379d44b2014-07-16 11:52:23 +00008798 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8799 options::OPT_mno_odd_spreg);
8800
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008801 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008802 break;
8803 }
8804 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008805 // Always pass an -march option, since our default of z10 is later
8806 // than the GNU assembler's default.
8807 StringRef CPUName = getSystemZTargetCPU(Args);
8808 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008809 break;
8810 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008811 }
8812
Renato Golina74bbc72015-07-22 15:32:36 +00008813 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008814 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008815
8816 CmdArgs.push_back("-o");
8817 CmdArgs.push_back(Output.getFilename());
8818
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008819 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008820 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008821
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008822 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008823 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008824
8825 // Handle the debug info splitting at object creation time if we're
8826 // creating an object.
8827 // TODO: Currently only works on linux with newer objcopy.
8828 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008829 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008830 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008831 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008832}
8833
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008834static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008835 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008836 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008837 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008838 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8839 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008840 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008841 CmdArgs.push_back("-lgcc");
8842
Logan Chien3d3373c2012-11-19 12:04:11 +00008843 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008844 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008845 CmdArgs.push_back("-lgcc");
8846 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008847 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008848 CmdArgs.push_back("--as-needed");
8849 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008850 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008851 CmdArgs.push_back("--no-as-needed");
8852 }
8853
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008854 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008855 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008856 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008857 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008858
8859 // According to Android ABI, we have to link with libdl if we are
8860 // linking with non-static libgcc.
8861 //
8862 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8863 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8864 if (isAndroid && !StaticLibgcc)
8865 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008866}
8867
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008868static std::string getLinuxDynamicLinker(const ArgList &Args,
8869 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008870 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8871
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008872 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008873 if (ToolChain.getTriple().isArch64Bit())
8874 return "/system/bin/linker64";
8875 else
8876 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008877 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8878 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008879 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008880 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008881 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008882 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008883 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008884 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008885 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008886 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008887 return "/lib/ld-linux-armhf.so.3";
8888 else
8889 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008890 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8891 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008892 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008893 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008894 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008895 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008896 return "/lib/ld-linux.so.3";
8897 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8898 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008899 std::string LibDir =
8900 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008901 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008902 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008903 if (mips::isUCLibc(Args))
8904 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008905 else if (!ToolChain.getTriple().hasEnvironment()) {
8906 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8907 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8908 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8909 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008910 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008911
8912 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008913 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008914 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008915 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008916 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8917 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008918 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008919 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008920 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8921 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008922 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008923 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008924 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008925 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008926 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008927 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008928 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8929 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008930 else
8931 return "/lib64/ld-linux-x86-64.so.2";
8932}
8933
Renato Golinc4b49242014-02-13 10:01:16 +00008934static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008935 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008936 // Make use of compiler-rt if --rtlib option is used
8937 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8938
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008939 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008940 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008941 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008942 default:
8943 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008944 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008945 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008946 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008947 break;
8948 }
Renato Golinc4b49242014-02-13 10:01:16 +00008949 break;
8950 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008951 // Make sure libgcc is not used under MSVC environment by default
8952 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8953 // Issue error diagnostic if libgcc is explicitly specified
8954 // through command line as --rtlib option argument.
8955 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8956 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8957 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8958 }
8959 } else
8960 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008961 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008962 }
8963}
8964
Rafael Espindola1e085772014-08-15 17:14:35 +00008965static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8966 switch (T.getArch()) {
8967 case llvm::Triple::x86:
8968 return "elf_i386";
8969 case llvm::Triple::aarch64:
8970 return "aarch64linux";
8971 case llvm::Triple::aarch64_be:
8972 return "aarch64_be_linux";
8973 case llvm::Triple::arm:
8974 case llvm::Triple::thumb:
8975 return "armelf_linux_eabi";
8976 case llvm::Triple::armeb:
8977 case llvm::Triple::thumbeb:
8978 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8979 case llvm::Triple::ppc:
8980 return "elf32ppclinux";
8981 case llvm::Triple::ppc64:
8982 return "elf64ppc";
8983 case llvm::Triple::ppc64le:
8984 return "elf64lppc";
8985 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008986 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008987 return "elf32_sparc";
8988 case llvm::Triple::sparcv9:
8989 return "elf64_sparc";
8990 case llvm::Triple::mips:
8991 return "elf32btsmip";
8992 case llvm::Triple::mipsel:
8993 return "elf32ltsmip";
8994 case llvm::Triple::mips64:
8995 if (mips::hasMipsAbiArg(Args, "n32"))
8996 return "elf32btsmipn32";
8997 return "elf64btsmip";
8998 case llvm::Triple::mips64el:
8999 if (mips::hasMipsAbiArg(Args, "n32"))
9000 return "elf32ltsmipn32";
9001 return "elf64ltsmip";
9002 case llvm::Triple::systemz:
9003 return "elf64_s390";
9004 case llvm::Triple::x86_64:
9005 if (T.getEnvironment() == llvm::Triple::GNUX32)
9006 return "elf32_x86_64";
9007 return "elf_x86_64";
9008 default:
9009 llvm_unreachable("Unexpected arch");
9010 }
9011}
9012
Douglas Katzman95354292015-06-23 20:42:09 +00009013void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9014 const InputInfo &Output,
9015 const InputInfoList &Inputs,
9016 const ArgList &Args,
9017 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009018 const toolchains::Linux &ToolChain =
9019 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009020 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009021
9022 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9023 llvm::Triple Triple = llvm::Triple(TripleStr);
9024
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009025 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009026 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009027 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009028 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9029 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009030 const bool HasCRTBeginEndFiles =
9031 ToolChain.getTriple().hasEnvironment() ||
9032 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009033
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009034 ArgStringList CmdArgs;
9035
Rafael Espindolad1002f62010-11-15 18:28:16 +00009036 // Silence warning for "clang -g foo.o -o foo"
9037 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009038 // and "clang -emit-llvm foo.o -o foo"
9039 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009040 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009041 // handled somewhere else.
9042 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009043
Peter Collingbourne39719a72015-11-20 20:49:39 +00009044 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9045 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009046 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009047 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009048 CmdArgs.push_back("-target");
9049 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9050 }
9051
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009052 if (!D.SysRoot.empty())
9053 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009054
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009055 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009056 CmdArgs.push_back("-pie");
9057
Rafael Espindola1c76c592010-11-07 22:57:16 +00009058 if (Args.hasArg(options::OPT_rdynamic))
9059 CmdArgs.push_back("-export-dynamic");
9060
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009061 if (Args.hasArg(options::OPT_s))
9062 CmdArgs.push_back("-s");
9063
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009064 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009065 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009066
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009067 for (const auto &Opt : ToolChain.ExtraOpts)
9068 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009069
9070 if (!Args.hasArg(options::OPT_static)) {
9071 CmdArgs.push_back("--eh-frame-hdr");
9072 }
9073
9074 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009075 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009076
9077 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009078 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9079 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009080 CmdArgs.push_back("-Bstatic");
9081 else
9082 CmdArgs.push_back("-static");
9083 } else if (Args.hasArg(options::OPT_shared)) {
9084 CmdArgs.push_back("-shared");
9085 }
9086
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009087 if (!Args.hasArg(options::OPT_static)) {
9088 if (Args.hasArg(options::OPT_rdynamic))
9089 CmdArgs.push_back("-export-dynamic");
9090
9091 if (!Args.hasArg(options::OPT_shared)) {
9092 const std::string Loader =
9093 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9094 CmdArgs.push_back("-dynamic-linker");
9095 CmdArgs.push_back(Args.MakeArgString(Loader));
9096 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009097 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009098
9099 CmdArgs.push_back("-o");
9100 CmdArgs.push_back(Output.getFilename());
9101
Douglas Katzman78b37b02015-11-17 20:28:07 +00009102 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009103 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009104 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009105 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009106 if (Args.hasArg(options::OPT_pg))
9107 crt1 = "gcrt1.o";
9108 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009109 crt1 = "Scrt1.o";
9110 else
9111 crt1 = "crt1.o";
9112 }
9113 if (crt1)
9114 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009115
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009116 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9117 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009118
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009119 const char *crtbegin;
9120 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009121 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009122 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009123 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009124 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009125 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009126 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009127 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009128
9129 if (HasCRTBeginEndFiles)
9130 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009131
9132 // Add crtfastmath.o if available and fast math is enabled.
9133 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009134 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009135
9136 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009137 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009138
Douglas Katzman6059ef92015-11-17 17:41:23 +00009139 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009140
Teresa Johnson945bc502015-10-15 20:35:53 +00009141 if (D.isUsingLTO())
9142 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009143
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009144 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9145 CmdArgs.push_back("--no-demangle");
9146
Alexey Samsonov52550342014-09-15 19:58:40 +00009147 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009148 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009149 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009150 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009151
Douglas Katzman78b37b02015-11-17 20:28:07 +00009152 if (D.CCCIsCXX() &&
9153 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009154 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009155 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009156 if (OnlyLibstdcxxStatic)
9157 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009158 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009159 if (OnlyLibstdcxxStatic)
9160 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009161 CmdArgs.push_back("-lm");
9162 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009163 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9164 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009165
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009166 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009167 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9168 if (Args.hasArg(options::OPT_static))
9169 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009170
Alexey Samsonov52550342014-09-15 19:58:40 +00009171 if (NeedsSanitizerDeps)
9172 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9173
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009174 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9175 Args.hasArg(options::OPT_pthreads);
9176
9177 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9178 options::OPT_fno_openmp, false)) {
9179 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9180 // FIXME: Does this really make sense for all GNU toolchains?
9181 WantPthread = true;
9182
9183 // Also link the particular OpenMP runtimes.
9184 switch (getOpenMPRuntime(ToolChain, Args)) {
9185 case OMPRT_OMP:
9186 CmdArgs.push_back("-lomp");
9187 break;
9188 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009189 CmdArgs.push_back("-lgomp");
9190
9191 // FIXME: Exclude this for platforms with libgomp that don't require
9192 // librt. Most modern Linux platforms require it, but some may not.
9193 CmdArgs.push_back("-lrt");
9194 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009195 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009196 CmdArgs.push_back("-liomp5");
9197 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009198 case OMPRT_Unknown:
9199 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009200 break;
9201 }
Chandler Carruth01538002013-01-17 13:19:29 +00009202 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009203
Renato Golinc4b49242014-02-13 10:01:16 +00009204 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009205
Richard Smith31d1de22015-05-20 22:48:44 +00009206 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009207 CmdArgs.push_back("-lpthread");
9208
Rafael Espindolab17bc532016-01-25 18:29:16 +00009209 if (Args.hasArg(options::OPT_fsplit_stack))
9210 CmdArgs.push_back("--wrap=pthread_create");
9211
Chandler Carruth94a32012012-05-14 18:31:18 +00009212 CmdArgs.push_back("-lc");
9213
9214 if (Args.hasArg(options::OPT_static))
9215 CmdArgs.push_back("--end-group");
9216 else
Renato Golinc4b49242014-02-13 10:01:16 +00009217 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009218 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009219
Rafael Espindola81937ec2010-12-01 01:52:43 +00009220 if (!Args.hasArg(options::OPT_nostartfiles)) {
9221 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009222 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009223 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009224 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009225 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009226 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009227 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009228
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009229 if (HasCRTBeginEndFiles)
9230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009231 if (!isAndroid)
9232 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009233 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009234 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009235
Peter Collingbourne39719a72015-11-20 20:49:39 +00009236 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009237}
9238
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009239// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9240// for the various SFI requirements like register masking. The assembly tool
9241// inserts the file containing the macros as an input into all the assembly
9242// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009243void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9244 const InputInfo &Output,
9245 const InputInfoList &Inputs,
9246 const ArgList &Args,
9247 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009248 const toolchains::NaClToolChain &ToolChain =
9249 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009250 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009251 "nacl-arm-macros.s");
9252 InputInfoList NewInputs;
9253 NewInputs.push_back(NaClMacros);
9254 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009255 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9256 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009257}
9258
Douglas Katzman750cfc52015-06-29 18:42:16 +00009259// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009260// we use static by default, do not yet support sanitizers or LTO, and a few
9261// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009262// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009263void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9264 const InputInfo &Output,
9265 const InputInfoList &Inputs,
9266 const ArgList &Args,
9267 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009268
Douglas Katzman54366072015-07-27 16:53:08 +00009269 const toolchains::NaClToolChain &ToolChain =
9270 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009271 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009272 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009273 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009274 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009275
9276 ArgStringList CmdArgs;
9277
9278 // Silence warning for "clang -g foo.o -o foo"
9279 Args.ClaimAllArgs(options::OPT_g_Group);
9280 // and "clang -emit-llvm foo.o -o foo"
9281 Args.ClaimAllArgs(options::OPT_emit_llvm);
9282 // and for "clang -w foo.o -o foo". Other warning options are already
9283 // handled somewhere else.
9284 Args.ClaimAllArgs(options::OPT_w);
9285
9286 if (!D.SysRoot.empty())
9287 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9288
9289 if (Args.hasArg(options::OPT_rdynamic))
9290 CmdArgs.push_back("-export-dynamic");
9291
9292 if (Args.hasArg(options::OPT_s))
9293 CmdArgs.push_back("-s");
9294
Douglas Katzman54366072015-07-27 16:53:08 +00009295 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9296 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009297 CmdArgs.push_back("--build-id");
9298
9299 if (!IsStatic)
9300 CmdArgs.push_back("--eh-frame-hdr");
9301
9302 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009303 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009304 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009305 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009306 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009307 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009308 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009309 else if (Arch == llvm::Triple::mipsel)
9310 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009311 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009312 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9313 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009314
9315 if (IsStatic)
9316 CmdArgs.push_back("-static");
9317 else if (Args.hasArg(options::OPT_shared))
9318 CmdArgs.push_back("-shared");
9319
9320 CmdArgs.push_back("-o");
9321 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009322 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009323 if (!Args.hasArg(options::OPT_shared))
9324 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9326
9327 const char *crtbegin;
9328 if (IsStatic)
9329 crtbegin = "crtbeginT.o";
9330 else if (Args.hasArg(options::OPT_shared))
9331 crtbegin = "crtbeginS.o";
9332 else
9333 crtbegin = "crtbegin.o";
9334 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9335 }
9336
9337 Args.AddAllArgs(CmdArgs, options::OPT_L);
9338 Args.AddAllArgs(CmdArgs, options::OPT_u);
9339
Douglas Katzman6059ef92015-11-17 17:41:23 +00009340 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009341
9342 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9343 CmdArgs.push_back("--no-demangle");
9344
9345 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9346
Douglas Katzman78b37b02015-11-17 20:28:07 +00009347 if (D.CCCIsCXX() &&
9348 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009349 bool OnlyLibstdcxxStatic =
9350 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009351 if (OnlyLibstdcxxStatic)
9352 CmdArgs.push_back("-Bstatic");
9353 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9354 if (OnlyLibstdcxxStatic)
9355 CmdArgs.push_back("-Bdynamic");
9356 CmdArgs.push_back("-lm");
9357 }
9358
9359 if (!Args.hasArg(options::OPT_nostdlib)) {
9360 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9361 // Always use groups, since it has no effect on dynamic libraries.
9362 CmdArgs.push_back("--start-group");
9363 CmdArgs.push_back("-lc");
9364 // NaCl's libc++ currently requires libpthread, so just always include it
9365 // in the group for C++.
9366 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009367 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009368 // Gold, used by Mips, handles nested groups differently than ld, and
9369 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9370 // which is not a desired behaviour here.
9371 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9372 if (getToolChain().getArch() == llvm::Triple::mipsel)
9373 CmdArgs.push_back("-lnacl");
9374
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009375 CmdArgs.push_back("-lpthread");
9376 }
9377
9378 CmdArgs.push_back("-lgcc");
9379 CmdArgs.push_back("--as-needed");
9380 if (IsStatic)
9381 CmdArgs.push_back("-lgcc_eh");
9382 else
9383 CmdArgs.push_back("-lgcc_s");
9384 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009385
9386 // Mips needs to create and use pnacl_legacy library that contains
9387 // definitions from bitcode/pnaclmm.c and definitions for
9388 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9389 if (getToolChain().getArch() == llvm::Triple::mipsel)
9390 CmdArgs.push_back("-lpnacl_legacy");
9391
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009392 CmdArgs.push_back("--end-group");
9393 }
9394
9395 if (!Args.hasArg(options::OPT_nostartfiles)) {
9396 const char *crtend;
9397 if (Args.hasArg(options::OPT_shared))
9398 crtend = "crtendS.o";
9399 else
9400 crtend = "crtend.o";
9401
9402 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9403 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9404 }
9405 }
9406
Peter Collingbourne39719a72015-11-20 20:49:39 +00009407 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9408 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009409}
9410
Douglas Katzman95354292015-06-23 20:42:09 +00009411void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9412 const InputInfo &Output,
9413 const InputInfoList &Inputs,
9414 const ArgList &Args,
9415 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009416 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009417 ArgStringList CmdArgs;
9418
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009419 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009420
9421 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009422 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009423
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009424 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009425 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009426
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009427 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009428 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009429}
9430
Douglas Katzman95354292015-06-23 20:42:09 +00009431void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9432 const InputInfo &Output,
9433 const InputInfoList &Inputs,
9434 const ArgList &Args,
9435 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009436 const Driver &D = getToolChain().getDriver();
9437 ArgStringList CmdArgs;
9438
Daniel Dunbarb440f562010-08-02 02:38:21 +00009439 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009440 CmdArgs.push_back("-o");
9441 CmdArgs.push_back(Output.getFilename());
9442 } else {
9443 assert(Output.isNothing() && "Invalid output.");
9444 }
9445
Douglas Katzman78b37b02015-11-17 20:28:07 +00009446 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009447 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9448 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9449 CmdArgs.push_back(
9450 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9451 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009452 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009453
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009454 Args.AddAllArgs(CmdArgs,
9455 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009456
Daniel Dunbar54423b22010-09-17 00:24:54 +00009457 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009458
Xinliang David Li69306c02015-10-22 06:15:31 +00009459 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009460
Douglas Katzman78b37b02015-11-17 20:28:07 +00009461 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009462 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009463 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009464 CmdArgs.push_back("-lm");
9465 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009466 }
9467
Douglas Katzman78b37b02015-11-17 20:28:07 +00009468 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009469 if (Args.hasArg(options::OPT_pthread))
9470 CmdArgs.push_back("-lpthread");
9471 CmdArgs.push_back("-lc");
9472 CmdArgs.push_back("-lCompilerRT-Generic");
9473 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9474 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009475 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009476 }
9477
Logan Chieneb9162f2014-06-26 14:23:45 +00009478 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009479 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009480}
9481
Daniel Dunbarcc912342009-05-02 18:28:39 +00009482/// DragonFly Tools
9483
9484// For now, DragonFly Assemble does just about the same as for
9485// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009486void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9487 const InputInfo &Output,
9488 const InputInfoList &Inputs,
9489 const ArgList &Args,
9490 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009491 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009492 ArgStringList CmdArgs;
9493
9494 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9495 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009496 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009497 CmdArgs.push_back("--32");
9498
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009499 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009500
9501 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009502 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009504 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009505 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009506
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009507 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009508 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009509}
9510
Douglas Katzman95354292015-06-23 20:42:09 +00009511void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9512 const InputInfo &Output,
9513 const InputInfoList &Inputs,
9514 const ArgList &Args,
9515 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009516 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009517 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009518
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009519 if (!D.SysRoot.empty())
9520 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9521
John McCall65b8da02013-04-11 22:55:55 +00009522 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009523 if (Args.hasArg(options::OPT_static)) {
9524 CmdArgs.push_back("-Bstatic");
9525 } else {
John McCall65b8da02013-04-11 22:55:55 +00009526 if (Args.hasArg(options::OPT_rdynamic))
9527 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009528 if (Args.hasArg(options::OPT_shared))
9529 CmdArgs.push_back("-Bshareable");
9530 else {
9531 CmdArgs.push_back("-dynamic-linker");
9532 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9533 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009534 CmdArgs.push_back("--hash-style=gnu");
9535 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009536 }
9537
9538 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9539 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009540 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009541 CmdArgs.push_back("-m");
9542 CmdArgs.push_back("elf_i386");
9543 }
9544
Daniel Dunbarb440f562010-08-02 02:38:21 +00009545 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009546 CmdArgs.push_back("-o");
9547 CmdArgs.push_back(Output.getFilename());
9548 } else {
9549 assert(Output.isNothing() && "Invalid output.");
9550 }
9551
Douglas Katzman78b37b02015-11-17 20:28:07 +00009552 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009553 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009554 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009555 CmdArgs.push_back(
9556 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009557 else {
9558 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009559 CmdArgs.push_back(
9560 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009561 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009562 CmdArgs.push_back(
9563 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009564 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009565 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009566 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009567 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009568 CmdArgs.push_back(
9569 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009570 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009571 CmdArgs.push_back(
9572 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009573 }
9574
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009575 Args.AddAllArgs(CmdArgs,
9576 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009577
Daniel Dunbar54423b22010-09-17 00:24:54 +00009578 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009579
Douglas Katzman78b37b02015-11-17 20:28:07 +00009580 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009581 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009582
9583 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009584 CmdArgs.push_back("-rpath");
9585 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009586 }
9587
Hans Wennborg70850d82013-07-18 20:29:38 +00009588 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009589 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009590 CmdArgs.push_back("-lm");
9591 }
9592
Daniel Dunbarcc912342009-05-02 18:28:39 +00009593 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009594 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009595
9596 if (!Args.hasArg(options::OPT_nolibc)) {
9597 CmdArgs.push_back("-lc");
9598 }
9599
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009600 if (Args.hasArg(options::OPT_static) ||
9601 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009602 CmdArgs.push_back("-lgcc");
9603 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009604 } else {
9605 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009606 CmdArgs.push_back("-lgcc_pic");
9607 if (!Args.hasArg(options::OPT_shared))
9608 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009609 } else {
John McCall65b8da02013-04-11 22:55:55 +00009610 CmdArgs.push_back("-lgcc");
9611 CmdArgs.push_back("--as-needed");
9612 CmdArgs.push_back("-lgcc_pic");
9613 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009614 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009615 }
9616 }
9617
Douglas Katzman78b37b02015-11-17 20:28:07 +00009618 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009619 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009620 CmdArgs.push_back(
9621 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009622 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009623 CmdArgs.push_back(
9624 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9625 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009626 }
9627
Xinliang David Li69306c02015-10-22 06:15:31 +00009628 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009629
Logan Chieneb9162f2014-06-26 14:23:45 +00009630 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009631 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009632}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009633
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009634// Try to find Exe from a Visual Studio distribution. This first tries to find
9635// an installed copy of Visual Studio and, failing that, looks in the PATH,
9636// making sure that whatever executable that's found is not a same-named exe
9637// from clang itself to prevent clang from falling back to itself.
9638static std::string FindVisualStudioExecutable(const ToolChain &TC,
9639 const char *Exe,
9640 const char *ClangProgramPath) {
9641 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9642 std::string visualStudioBinDir;
9643 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9644 visualStudioBinDir)) {
9645 SmallString<128> FilePath(visualStudioBinDir);
9646 llvm::sys::path::append(FilePath, Exe);
9647 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9648 return FilePath.str();
9649 }
9650
9651 return Exe;
9652}
9653
Douglas Katzman95354292015-06-23 20:42:09 +00009654void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9655 const InputInfo &Output,
9656 const InputInfoList &Inputs,
9657 const ArgList &Args,
9658 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009659 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009660 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009661
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009662 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9663 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009664 CmdArgs.push_back(
9665 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009666
Douglas Katzman78b37b02015-11-17 20:28:07 +00009667 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9668 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009669 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009670
Zachary Turner10d75b22014-10-22 20:40:43 +00009671 if (!llvm::sys::Process::GetEnv("LIB")) {
9672 // If the VC environment hasn't been configured (perhaps because the user
9673 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009674 // the environment variable is set however, assume the user knows what
9675 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009676 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009677 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009678 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9679 SmallString<128> LibDir(VisualStudioDir);
9680 llvm::sys::path::append(LibDir, "VC", "lib");
9681 switch (MSVC.getArch()) {
9682 case llvm::Triple::x86:
9683 // x86 just puts the libraries directly in lib
9684 break;
9685 case llvm::Triple::x86_64:
9686 llvm::sys::path::append(LibDir, "amd64");
9687 break;
9688 case llvm::Triple::arm:
9689 llvm::sys::path::append(LibDir, "arm");
9690 break;
9691 default:
9692 break;
9693 }
9694 CmdArgs.push_back(
9695 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009696
9697 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9698 std::string UniversalCRTLibPath;
9699 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9700 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9701 UniversalCRTLibPath.c_str()));
9702 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009703 }
9704
9705 std::string WindowsSdkLibPath;
9706 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9707 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9708 WindowsSdkLibPath.c_str()));
9709 }
9710
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009711 CmdArgs.push_back("-nologo");
9712
Reid Kleckner124955a2015-08-05 18:51:13 +00009713 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009714 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009715
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009716 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009717 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009718 if (DLL) {
9719 CmdArgs.push_back(Args.MakeArgString("-dll"));
9720
9721 SmallString<128> ImplibName(Output.getFilename());
9722 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009723 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009724 }
9725
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009726 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009727 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009728 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009729 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009730 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9731 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009732 // Make sure the dynamic runtime thunk is not optimized out at link time
9733 // to ensure proper SEH handling.
9734 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009735 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009736 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009737 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009738 for (const auto &Lib : {"asan", "asan_cxx"})
9739 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009740 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009741 }
9742
Hans Wennborg2e274592013-08-13 23:38:57 +00009743 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009744
Alexey Bataevc7e84352015-08-19 04:49:01 +00009745 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9746 options::OPT_fno_openmp, false)) {
9747 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9748 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9749 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9750 TC.getDriver().Dir + "/../lib"));
9751 switch (getOpenMPRuntime(getToolChain(), Args)) {
9752 case OMPRT_OMP:
9753 CmdArgs.push_back("-defaultlib:libomp.lib");
9754 break;
9755 case OMPRT_IOMP5:
9756 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9757 break;
9758 case OMPRT_GOMP:
9759 break;
9760 case OMPRT_Unknown:
9761 // Already diagnosed.
9762 break;
9763 }
9764 }
9765
Andrey Turetskiya4868572016-03-14 11:19:43 +00009766 // Add compiler-rt lib in case if it was explicitly
9767 // specified as an argument for --rtlib option.
9768 if (!Args.hasArg(options::OPT_nostdlib)) {
9769 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9770 }
9771
Reid Kleckner337188f2014-09-16 19:22:00 +00009772 // Add filenames, libraries, and other linker inputs.
9773 for (const auto &Input : Inputs) {
9774 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009775 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009776 continue;
9777 }
9778
9779 const Arg &A = Input.getInputArg();
9780
9781 // Render -l options differently for the MSVC linker.
9782 if (A.getOption().matches(options::OPT_l)) {
9783 StringRef Lib = A.getValue();
9784 const char *LinkLibArg;
9785 if (Lib.endswith(".lib"))
9786 LinkLibArg = Args.MakeArgString(Lib);
9787 else
9788 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9789 CmdArgs.push_back(LinkLibArg);
9790 continue;
9791 }
9792
9793 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9794 // or -L. Render it, even if MSVC doesn't understand it.
9795 A.renderAsInput(Args, CmdArgs);
9796 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009797
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009798 TC.addProfileRTLibs(Args, CmdArgs);
9799
Zachary Turner719f58c2014-12-01 23:06:47 +00009800 // We need to special case some linker paths. In the case of lld, we need to
9801 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9802 // linker, we need to use a special search algorithm.
9803 llvm::SmallString<128> linkPath;
9804 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9805 if (Linker.equals_lower("lld"))
9806 Linker = "lld-link";
9807
9808 if (Linker.equals_lower("link")) {
9809 // If we're using the MSVC linker, it's not sufficient to just use link
9810 // from the program PATH, because other environments like GnuWin32 install
9811 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009812 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009813 C.getDriver().getClangProgramPath());
9814 } else {
9815 linkPath = Linker;
9816 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009817 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009818 }
9819
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009820 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009821 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009822}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009823
Douglas Katzman95354292015-06-23 20:42:09 +00009824void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9825 const InputInfo &Output,
9826 const InputInfoList &Inputs,
9827 const ArgList &Args,
9828 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009829 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9830}
9831
Douglas Katzman95354292015-06-23 20:42:09 +00009832std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009833 Compilation &C, const JobAction &JA, const InputInfo &Output,
9834 const InputInfoList &Inputs, const ArgList &Args,
9835 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009836 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009837 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009838 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009839 CmdArgs.push_back("/W0"); // No warnings.
9840
9841 // The goal is to be able to invoke this tool correctly based on
9842 // any flag accepted by clang-cl.
9843
9844 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009845 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009846
9847 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009848 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9849 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9850 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009851 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9852 if (A->getOption().getID() == options::OPT_O0) {
9853 CmdArgs.push_back("/Od");
9854 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009855 CmdArgs.push_back("/Og");
9856
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009857 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009858 if (OptLevel == "s" || OptLevel == "z")
9859 CmdArgs.push_back("/Os");
9860 else
9861 CmdArgs.push_back("/Ot");
9862
9863 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009864 }
9865 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009866 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9867 options::OPT_fno_omit_frame_pointer))
9868 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9869 ? "/Oy"
9870 : "/Oy-");
9871 if (!Args.hasArg(options::OPT_fwritable_strings))
9872 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009873
Nico Weber3f8dafb2015-03-12 19:37:10 +00009874 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009875 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9876
David Majnemerf6072342014-07-01 22:24:56 +00009877 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9878 /*default=*/false))
9879 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009880 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9881 options::OPT_fno_function_sections))
9882 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9883 ? "/Gy"
9884 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009885 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9886 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009887 CmdArgs.push_back(
9888 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009889 if (Args.hasArg(options::OPT_fsyntax_only))
9890 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009891 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9892 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009893 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009894
Nico Weber3f8dafb2015-03-12 19:37:10 +00009895 std::vector<std::string> Includes =
9896 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009897 for (const auto &Include : Includes)
9898 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009899
Hans Wennborg87cfa712013-09-19 20:32:16 +00009900 // Flags that can simply be passed through.
9901 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9902 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009903 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9904 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009905 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009906 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009907
9908 // The order of these flags is relevant, so pick the last one.
9909 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9910 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9911 A->render(Args, CmdArgs);
9912
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009913 // Pass through all unknown arguments so that the fallback command can see
9914 // them too.
9915 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9916
Hans Wennborg87cfa712013-09-19 20:32:16 +00009917 // Input filename.
9918 assert(Inputs.size() == 1);
9919 const InputInfo &II = Inputs[0];
9920 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9921 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9922 if (II.isFilename())
9923 CmdArgs.push_back(II.getFilename());
9924 else
9925 II.getInputArg().renderAsInput(Args, CmdArgs);
9926
9927 // Output filename.
9928 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009929 const char *Fo =
9930 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009931 CmdArgs.push_back(Fo);
9932
Hans Wennborg188382e2013-09-20 18:16:35 +00009933 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009934 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9935 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009936 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009937 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009938}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009939
Yaron Keren1c0070c2015-07-02 04:45:27 +00009940/// MinGW Tools
9941void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9942 const InputInfo &Output,
9943 const InputInfoList &Inputs,
9944 const ArgList &Args,
9945 const char *LinkingOutput) const {
9946 claimNoWarnArgs(Args);
9947 ArgStringList CmdArgs;
9948
9949 if (getToolChain().getArch() == llvm::Triple::x86) {
9950 CmdArgs.push_back("--32");
9951 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9952 CmdArgs.push_back("--64");
9953 }
9954
9955 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9956
9957 CmdArgs.push_back("-o");
9958 CmdArgs.push_back(Output.getFilename());
9959
9960 for (const auto &II : Inputs)
9961 CmdArgs.push_back(II.getFilename());
9962
9963 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009964 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009965
9966 if (Args.hasArg(options::OPT_gsplit_dwarf))
9967 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9968 SplitDebugName(Args, Inputs[0]));
9969}
9970
9971void MinGW::Linker::AddLibGCC(const ArgList &Args,
9972 ArgStringList &CmdArgs) const {
9973 if (Args.hasArg(options::OPT_mthreads))
9974 CmdArgs.push_back("-lmingwthrd");
9975 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009976
Yaron Kerenaa281332015-08-09 00:24:07 +00009977 // Make use of compiler-rt if --rtlib option is used
9978 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9979 if (RLT == ToolChain::RLT_Libgcc) {
9980 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9981 Args.hasArg(options::OPT_static);
9982 bool Shared = Args.hasArg(options::OPT_shared);
9983 bool CXX = getToolChain().getDriver().CCCIsCXX();
9984
9985 if (Static || (!CXX && !Shared)) {
9986 CmdArgs.push_back("-lgcc");
9987 CmdArgs.push_back("-lgcc_eh");
9988 } else {
9989 CmdArgs.push_back("-lgcc_s");
9990 CmdArgs.push_back("-lgcc");
9991 }
9992 } else {
9993 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9994 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009995
Yaron Keren1c0070c2015-07-02 04:45:27 +00009996 CmdArgs.push_back("-lmoldname");
9997 CmdArgs.push_back("-lmingwex");
9998 CmdArgs.push_back("-lmsvcrt");
9999}
10000
10001void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10002 const InputInfo &Output,
10003 const InputInfoList &Inputs,
10004 const ArgList &Args,
10005 const char *LinkingOutput) const {
10006 const ToolChain &TC = getToolChain();
10007 const Driver &D = TC.getDriver();
10008 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10009
10010 ArgStringList CmdArgs;
10011
10012 // Silence warning for "clang -g foo.o -o foo"
10013 Args.ClaimAllArgs(options::OPT_g_Group);
10014 // and "clang -emit-llvm foo.o -o foo"
10015 Args.ClaimAllArgs(options::OPT_emit_llvm);
10016 // and for "clang -w foo.o -o foo". Other warning options are already
10017 // handled somewhere else.
10018 Args.ClaimAllArgs(options::OPT_w);
10019
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010020 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10021 if (LinkerName.equals_lower("lld")) {
10022 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010023 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010024 } else if (!LinkerName.equals_lower("ld")) {
10025 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010026 }
10027
Yaron Keren1c0070c2015-07-02 04:45:27 +000010028 if (!D.SysRoot.empty())
10029 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10030
10031 if (Args.hasArg(options::OPT_s))
10032 CmdArgs.push_back("-s");
10033
10034 CmdArgs.push_back("-m");
10035 if (TC.getArch() == llvm::Triple::x86)
10036 CmdArgs.push_back("i386pe");
10037 if (TC.getArch() == llvm::Triple::x86_64)
10038 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010039 if (TC.getArch() == llvm::Triple::arm)
10040 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010041
10042 if (Args.hasArg(options::OPT_mwindows)) {
10043 CmdArgs.push_back("--subsystem");
10044 CmdArgs.push_back("windows");
10045 } else if (Args.hasArg(options::OPT_mconsole)) {
10046 CmdArgs.push_back("--subsystem");
10047 CmdArgs.push_back("console");
10048 }
10049
10050 if (Args.hasArg(options::OPT_static))
10051 CmdArgs.push_back("-Bstatic");
10052 else {
10053 if (Args.hasArg(options::OPT_mdll))
10054 CmdArgs.push_back("--dll");
10055 else if (Args.hasArg(options::OPT_shared))
10056 CmdArgs.push_back("--shared");
10057 CmdArgs.push_back("-Bdynamic");
10058 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10059 CmdArgs.push_back("-e");
10060 if (TC.getArch() == llvm::Triple::x86)
10061 CmdArgs.push_back("_DllMainCRTStartup@12");
10062 else
10063 CmdArgs.push_back("DllMainCRTStartup");
10064 CmdArgs.push_back("--enable-auto-image-base");
10065 }
10066 }
10067
10068 CmdArgs.push_back("-o");
10069 CmdArgs.push_back(Output.getFilename());
10070
10071 Args.AddAllArgs(CmdArgs, options::OPT_e);
10072 // FIXME: add -N, -n flags
10073 Args.AddLastArg(CmdArgs, options::OPT_r);
10074 Args.AddLastArg(CmdArgs, options::OPT_s);
10075 Args.AddLastArg(CmdArgs, options::OPT_t);
10076 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10077 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10078
Douglas Katzman78b37b02015-11-17 20:28:07 +000010079 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010080 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10081 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10082 } else {
10083 if (Args.hasArg(options::OPT_municode))
10084 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10085 else
10086 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10087 }
10088 if (Args.hasArg(options::OPT_pg))
10089 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10090 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10091 }
10092
10093 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010094 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010095 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10096
10097 // TODO: Add ASan stuff here
10098
10099 // TODO: Add profile stuff here
10100
Douglas Katzman78b37b02015-11-17 20:28:07 +000010101 if (D.CCCIsCXX() &&
10102 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010103 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10104 !Args.hasArg(options::OPT_static);
10105 if (OnlyLibstdcxxStatic)
10106 CmdArgs.push_back("-Bstatic");
10107 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10108 if (OnlyLibstdcxxStatic)
10109 CmdArgs.push_back("-Bdynamic");
10110 }
10111
10112 if (!Args.hasArg(options::OPT_nostdlib)) {
10113 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10114 if (Args.hasArg(options::OPT_static))
10115 CmdArgs.push_back("--start-group");
10116
10117 if (Args.hasArg(options::OPT_fstack_protector) ||
10118 Args.hasArg(options::OPT_fstack_protector_strong) ||
10119 Args.hasArg(options::OPT_fstack_protector_all)) {
10120 CmdArgs.push_back("-lssp_nonshared");
10121 CmdArgs.push_back("-lssp");
10122 }
10123 if (Args.hasArg(options::OPT_fopenmp))
10124 CmdArgs.push_back("-lgomp");
10125
10126 AddLibGCC(Args, CmdArgs);
10127
10128 if (Args.hasArg(options::OPT_pg))
10129 CmdArgs.push_back("-lgmon");
10130
Yaron Kerenadce68e2015-07-06 18:52:19 +000010131 if (Args.hasArg(options::OPT_pthread))
10132 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010133
10134 // add system libraries
10135 if (Args.hasArg(options::OPT_mwindows)) {
10136 CmdArgs.push_back("-lgdi32");
10137 CmdArgs.push_back("-lcomdlg32");
10138 }
10139 CmdArgs.push_back("-ladvapi32");
10140 CmdArgs.push_back("-lshell32");
10141 CmdArgs.push_back("-luser32");
10142 CmdArgs.push_back("-lkernel32");
10143
10144 if (Args.hasArg(options::OPT_static))
10145 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010146 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010147 AddLibGCC(Args, CmdArgs);
10148 }
10149
10150 if (!Args.hasArg(options::OPT_nostartfiles)) {
10151 // Add crtfastmath.o if available and fast math is enabled.
10152 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10153
10154 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10155 }
10156 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010157 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010158 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010159}
10160
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010161/// XCore Tools
10162// We pass assemble and link construction to the xcc tool.
10163
Douglas Katzman95354292015-06-23 20:42:09 +000010164void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10165 const InputInfo &Output,
10166 const InputInfoList &Inputs,
10167 const ArgList &Args,
10168 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010169 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010170 ArgStringList CmdArgs;
10171
10172 CmdArgs.push_back("-o");
10173 CmdArgs.push_back(Output.getFilename());
10174
10175 CmdArgs.push_back("-c");
10176
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010177 if (Args.hasArg(options::OPT_v))
10178 CmdArgs.push_back("-v");
10179
Robert Lytton894d25c2014-05-02 09:33:25 +000010180 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10181 if (!A->getOption().matches(options::OPT_g0))
10182 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010183
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010184 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10185 false))
10186 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010187
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010188 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010189
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010190 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010191 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010192
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010193 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010194 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010195}
10196
Douglas Katzman95354292015-06-23 20:42:09 +000010197void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10198 const InputInfo &Output,
10199 const InputInfoList &Inputs,
10200 const ArgList &Args,
10201 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010202 ArgStringList CmdArgs;
10203
10204 if (Output.isFilename()) {
10205 CmdArgs.push_back("-o");
10206 CmdArgs.push_back(Output.getFilename());
10207 } else {
10208 assert(Output.isNothing() && "Invalid output.");
10209 }
10210
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010211 if (Args.hasArg(options::OPT_v))
10212 CmdArgs.push_back("-v");
10213
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010214 // Pass -fexceptions through to the linker if it was present.
10215 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10216 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010217 CmdArgs.push_back("-fexceptions");
10218
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010219 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10220
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010221 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010222 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010223}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010224
Douglas Katzman95354292015-06-23 20:42:09 +000010225void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10226 const InputInfo &Output,
10227 const InputInfoList &Inputs,
10228 const ArgList &Args,
10229 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010230 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010231 const auto &TC =
10232 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10233 ArgStringList CmdArgs;
10234 const char *Exec;
10235
10236 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010237 default:
10238 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010239 case llvm::Triple::arm:
10240 case llvm::Triple::thumb:
10241 break;
10242 case llvm::Triple::x86:
10243 CmdArgs.push_back("--32");
10244 break;
10245 case llvm::Triple::x86_64:
10246 CmdArgs.push_back("--64");
10247 break;
10248 }
10249
10250 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10251
10252 CmdArgs.push_back("-o");
10253 CmdArgs.push_back(Output.getFilename());
10254
10255 for (const auto &Input : Inputs)
10256 CmdArgs.push_back(Input.getFilename());
10257
10258 const std::string Assembler = TC.GetProgramPath("as");
10259 Exec = Args.MakeArgString(Assembler);
10260
Justin Bognerd3371d82015-07-17 03:35:54 +000010261 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010262}
10263
Douglas Katzman95354292015-06-23 20:42:09 +000010264void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10265 const InputInfo &Output,
10266 const InputInfoList &Inputs,
10267 const ArgList &Args,
10268 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010269 const auto &TC =
10270 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10271 const llvm::Triple &T = TC.getTriple();
10272 const Driver &D = TC.getDriver();
10273 SmallString<128> EntryPoint;
10274 ArgStringList CmdArgs;
10275 const char *Exec;
10276
10277 // Silence warning for "clang -g foo.o -o foo"
10278 Args.ClaimAllArgs(options::OPT_g_Group);
10279 // and "clang -emit-llvm foo.o -o foo"
10280 Args.ClaimAllArgs(options::OPT_emit_llvm);
10281 // and for "clang -w foo.o -o foo"
10282 Args.ClaimAllArgs(options::OPT_w);
10283 // Other warning options are already handled somewhere else.
10284
10285 if (!D.SysRoot.empty())
10286 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10287
10288 if (Args.hasArg(options::OPT_pie))
10289 CmdArgs.push_back("-pie");
10290 if (Args.hasArg(options::OPT_rdynamic))
10291 CmdArgs.push_back("-export-dynamic");
10292 if (Args.hasArg(options::OPT_s))
10293 CmdArgs.push_back("--strip-all");
10294
10295 CmdArgs.push_back("-m");
10296 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010297 default:
10298 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010299 case llvm::Triple::arm:
10300 case llvm::Triple::thumb:
10301 // FIXME: this is incorrect for WinCE
10302 CmdArgs.push_back("thumb2pe");
10303 break;
10304 case llvm::Triple::x86:
10305 CmdArgs.push_back("i386pe");
10306 EntryPoint.append("_");
10307 break;
10308 case llvm::Triple::x86_64:
10309 CmdArgs.push_back("i386pep");
10310 break;
10311 }
10312
10313 if (Args.hasArg(options::OPT_shared)) {
10314 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010315 default:
10316 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010317 case llvm::Triple::arm:
10318 case llvm::Triple::thumb:
10319 case llvm::Triple::x86_64:
10320 EntryPoint.append("_DllMainCRTStartup");
10321 break;
10322 case llvm::Triple::x86:
10323 EntryPoint.append("_DllMainCRTStartup@12");
10324 break;
10325 }
10326
10327 CmdArgs.push_back("-shared");
10328 CmdArgs.push_back("-Bdynamic");
10329
10330 CmdArgs.push_back("--enable-auto-image-base");
10331
10332 CmdArgs.push_back("--entry");
10333 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10334 } else {
10335 EntryPoint.append("mainCRTStartup");
10336
10337 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10338 : "-Bdynamic");
10339
Douglas Katzman78b37b02015-11-17 20:28:07 +000010340 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010341 CmdArgs.push_back("--entry");
10342 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10343 }
10344
10345 // FIXME: handle subsystem
10346 }
10347
10348 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010349 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010350
10351 CmdArgs.push_back("-o");
10352 CmdArgs.push_back(Output.getFilename());
10353
10354 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10355 SmallString<261> ImpLib(Output.getFilename());
10356 llvm::sys::path::replace_extension(ImpLib, ".lib");
10357
10358 CmdArgs.push_back("--out-implib");
10359 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10360 }
10361
Douglas Katzman78b37b02015-11-17 20:28:07 +000010362 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010363 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10364 const char *CRTBegin;
10365
10366 CRTBegin =
10367 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10368 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10369 }
10370
10371 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010372 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010373 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10374
10375 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10376 !Args.hasArg(options::OPT_nodefaultlibs)) {
10377 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10378 !Args.hasArg(options::OPT_static);
10379 if (StaticCXX)
10380 CmdArgs.push_back("-Bstatic");
10381 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10382 if (StaticCXX)
10383 CmdArgs.push_back("-Bdynamic");
10384 }
10385
10386 if (!Args.hasArg(options::OPT_nostdlib)) {
10387 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10388 // TODO handle /MT[d] /MD[d]
10389 CmdArgs.push_back("-lmsvcrt");
10390 AddRunTimeLibs(TC, D, CmdArgs, Args);
10391 }
10392 }
10393
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010394 if (TC.getSanitizerArgs().needsAsanRt()) {
10395 // TODO handle /MT[d] /MD[d]
10396 if (Args.hasArg(options::OPT_shared)) {
10397 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10398 } else {
10399 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10400 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10401 // Make sure the dynamic runtime thunk is not optimized out at link time
10402 // to ensure proper SEH handling.
10403 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10404 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10405 ? "___asan_seh_interceptor"
10406 : "__asan_seh_interceptor"));
10407 }
10408 }
10409
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010410 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010411
Justin Bognerd3371d82015-07-17 03:35:54 +000010412 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010413}
Douglas Katzman84a75642015-06-19 14:55:19 +000010414
Douglas Katzman95354292015-06-23 20:42:09 +000010415void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10416 const InputInfo &Output,
10417 const InputInfoList &Inputs,
10418 const ArgList &Args,
10419 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010420 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010421 assert(Inputs.size() == 1);
10422 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010423 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10424 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010425
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010426 if (JA.getKind() == Action::PreprocessJobClass) {
10427 Args.ClaimAllArgs();
10428 CmdArgs.push_back("-E");
10429 } else {
10430 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10431 CmdArgs.push_back("-S");
10432 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10433 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010434 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010435 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010436
Douglas Katzmanf6071112015-08-03 14:34:22 +000010437 // Append all -I, -iquote, -isystem paths, defines/undefines,
10438 // 'f' flags, optimize flags, and warning options.
10439 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010440 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010441 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010442 options::OPT_f_Group, options::OPT_f_clang_Group,
10443 options::OPT_g_Group, options::OPT_M_Group,
10444 options::OPT_O_Group, options::OPT_W_Group});
10445
10446 // If we're producing a dependency file, and assembly is the final action,
10447 // then the name of the target in the dependency file should be the '.o'
10448 // file, not the '.s' file produced by this step. For example, instead of
10449 // /tmp/mumble.s: mumble.c .../someheader.h
10450 // the filename on the lefthand side should be "mumble.o"
10451 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10452 C.getActions().size() == 1 &&
10453 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10454 Arg *A = Args.getLastArg(options::OPT_o);
10455 if (A) {
10456 CmdArgs.push_back("-MT");
10457 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10458 }
10459 }
10460
Douglas Katzman84a75642015-06-19 14:55:19 +000010461 CmdArgs.push_back(II.getFilename());
10462 CmdArgs.push_back("-o");
10463 CmdArgs.push_back(Output.getFilename());
10464
10465 std::string Exec =
10466 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010467 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10468 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010469}
10470
Douglas Katzman95354292015-06-23 20:42:09 +000010471void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10472 const InputInfo &Output,
10473 const InputInfoList &Inputs,
10474 const ArgList &Args,
10475 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010476 ArgStringList CmdArgs;
10477
10478 assert(Inputs.size() == 1);
10479 const InputInfo &II = Inputs[0];
10480 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10481 assert(Output.getType() == types::TY_Object);
10482
10483 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010484 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010485 CmdArgs.push_back("-noSPrefixing");
10486 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010487 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10488 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10489 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010490 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010491 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010492 }
10493 CmdArgs.push_back("-elf"); // Output format.
10494 CmdArgs.push_back(II.getFilename());
10495 CmdArgs.push_back(
10496 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10497
10498 std::string Exec =
10499 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010500 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10501 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010502}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010503
10504void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10505 const InputInfo &Output,
10506 const InputInfoList &Inputs,
10507 const ArgList &Args,
10508 const char *LinkingOutput) const {
10509 const auto &TC =
10510 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10511 const llvm::Triple &T = TC.getTriple();
10512 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010513 bool UseStartfiles =
10514 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010515 bool UseDefaultLibs =
10516 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010517
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010518 if (T.getArch() == llvm::Triple::sparc)
10519 CmdArgs.push_back("-EB");
10520 else // SHAVE assumes little-endian, and sparcel is expressly so.
10521 CmdArgs.push_back("-EL");
10522
10523 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10524 // but we never pass through a --sysroot option and various other bits.
10525 // For example, there are no sanitizers (yet) nor gold linker.
10526
10527 // Eat some arguments that may be present but have no effect.
10528 Args.ClaimAllArgs(options::OPT_g_Group);
10529 Args.ClaimAllArgs(options::OPT_w);
10530 Args.ClaimAllArgs(options::OPT_static_libgcc);
10531
10532 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10533 CmdArgs.push_back("-s");
10534
10535 CmdArgs.push_back("-o");
10536 CmdArgs.push_back(Output.getFilename());
10537
10538 if (UseStartfiles) {
10539 // If you want startfiles, it means you want the builtin crti and crtbegin,
10540 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010541 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10542 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010543 }
10544
10545 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10546 options::OPT_e, options::OPT_s, options::OPT_t,
10547 options::OPT_Z_Flag, options::OPT_r});
10548
Douglas Katzman674a3122015-11-18 16:24:46 +000010549 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010550
10551 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10552
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010553 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010554 if (C.getDriver().CCCIsCXX())
10555 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010556 if (T.getOS() == llvm::Triple::RTEMS) {
10557 CmdArgs.push_back("--start-group");
10558 CmdArgs.push_back("-lc");
10559 // You must provide your own "-L" option to enable finding these.
10560 CmdArgs.push_back("-lrtemscpu");
10561 CmdArgs.push_back("-lrtemsbsp");
10562 CmdArgs.push_back("--end-group");
10563 } else {
10564 CmdArgs.push_back("-lc");
10565 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010566 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010567 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010568 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010569 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10570 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010571 }
10572
10573 std::string Exec =
10574 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10575 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10576 CmdArgs, Inputs));
10577}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010578
10579void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10580 const InputInfo &Output,
10581 const InputInfoList &Inputs,
10582 const ArgList &Args,
10583 const char *LinkingOutput) const {
10584 claimNoWarnArgs(Args);
10585 ArgStringList CmdArgs;
10586
10587 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10588
10589 CmdArgs.push_back("-o");
10590 CmdArgs.push_back(Output.getFilename());
10591
10592 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10593 const InputInfo &Input = Inputs[0];
10594 assert(Input.isFilename() && "Invalid input.");
10595 CmdArgs.push_back(Input.getFilename());
10596
10597 const char *Exec =
10598 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10599 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10600}
10601
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010602static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10603 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10604 if (SanArgs.needsUbsanRt()) {
10605 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10606 }
10607 if (SanArgs.needsAsanRt()) {
10608 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10609 }
10610}
10611
10612static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10613 const JobAction &JA, const InputInfo &Output,
10614 const InputInfoList &Inputs,
10615 const ArgList &Args,
10616 const char *LinkingOutput) {
10617 const toolchains::FreeBSD &ToolChain =
10618 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10619 const Driver &D = ToolChain.getDriver();
10620 ArgStringList CmdArgs;
10621
10622 // Silence warning for "clang -g foo.o -o foo"
10623 Args.ClaimAllArgs(options::OPT_g_Group);
10624 // and "clang -emit-llvm foo.o -o foo"
10625 Args.ClaimAllArgs(options::OPT_emit_llvm);
10626 // and for "clang -w foo.o -o foo". Other warning options are already
10627 // handled somewhere else.
10628 Args.ClaimAllArgs(options::OPT_w);
10629
10630 if (!D.SysRoot.empty())
10631 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10632
10633 if (Args.hasArg(options::OPT_pie))
10634 CmdArgs.push_back("-pie");
10635
10636 if (Args.hasArg(options::OPT_rdynamic))
10637 CmdArgs.push_back("-export-dynamic");
10638 if (Args.hasArg(options::OPT_shared))
10639 CmdArgs.push_back("--oformat=so");
10640
10641 if (Output.isFilename()) {
10642 CmdArgs.push_back("-o");
10643 CmdArgs.push_back(Output.getFilename());
10644 } else {
10645 assert(Output.isNothing() && "Invalid output.");
10646 }
10647
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010648 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10649
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010650 Args.AddAllArgs(CmdArgs, options::OPT_L);
10651 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10652 Args.AddAllArgs(CmdArgs, options::OPT_e);
10653 Args.AddAllArgs(CmdArgs, options::OPT_s);
10654 Args.AddAllArgs(CmdArgs, options::OPT_t);
10655 Args.AddAllArgs(CmdArgs, options::OPT_r);
10656
10657 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10658 CmdArgs.push_back("--no-demangle");
10659
10660 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10661
10662 if (Args.hasArg(options::OPT_pthread)) {
10663 CmdArgs.push_back("-lpthread");
10664 }
10665
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010666 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10667
10668 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10669}
10670
10671static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10672 const JobAction &JA, const InputInfo &Output,
10673 const InputInfoList &Inputs,
10674 const ArgList &Args,
10675 const char *LinkingOutput) {
10676 const toolchains::FreeBSD &ToolChain =
10677 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10678 const Driver &D = ToolChain.getDriver();
10679 ArgStringList CmdArgs;
10680
10681 // Silence warning for "clang -g foo.o -o foo"
10682 Args.ClaimAllArgs(options::OPT_g_Group);
10683 // and "clang -emit-llvm foo.o -o foo"
10684 Args.ClaimAllArgs(options::OPT_emit_llvm);
10685 // and for "clang -w foo.o -o foo". Other warning options are already
10686 // handled somewhere else.
10687 Args.ClaimAllArgs(options::OPT_w);
10688
10689 if (!D.SysRoot.empty())
10690 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10691
10692 if (Args.hasArg(options::OPT_pie))
10693 CmdArgs.push_back("-pie");
10694
10695 if (Args.hasArg(options::OPT_static)) {
10696 CmdArgs.push_back("-Bstatic");
10697 } else {
10698 if (Args.hasArg(options::OPT_rdynamic))
10699 CmdArgs.push_back("-export-dynamic");
10700 CmdArgs.push_back("--eh-frame-hdr");
10701 if (Args.hasArg(options::OPT_shared)) {
10702 CmdArgs.push_back("-Bshareable");
10703 } else {
10704 CmdArgs.push_back("-dynamic-linker");
10705 CmdArgs.push_back("/libexec/ld-elf.so.1");
10706 }
10707 CmdArgs.push_back("--enable-new-dtags");
10708 }
10709
10710 if (Output.isFilename()) {
10711 CmdArgs.push_back("-o");
10712 CmdArgs.push_back(Output.getFilename());
10713 } else {
10714 assert(Output.isNothing() && "Invalid output.");
10715 }
10716
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010717 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10718
Douglas Katzman78b37b02015-11-17 20:28:07 +000010719 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010720 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010721 if (!Args.hasArg(options::OPT_shared)) {
10722 if (Args.hasArg(options::OPT_pg))
10723 crt1 = "gcrt1.o";
10724 else if (Args.hasArg(options::OPT_pie))
10725 crt1 = "Scrt1.o";
10726 else
10727 crt1 = "crt1.o";
10728 }
10729 if (crt1)
10730 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10731
10732 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10733
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010734 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010735 if (Args.hasArg(options::OPT_static))
10736 crtbegin = "crtbeginT.o";
10737 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10738 crtbegin = "crtbeginS.o";
10739 else
10740 crtbegin = "crtbegin.o";
10741
10742 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10743 }
10744
10745 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010746 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010747 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10748 Args.AddAllArgs(CmdArgs, options::OPT_e);
10749 Args.AddAllArgs(CmdArgs, options::OPT_s);
10750 Args.AddAllArgs(CmdArgs, options::OPT_t);
10751 Args.AddAllArgs(CmdArgs, options::OPT_r);
10752
10753 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10754 CmdArgs.push_back("--no-demangle");
10755
10756 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10757
Douglas Katzman78b37b02015-11-17 20:28:07 +000010758 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010759 // For PS4, we always want to pass libm, libstdc++ and libkernel
10760 // libraries for both C and C++ compilations.
10761 CmdArgs.push_back("-lkernel");
10762 if (D.CCCIsCXX()) {
10763 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10764 if (Args.hasArg(options::OPT_pg))
10765 CmdArgs.push_back("-lm_p");
10766 else
10767 CmdArgs.push_back("-lm");
10768 }
10769 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10770 // the default system libraries. Just mimic this for now.
10771 if (Args.hasArg(options::OPT_pg))
10772 CmdArgs.push_back("-lgcc_p");
10773 else
10774 CmdArgs.push_back("-lcompiler_rt");
10775 if (Args.hasArg(options::OPT_static)) {
10776 CmdArgs.push_back("-lstdc++");
10777 } else if (Args.hasArg(options::OPT_pg)) {
10778 CmdArgs.push_back("-lgcc_eh_p");
10779 } else {
10780 CmdArgs.push_back("--as-needed");
10781 CmdArgs.push_back("-lstdc++");
10782 CmdArgs.push_back("--no-as-needed");
10783 }
10784
10785 if (Args.hasArg(options::OPT_pthread)) {
10786 if (Args.hasArg(options::OPT_pg))
10787 CmdArgs.push_back("-lpthread_p");
10788 else
10789 CmdArgs.push_back("-lpthread");
10790 }
10791
10792 if (Args.hasArg(options::OPT_pg)) {
10793 if (Args.hasArg(options::OPT_shared))
10794 CmdArgs.push_back("-lc");
10795 else {
10796 if (Args.hasArg(options::OPT_static)) {
10797 CmdArgs.push_back("--start-group");
10798 CmdArgs.push_back("-lc_p");
10799 CmdArgs.push_back("-lpthread_p");
10800 CmdArgs.push_back("--end-group");
10801 } else {
10802 CmdArgs.push_back("-lc_p");
10803 }
10804 }
10805 CmdArgs.push_back("-lgcc_p");
10806 } else {
10807 if (Args.hasArg(options::OPT_static)) {
10808 CmdArgs.push_back("--start-group");
10809 CmdArgs.push_back("-lc");
10810 CmdArgs.push_back("-lpthread");
10811 CmdArgs.push_back("--end-group");
10812 } else {
10813 CmdArgs.push_back("-lc");
10814 }
10815 CmdArgs.push_back("-lcompiler_rt");
10816 }
10817
10818 if (Args.hasArg(options::OPT_static)) {
10819 CmdArgs.push_back("-lstdc++");
10820 } else if (Args.hasArg(options::OPT_pg)) {
10821 CmdArgs.push_back("-lgcc_eh_p");
10822 } else {
10823 CmdArgs.push_back("--as-needed");
10824 CmdArgs.push_back("-lstdc++");
10825 CmdArgs.push_back("--no-as-needed");
10826 }
10827 }
10828
Douglas Katzman78b37b02015-11-17 20:28:07 +000010829 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010830 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10831 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10832 else
10833 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10834 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10835 }
10836
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010837 const char *Exec =
10838#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010839 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010840#else
10841 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10842#endif
10843
10844 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10845}
10846
10847void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10848 const InputInfo &Output,
10849 const InputInfoList &Inputs,
10850 const ArgList &Args,
10851 const char *LinkingOutput) const {
10852 const toolchains::FreeBSD &ToolChain =
10853 static_cast<const toolchains::FreeBSD &>(getToolChain());
10854 const Driver &D = ToolChain.getDriver();
10855 bool PS4Linker;
10856 StringRef LinkerOptName;
10857 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10858 LinkerOptName = A->getValue();
10859 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10860 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10861 }
10862
10863 if (LinkerOptName == "gold")
10864 PS4Linker = false;
10865 else if (LinkerOptName == "ps4")
10866 PS4Linker = true;
10867 else
10868 PS4Linker = !Args.hasArg(options::OPT_shared);
10869
10870 if (PS4Linker)
10871 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10872 else
10873 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10874}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010875
10876void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10877 const InputInfo &Output,
10878 const InputInfoList &Inputs,
10879 const ArgList &Args,
10880 const char *LinkingOutput) const {
10881 const auto &TC =
10882 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010883 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010884
10885 std::vector<std::string> gpu_archs =
10886 Args.getAllArgValues(options::OPT_march_EQ);
10887 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10888 const std::string& gpu_arch = gpu_archs[0];
10889
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010890 ArgStringList CmdArgs;
10891 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010892 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10893 // ptxas does not accept -g option if optimization is enabled, so
10894 // we ignore the compiler's -O* options if we want debug info.
10895 CmdArgs.push_back("-g");
10896 CmdArgs.push_back("--dont-merge-basicblocks");
10897 CmdArgs.push_back("--return-at-end");
10898 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10899 // Map the -O we received to -O{0,1,2,3}.
10900 //
10901 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10902 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010903
Justin Lebar2836dcd2016-01-19 19:52:21 +000010904 // -O3 seems like the least-bad option when -Osomething is specified to
10905 // clang but it isn't handled below.
10906 StringRef OOpt = "3";
10907 if (A->getOption().matches(options::OPT_O4) ||
10908 A->getOption().matches(options::OPT_Ofast))
10909 OOpt = "3";
10910 else if (A->getOption().matches(options::OPT_O0))
10911 OOpt = "0";
10912 else if (A->getOption().matches(options::OPT_O)) {
10913 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10914 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10915 .Case("1", "1")
10916 .Case("2", "2")
10917 .Case("3", "3")
10918 .Case("s", "2")
10919 .Case("z", "2")
10920 .Default("2");
10921 }
10922 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10923 } else {
10924 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10925 // to no optimizations, but ptxas's default is -O3.
10926 CmdArgs.push_back("-O0");
10927 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010928
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010929 CmdArgs.push_back("--gpu-name");
10930 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10931 CmdArgs.push_back("--output-file");
10932 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10933 for (const auto& II : Inputs)
10934 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10935
10936 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10937 CmdArgs.push_back(Args.MakeArgString(A));
10938
10939 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10940 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10941}
10942
10943// All inputs to this linker must be from CudaDeviceActions, as we need to look
10944// at the Inputs' Actions in order to figure out which GPU architecture they
10945// correspond to.
10946void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10947 const InputInfo &Output,
10948 const InputInfoList &Inputs,
10949 const ArgList &Args,
10950 const char *LinkingOutput) const {
10951 const auto &TC =
10952 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010953 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010954
10955 ArgStringList CmdArgs;
10956 CmdArgs.push_back("--cuda");
10957 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10958 CmdArgs.push_back(Args.MakeArgString("--create"));
10959 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10960
10961 for (const auto& II : Inputs) {
10962 auto* A = cast<const CudaDeviceAction>(II.getAction());
10963 // We need to pass an Arch of the form "sm_XX" for cubin files and
10964 // "compute_XX" for ptx.
10965 const char *Arch = (II.getType() == types::TY_PP_Asm)
10966 ? A->getComputeArchName()
10967 : A->getGpuArchName();
10968 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10969 Arch + ",file=" + II.getFilename()));
10970 }
10971
10972 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10973 CmdArgs.push_back(Args.MakeArgString(A));
10974
10975 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10976 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10977}