blob: 2849d513df725b3f6fd3cb678a1f027ed4fb501b [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
Pete Cooperbe6c7502016-03-16 00:33:21 +00005287 // Allow the user to control whether messages can be converted to runtime
5288 // functions.
5289 if (types::isObjC(InputType)) {
5290 auto *Arg = Args.getLastArg(
5291 options::OPT_fobjc_convert_messages_to_runtime_calls,
5292 options::OPT_fno_objc_convert_messages_to_runtime_calls);
5293 if (Arg &&
5294 Arg->getOption().matches(
5295 options::OPT_fno_objc_convert_messages_to_runtime_calls))
5296 CmdArgs.push_back("-fno-objc-convert-messages-to-runtime-calls");
5297 }
5298
John McCall24fc0de2011-07-06 00:26:06 +00005299 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5300 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005301 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005302 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005303
John McCall24fc0de2011-07-06 00:26:06 +00005304 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5305 // takes precedence.
5306 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5307 if (!GCArg)
5308 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5309 if (GCArg) {
5310 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005311 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005312 } else if (getToolChain().SupportsObjCGC()) {
5313 GCArg->render(Args, CmdArgs);
5314 } else {
5315 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005316 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005317 }
5318 }
5319
John McCallfbe5ed72015-11-05 19:19:56 +00005320 // Pass down -fobjc-weak or -fno-objc-weak if present.
5321 if (types::isObjC(InputType)) {
5322 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5323 options::OPT_fno_objc_weak);
5324 if (!WeakArg) {
5325 // nothing to do
5326 } else if (GCArg) {
5327 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5328 D.Diag(diag::err_objc_weak_with_gc);
5329 } else if (!objcRuntime.allowsWeak()) {
5330 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5331 D.Diag(diag::err_objc_weak_unsupported);
5332 } else {
5333 WeakArg->render(Args, CmdArgs);
5334 }
5335 }
5336
Bob Wilsonb111ec92015-03-02 19:01:14 +00005337 if (Args.hasFlag(options::OPT_fapplication_extension,
5338 options::OPT_fno_application_extension, false))
5339 CmdArgs.push_back("-fapplication-extension");
5340
Reid Klecknerc542d372014-06-27 17:02:02 +00005341 // Handle GCC-style exception args.
5342 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005343 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5344 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005345
Tim Northovere931f9f2015-10-30 16:30:41 +00005346 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005347 CmdArgs.push_back("-fsjlj-exceptions");
5348
5349 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005350 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5351 options::OPT_fno_assume_sane_operator_new))
5352 CmdArgs.push_back("-fno-assume-sane-operator-new");
5353
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005354 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5355 // most platforms.
5356 if (Args.hasFlag(options::OPT_fsized_deallocation,
5357 options::OPT_fno_sized_deallocation, false))
5358 CmdArgs.push_back("-fsized-deallocation");
5359
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005360 // -fconstant-cfstrings is default, and may be subject to argument translation
5361 // on Darwin.
5362 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5363 options::OPT_fno_constant_cfstrings) ||
5364 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5365 options::OPT_mno_constant_cfstrings))
5366 CmdArgs.push_back("-fno-constant-cfstrings");
5367
John Thompsoned4e2952009-11-05 20:14:16 +00005368 // -fshort-wchar default varies depending on platform; only
5369 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005370 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5371 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005372 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005373
Hans Wennborg28c96312013-07-31 23:39:13 +00005374 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005375 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005376 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005377 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005378
Daniel Dunbar096ed292011-10-05 21:04:55 +00005379 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5380 // -fno-pack-struct doesn't apply to -fpack-struct=.
5381 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005382 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005383 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005384 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005385 } else if (Args.hasFlag(options::OPT_fpack_struct,
5386 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005387 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005388 }
5389
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005390 // Handle -fmax-type-align=N and -fno-type-align
5391 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5392 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5393 if (!SkipMaxTypeAlign) {
5394 std::string MaxTypeAlignStr = "-fmax-type-align=";
5395 MaxTypeAlignStr += A->getValue();
5396 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5397 }
5398 } else if (getToolChain().getTriple().isOSDarwin()) {
5399 if (!SkipMaxTypeAlign) {
5400 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5401 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5402 }
5403 }
5404
John Brawna7b4ec02015-08-10 11:11:28 +00005405 // -fcommon is the default unless compiling kernel code or the target says so
5406 bool NoCommonDefault =
5407 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5408 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5409 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005410 CmdArgs.push_back("-fno-common");
5411
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005412 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005413 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005414 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005415 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005416 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005417 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005418
Daniel Dunbar6358d682010-10-15 22:30:42 +00005419 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005420 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005421 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005422 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005423
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005424 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005425 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5426 StringRef value = inputCharset->getValue();
5427 if (value != "UTF-8")
5428 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5429 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005430 }
5431
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005432 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005433 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5434 StringRef value = execCharset->getValue();
5435 if (value != "UTF-8")
5436 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5437 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005438 }
5439
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005440 // -fcaret-diagnostics is default.
5441 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5442 options::OPT_fno_caret_diagnostics, true))
5443 CmdArgs.push_back("-fno-caret-diagnostics");
5444
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005445 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005446 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005447 options::OPT_fno_diagnostics_fixit_info))
5448 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005449
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005450 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005451 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005452 options::OPT_fno_diagnostics_show_option))
5453 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005454
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005455 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005456 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005457 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005458 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005459 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005460
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005461 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005462 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005463 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005464 }
5465
Chandler Carruthb6766f02011-03-27 01:50:55 +00005466 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005467 options::OPT_fdiagnostics_show_note_include_stack,
5468 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005469 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005470 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005471 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5472 else
5473 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5474 }
5475
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005476 // Color diagnostics are the default, unless the terminal doesn't support
5477 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005478 // Support both clang's -f[no-]color-diagnostics and gcc's
5479 // -f[no-]diagnostics-colors[=never|always|auto].
5480 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005481 for (const auto &Arg : Args) {
5482 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005483 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5484 !O.matches(options::OPT_fdiagnostics_color) &&
5485 !O.matches(options::OPT_fno_color_diagnostics) &&
5486 !O.matches(options::OPT_fno_diagnostics_color) &&
5487 !O.matches(options::OPT_fdiagnostics_color_EQ))
5488 continue;
5489
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005490 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005491 if (O.matches(options::OPT_fcolor_diagnostics) ||
5492 O.matches(options::OPT_fdiagnostics_color)) {
5493 ShowColors = Colors_On;
5494 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5495 O.matches(options::OPT_fno_diagnostics_color)) {
5496 ShowColors = Colors_Off;
5497 } else {
5498 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005499 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005500 if (value == "always")
5501 ShowColors = Colors_On;
5502 else if (value == "never")
5503 ShowColors = Colors_Off;
5504 else if (value == "auto")
5505 ShowColors = Colors_Auto;
5506 else
5507 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005508 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005509 }
5510 }
5511 if (ShowColors == Colors_On ||
5512 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005513 CmdArgs.push_back("-fcolor-diagnostics");
5514
Nico Rieck7857d462013-09-11 00:38:02 +00005515 if (Args.hasArg(options::OPT_fansi_escape_codes))
5516 CmdArgs.push_back("-fansi-escape-codes");
5517
Daniel Dunbardb097022009-06-08 21:13:54 +00005518 if (!Args.hasFlag(options::OPT_fshow_source_location,
5519 options::OPT_fno_show_source_location))
5520 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005522 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005523 true))
5524 CmdArgs.push_back("-fno-show-column");
5525
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005526 if (!Args.hasFlag(options::OPT_fspell_checking,
5527 options::OPT_fno_spell_checking))
5528 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005529
Chad Rosierc8e56e82012-12-05 21:08:21 +00005530 // -fno-asm-blocks is default.
5531 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5532 false))
5533 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005534
Steven Wucb0d13f2015-01-16 23:05:28 +00005535 // -fgnu-inline-asm is default.
5536 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5537 options::OPT_fno_gnu_inline_asm, true))
5538 CmdArgs.push_back("-fno-gnu-inline-asm");
5539
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005540 // Enable vectorization per default according to the optimization level
5541 // selected. For optimization levels that want vectorization we use the alias
5542 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005543 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005544 OptSpecifier VectorizeAliasOption =
5545 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005546 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005547 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005548 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005549
Chad Rosier136d67d2014-04-28 19:30:57 +00005550 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005551 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005552 OptSpecifier SLPVectAliasOption =
5553 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005554 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005555 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005556 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005557
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005558 // -fno-slp-vectorize-aggressive is default.
5559 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005560 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005561 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005562
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005563 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5564 A->render(Args, CmdArgs);
5565
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005566 // -fdollars-in-identifiers default varies depending on platform and
5567 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005568 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005569 options::OPT_fno_dollars_in_identifiers)) {
5570 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005571 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005572 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005573 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005574 }
5575
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005576 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5577 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005578 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005579 options::OPT_fno_unit_at_a_time)) {
5580 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005581 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005582 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005583
Eli Friedman055c9702011-11-02 01:53:16 +00005584 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5585 options::OPT_fno_apple_pragma_pack, false))
5586 CmdArgs.push_back("-fapple-pragma-pack");
5587
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005589 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5590 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005591 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005592 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005593 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005594
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005595// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5596//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005597// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005598#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005599 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005600 (getToolChain().getArch() == llvm::Triple::arm ||
5601 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005602 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5603 CmdArgs.push_back("-fno-builtin-strcat");
5604 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5605 CmdArgs.push_back("-fno-builtin-strcpy");
5606 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005607#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005608
Justin Bognera88f0122014-06-20 22:59:50 +00005609 // Enable rewrite includes if the user's asked for it or if we're generating
5610 // diagnostics.
5611 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5612 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005613 if (Args.hasFlag(options::OPT_frewrite_includes,
5614 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005615 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005616 CmdArgs.push_back("-frewrite-includes");
5617
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005618 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005619 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005620 options::OPT_traditional_cpp)) {
5621 if (isa<PreprocessJobAction>(JA))
5622 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005623 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005624 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005625 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005626
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005627 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005628 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005629
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005630 // Handle serialized diagnostics.
5631 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5632 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005633 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005634 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005635
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005636 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5637 CmdArgs.push_back("-fretain-comments-from-system-headers");
5638
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005639 // Forward -fcomment-block-commands to -cc1.
5640 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005641 // Forward -fparse-all-comments to -cc1.
5642 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005643
John Brawnad31ace2015-09-23 13:55:40 +00005644 // Turn -fplugin=name.so into -load name.so
5645 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5646 CmdArgs.push_back("-load");
5647 CmdArgs.push_back(A->getValue());
5648 A->claim();
5649 }
5650
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005651 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5652 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005653 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005654 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5655 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005656
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005657 // We translate this by hand to the -cc1 argument, since nightly test uses
5658 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005659 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005660 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005661 } else
Sean Silva14facf32015-06-09 01:57:17 +00005662 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005663 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005664
Bob Wilson23a55f12014-12-21 07:00:00 +00005665 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005666 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5667 // by the frontend.
5668 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5669 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005670
Daniel Dunbard67a3222009-03-30 06:36:42 +00005671 if (Output.getType() == types::TY_Dependencies) {
5672 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005673 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005674 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005675 CmdArgs.push_back(Output.getFilename());
5676 } else {
5677 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005678 }
5679
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005680 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005681
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005682 if (Input.isFilename())
5683 CmdArgs.push_back(Input.getFilename());
5684 else
5685 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005686
Chris Lattnere9d7d782009-11-03 19:50:27 +00005687 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5688
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005689 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005690
5691 // Optionally embed the -cc1 level arguments into the debug info, for build
5692 // analysis.
5693 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005694 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005695 for (const auto &Arg : Args)
5696 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005697
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005698 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005699 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005700 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005701 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005702 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005703 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005704 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005705 }
5706 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005707 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005708 }
5709
Eric Christopherd3804002013-02-22 20:12:52 +00005710 // Add the split debug info name to the command lines here so we
5711 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005712 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005713 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5714 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005715 const char *SplitDwarfOut;
5716 if (SplitDwarf) {
5717 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005718 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005719 CmdArgs.push_back(SplitDwarfOut);
5720 }
5721
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005722 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5723 // Include them with -fcuda-include-gpubinary.
5724 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005725 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005726 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005727 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005728 }
5729
Eric Christopherd3804002013-02-22 20:12:52 +00005730 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005731 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005732 Output.getType() == types::TY_Object &&
5733 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005734 auto CLCommand =
5735 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005736 C.addCommand(llvm::make_unique<FallbackCommand>(
5737 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005738 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5739 isa<PrecompileJobAction>(JA)) {
5740 // In /fallback builds, run the main compilation even if the pch generation
5741 // fails, so that the main compilation's fallback to cl.exe runs.
5742 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5743 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005744 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005745 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005746 }
5747
Eric Christopherf1545832013-02-22 23:50:16 +00005748 // Handle the debug info splitting at object creation time if we're
5749 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005750 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005751 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005752 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005753
Roman Divacky178e01602011-02-10 16:52:03 +00005754 if (Arg *A = Args.getLastArg(options::OPT_pg))
5755 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005756 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5757 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005758
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005759 // Claim some arguments which clang supports automatically.
5760
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005761 // -fpch-preprocess is used with gcc to add a special marker in the output to
5762 // include the PCH file. Clang's PTH solution is completely transparent, so we
5763 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005764 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005765
Daniel Dunbar17731772009-03-23 19:03:36 +00005766 // Claim some arguments which clang doesn't support, but we don't
5767 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005768 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5769 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005770
Rafael Espindolab0092d72013-09-04 19:37:35 +00005771 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005772 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005773}
5774
John McCall5fb5df92012-06-20 06:18:46 +00005775/// Add options related to the Objective-C runtime/ABI.
5776///
5777/// Returns true if the runtime is non-fragile.
5778ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5779 ArgStringList &cmdArgs,
5780 RewriteKind rewriteKind) const {
5781 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005782 Arg *runtimeArg =
5783 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5784 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005785
5786 // Just forward -fobjc-runtime= to the frontend. This supercedes
5787 // options about fragility.
5788 if (runtimeArg &&
5789 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5790 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005791 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005792 if (runtime.tryParse(value)) {
5793 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005794 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005795 }
5796
5797 runtimeArg->render(args, cmdArgs);
5798 return runtime;
5799 }
5800
5801 // Otherwise, we'll need the ABI "version". Version numbers are
5802 // slightly confusing for historical reasons:
5803 // 1 - Traditional "fragile" ABI
5804 // 2 - Non-fragile ABI, version 1
5805 // 3 - Non-fragile ABI, version 2
5806 unsigned objcABIVersion = 1;
5807 // If -fobjc-abi-version= is present, use that to set the version.
5808 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005809 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005810 if (value == "1")
5811 objcABIVersion = 1;
5812 else if (value == "2")
5813 objcABIVersion = 2;
5814 else if (value == "3")
5815 objcABIVersion = 3;
5816 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005817 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005818 } else {
5819 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005820 bool nonFragileABIIsDefault =
5821 (rewriteKind == RK_NonFragile ||
5822 (rewriteKind == RK_None &&
5823 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005824 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5825 options::OPT_fno_objc_nonfragile_abi,
5826 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005827// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005828#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5829 unsigned nonFragileABIVersion = 1;
5830#else
5831 unsigned nonFragileABIVersion = 2;
5832#endif
5833
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005834 if (Arg *abiArg =
5835 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005836 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005837 if (value == "1")
5838 nonFragileABIVersion = 1;
5839 else if (value == "2")
5840 nonFragileABIVersion = 2;
5841 else
5842 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005844 }
5845
5846 objcABIVersion = 1 + nonFragileABIVersion;
5847 } else {
5848 objcABIVersion = 1;
5849 }
5850 }
5851
5852 // We don't actually care about the ABI version other than whether
5853 // it's non-fragile.
5854 bool isNonFragile = objcABIVersion != 1;
5855
5856 // If we have no runtime argument, ask the toolchain for its default runtime.
5857 // However, the rewriter only really supports the Mac runtime, so assume that.
5858 ObjCRuntime runtime;
5859 if (!runtimeArg) {
5860 switch (rewriteKind) {
5861 case RK_None:
5862 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5863 break;
5864 case RK_Fragile:
5865 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5866 break;
5867 case RK_NonFragile:
5868 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5869 break;
5870 }
5871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005872 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005873 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5874 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005875 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005876 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005879 } else {
5880 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5881 }
5882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005883 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005884 } else {
5885 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005886 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005887 // non-fragile mode or the GCC runtime in fragile mode.
5888 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005889 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005890 else
5891 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005892 }
5893
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005894 cmdArgs.push_back(
5895 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005896 return runtime;
5897}
5898
Reid Klecknerc542d372014-06-27 17:02:02 +00005899static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5900 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5901 I += HaveDash;
5902 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005903}
Reid Klecknerc542d372014-06-27 17:02:02 +00005904
Benjamin Kramere003ca22015-10-28 13:54:16 +00005905namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005906struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005907 bool Synch = false;
5908 bool Asynch = false;
5909 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005910};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005911} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005912
5913/// /EH controls whether to run destructor cleanups when exceptions are
5914/// thrown. There are three modifiers:
5915/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5916/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5917/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005918/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005919/// The default is /EHs-c-, meaning cleanups are disabled.
5920static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5921 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005922
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005923 std::vector<std::string> EHArgs =
5924 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005925 for (auto EHVal : EHArgs) {
5926 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5927 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005928 case 'a':
5929 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005930 if (EH.Asynch)
5931 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005932 continue;
5933 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005934 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005935 continue;
5936 case 's':
5937 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005938 if (EH.Synch)
5939 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005940 continue;
5941 default:
5942 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005943 }
5944 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5945 break;
5946 }
5947 }
David Majnemerb8809092016-02-20 09:23:44 +00005948 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005949 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005950 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005951 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5952 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005953 EH.Synch = true;
5954 EH.NoUnwindC = true;
5955 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005956
Reid Klecknerc542d372014-06-27 17:02:02 +00005957 return EH;
5958}
5959
David Majnemercd5855e2016-02-29 01:40:36 +00005960void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5961 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005962 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005963 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005964 unsigned RTOptionID = options::OPT__SLASH_MT;
5965
Hans Wennborgf1a74252013-09-10 20:18:04 +00005966 if (Args.hasArg(options::OPT__SLASH_LDd))
5967 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5968 // but defining _DEBUG is sticky.
5969 RTOptionID = options::OPT__SLASH_MTd;
5970
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005971 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005972 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005973
David Majnemere2afb472015-07-24 06:49:13 +00005974 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005975 switch (RTOptionID) {
5976 case options::OPT__SLASH_MD:
5977 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005978 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005979 CmdArgs.push_back("-D_MT");
5980 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005981 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005982 break;
5983 case options::OPT__SLASH_MDd:
5984 CmdArgs.push_back("-D_DEBUG");
5985 CmdArgs.push_back("-D_MT");
5986 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005987 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005988 break;
5989 case options::OPT__SLASH_MT:
5990 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005991 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005992 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005993 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005994 break;
5995 case options::OPT__SLASH_MTd:
5996 CmdArgs.push_back("-D_DEBUG");
5997 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005998 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005999 break;
6000 default:
6001 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006002 }
6003
David Majnemere2afb472015-07-24 06:49:13 +00006004 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6005 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6006 } else {
6007 CmdArgs.push_back(FlagForCRT.data());
6008
6009 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6010 // users want. The /Za flag to cl.exe turns this off, but it's not
6011 // implemented in clang.
6012 CmdArgs.push_back("--dependent-lib=oldnames");
6013 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006014
Hans Wennborg8858a032014-07-21 23:42:07 +00006015 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6016 // would produce interleaved output, so ignore /showIncludes in such cases.
6017 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6018 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6019 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006020
David Majnemerf6072342014-07-01 22:24:56 +00006021 // This controls whether or not we emit RTTI data for polymorphic types.
6022 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6023 /*default=*/false))
6024 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006025
Reid Kleckner124955a2015-08-05 18:51:13 +00006026 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006027 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006028 if (*EmitCodeView)
6029 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006030 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006031 CmdArgs.push_back("-gcodeview");
6032
Reid Klecknerc542d372014-06-27 17:02:02 +00006033 const Driver &D = getToolChain().getDriver();
6034 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006035 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006036 if (types::isCXX(InputType))
6037 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006038 CmdArgs.push_back("-fexceptions");
6039 }
David Majnemercd5855e2016-02-29 01:40:36 +00006040 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6041 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006042
Hans Wennborge50cec32014-06-13 20:59:54 +00006043 // /EP should expand to -E -P.
6044 if (Args.hasArg(options::OPT__SLASH_EP)) {
6045 CmdArgs.push_back("-E");
6046 CmdArgs.push_back("-P");
6047 }
6048
David Majnemera5b195a2015-02-14 01:35:12 +00006049 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006050 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6051 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006052 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6053 else
6054 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6055
6056 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6057 VolatileOptionID = A->getOption().getID();
6058
6059 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6060 CmdArgs.push_back("-fms-volatile");
6061
David Majnemer86c318f2014-02-11 21:05:00 +00006062 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6063 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6064 if (MostGeneralArg && BestCaseArg)
6065 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6066 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6067
6068 if (MostGeneralArg) {
6069 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6070 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6071 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6072
6073 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6074 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6075 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6076 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6077 << FirstConflict->getAsString(Args)
6078 << SecondConflict->getAsString(Args);
6079
6080 if (SingleArg)
6081 CmdArgs.push_back("-fms-memptr-rep=single");
6082 else if (MultipleArg)
6083 CmdArgs.push_back("-fms-memptr-rep=multiple");
6084 else
6085 CmdArgs.push_back("-fms-memptr-rep=virtual");
6086 }
6087
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006088 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6089 A->render(Args, CmdArgs);
6090
Hans Wennborg81f74482013-09-10 01:07:07 +00006091 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6092 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006093 if (Args.hasArg(options::OPT__SLASH_fallback))
6094 CmdArgs.push_back("msvc-fallback");
6095 else
6096 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006097 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006098}
6099
Douglas Katzman95354292015-06-23 20:42:09 +00006100visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006101 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006102 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006103 return CLFallback.get();
6104}
6105
Daniel Sanders7f933f42015-01-30 17:35:23 +00006106void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6107 ArgStringList &CmdArgs) const {
6108 StringRef CPUName;
6109 StringRef ABIName;
6110 const llvm::Triple &Triple = getToolChain().getTriple();
6111 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6112
6113 CmdArgs.push_back("-target-abi");
6114 CmdArgs.push_back(ABIName.data());
6115}
6116
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006117void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006118 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006119 const ArgList &Args,
6120 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006121 ArgStringList CmdArgs;
6122
6123 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6124 const InputInfo &Input = Inputs[0];
6125
James Y Knight2db38f32015-08-15 03:45:25 +00006126 std::string TripleStr =
6127 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6128 const llvm::Triple Triple(TripleStr);
6129
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006130 // Don't warn about "clang -w -c foo.s"
6131 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006132 // and "clang -emit-llvm -c foo.s"
6133 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006134
Rafael Espindola577637a2015-01-03 00:06:04 +00006135 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006136
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006137 // Invoke ourselves in -cc1as mode.
6138 //
6139 // FIXME: Implement custom jobs for internal actions.
6140 CmdArgs.push_back("-cc1as");
6141
6142 // Add the "effective" target triple.
6143 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006144 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6145
6146 // Set the output mode, we currently only expect to be used as a real
6147 // assembler.
6148 CmdArgs.push_back("-filetype");
6149 CmdArgs.push_back("obj");
6150
Eric Christopher45f2e712012-12-18 00:31:10 +00006151 // Set the main file name, so that debug info works even with
6152 // -save-temps or preprocessed assembly.
6153 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006154 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006155
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006156 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006157 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006158 if (!CPU.empty()) {
6159 CmdArgs.push_back("-target-cpu");
6160 CmdArgs.push_back(Args.MakeArgString(CPU));
6161 }
6162
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006163 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006164 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006165
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006166 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006167 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006168
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006169 // Pass along any -I options so we get proper .include search paths.
6170 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6171
Eric Christopherfc3ee562012-01-10 00:38:01 +00006172 // Determine the original source input.
6173 const Action *SourceAction = &JA;
6174 while (SourceAction->getKind() != Action::InputClass) {
6175 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6176 SourceAction = SourceAction->getInputs()[0];
6177 }
6178
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006179 // Forward -g and handle debug info related flags, assuming we are dealing
6180 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006181 if (SourceAction->getType() == types::TY_Asm ||
6182 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006183 bool WantDebug = false;
6184 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006185 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006186 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006187 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6188 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006189 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006190 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006191 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006192 if (DwarfVersion == 0)
6193 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006194 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006195 (WantDebug ? codegenoptions::LimitedDebugInfo
6196 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006197 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006198
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006199 // Add the -fdebug-compilation-dir flag if needed.
6200 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006201
6202 // Set the AT_producer to the clang version when using the integrated
6203 // assembler on assembly source files.
6204 CmdArgs.push_back("-dwarf-debug-producer");
6205 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006206
6207 // And pass along -I options
6208 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006209 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006210
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006211 // Handle -fPIC et al -- the relocation-model affects the assembler
6212 // for some targets.
6213 llvm::Reloc::Model RelocationModel;
6214 unsigned PICLevel;
6215 bool IsPIE;
6216 std::tie(RelocationModel, PICLevel, IsPIE) =
6217 ParsePICArgs(getToolChain(), Triple, Args);
6218
6219 const char *RMName = RelocationModelName(RelocationModel);
6220 if (RMName) {
6221 CmdArgs.push_back("-mrelocation-model");
6222 CmdArgs.push_back(RMName);
6223 }
6224
Kevin Enderby292dc082011-12-22 19:31:58 +00006225 // Optionally embed the -cc1as level arguments into the debug info, for build
6226 // analysis.
6227 if (getToolChain().UseDwarfDebugFlags()) {
6228 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006229 for (const auto &Arg : Args)
6230 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006231
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006232 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006233 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6234 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006235 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006236 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006237 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006238 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006239 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006240 }
6241 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006242 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006243 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006244
6245 // FIXME: Add -static support, once we have it.
6246
Daniel Sanders7f933f42015-01-30 17:35:23 +00006247 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006248 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006249 default:
6250 break;
6251
6252 case llvm::Triple::mips:
6253 case llvm::Triple::mipsel:
6254 case llvm::Triple::mips64:
6255 case llvm::Triple::mips64el:
6256 AddMIPSTargetArgs(Args, CmdArgs);
6257 break;
6258 }
6259
David Blaikie372d9502014-01-17 03:17:40 +00006260 // Consume all the warning flags. Usually this would be handled more
6261 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6262 // doesn't handle that so rather than warning about unused flags that are
6263 // actually used, we'll lie by omission instead.
6264 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006265 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006266
David Blaikie9260ed62013-07-25 21:19:01 +00006267 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6268 getToolChain().getDriver());
6269
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006270 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006271
6272 assert(Output.isFilename() && "Unexpected lipo output.");
6273 CmdArgs.push_back("-o");
6274 CmdArgs.push_back(Output.getFilename());
6275
Daniel Dunbarb440f562010-08-02 02:38:21 +00006276 assert(Input.isFilename() && "Invalid input.");
6277 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006278
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006279 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006280 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006281
6282 // Handle the debug info splitting at object creation time if we're
6283 // creating an object.
6284 // TODO: Currently only works on linux with newer objcopy.
6285 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006286 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006287 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006288 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006289}
6290
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006291void GnuTool::anchor() {}
6292
Daniel Dunbara3246a02009-03-18 08:07:30 +00006293void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006294 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006295 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006296 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006297 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006298 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006299
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006300 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006301 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006302 // It is unfortunate that we have to claim here, as this means
6303 // we will basically never report anything interesting for
6304 // platforms using a generic gcc, even if we are just using gcc
6305 // to get to the assembler.
6306 A->claim();
6307
Daniel Dunbar939c1212010-08-03 16:14:14 +00006308 // Don't forward any -g arguments to assembly steps.
6309 if (isa<AssembleJobAction>(JA) &&
6310 A->getOption().matches(options::OPT_g_Group))
6311 continue;
6312
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006313 // Don't forward any -W arguments to assembly and link steps.
6314 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6315 A->getOption().matches(options::OPT_W_Group))
6316 continue;
6317
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006318 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006319 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006320 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006321
Daniel Dunbar4e295052010-01-25 22:35:08 +00006322 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006323
6324 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006325 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006326 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006327 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006328 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006329 }
6330
Daniel Dunbar5716d872009-05-02 21:41:52 +00006331 // Try to force gcc to match the tool chain we want, if we recognize
6332 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006333 //
6334 // FIXME: The triple class should directly provide the information we want
6335 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006336 switch (getToolChain().getArch()) {
6337 default:
6338 break;
6339 case llvm::Triple::x86:
6340 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006341 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006342 break;
6343 case llvm::Triple::x86_64:
6344 case llvm::Triple::ppc64:
6345 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006346 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006347 break;
6348 case llvm::Triple::sparcel:
6349 CmdArgs.push_back("-EL");
6350 break;
6351 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006352
Daniel Dunbarb440f562010-08-02 02:38:21 +00006353 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006354 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006355 CmdArgs.push_back(Output.getFilename());
6356 } else {
6357 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006358 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006359 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006361 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006362
6363 // Only pass -x if gcc will understand it; otherwise hope gcc
6364 // understands the suffix correctly. The main use case this would go
6365 // wrong in is for linker inputs if they happened to have an odd
6366 // suffix; really the only way to get this to happen is a command
6367 // like '-x foobar a.c' which will treat a.c like a linker input.
6368 //
6369 // FIXME: For the linker case specifically, can we safely convert
6370 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006371 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006372 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006373 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006374 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006375 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006376 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006377 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006378 else if (II.getType() == types::TY_ModuleFile)
6379 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006380 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006381
Daniel Dunbara3246a02009-03-18 08:07:30 +00006382 if (types::canTypeBeUserSpecified(II.getType())) {
6383 CmdArgs.push_back("-x");
6384 CmdArgs.push_back(types::getTypeName(II.getType()));
6385 }
6386
Daniel Dunbarb440f562010-08-02 02:38:21 +00006387 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006388 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006389 else {
6390 const Arg &A = II.getInputArg();
6391
6392 // Reverse translate some rewritten options.
6393 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6394 CmdArgs.push_back("-lstdc++");
6395 continue;
6396 }
6397
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006398 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006399 A.render(Args, CmdArgs);
6400 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006401 }
6402
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006403 const std::string customGCCName = D.getCCCGenericGCCName();
6404 const char *GCCName;
6405 if (!customGCCName.empty())
6406 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006407 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006408 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006409 } else
6410 GCCName = "gcc";
6411
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006412 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006413 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006414}
6415
Douglas Katzman95354292015-06-23 20:42:09 +00006416void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6417 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006418 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006419}
6420
Douglas Katzman95354292015-06-23 20:42:09 +00006421void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6422 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006423 const Driver &D = getToolChain().getDriver();
6424
Eric Christophercc7ff502015-01-29 00:56:17 +00006425 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006426 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006427 case types::TY_LLVM_IR:
6428 case types::TY_LTO_IR:
6429 case types::TY_LLVM_BC:
6430 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006431 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006432 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006433 // We assume we've got an "integrated" assembler in that gcc will produce an
6434 // object file itself.
6435 case types::TY_Object:
6436 CmdArgs.push_back("-c");
6437 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006438 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006439 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006440 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006441 case types::TY_Nothing:
6442 CmdArgs.push_back("-fsyntax-only");
6443 break;
6444 default:
6445 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006446 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006447}
6448
Douglas Katzman95354292015-06-23 20:42:09 +00006449void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6450 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006451 // The types are (hopefully) good enough.
6452}
6453
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006455void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006456 ArgStringList &CmdArgs) const {
6457}
6458
Douglas Katzman95354292015-06-23 20:42:09 +00006459void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6460 const InputInfo &Output,
6461 const InputInfoList &Inputs,
6462 const ArgList &Args,
6463 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006464 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006465
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006466 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6467 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006468 ArgStringList CmdArgs;
6469
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006470 std::string MArchString = "-march=hexagon";
6471 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006472
6473 RenderExtraToolArgs(JA, CmdArgs);
6474
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475 std::string AsName = "hexagon-llvm-mc";
6476 std::string MCpuString = "-mcpu=hexagon" +
6477 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6478 CmdArgs.push_back("-filetype=obj");
6479 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6480
Tony Linthicum76329bf2011-12-12 21:14:55 +00006481 if (Output.isFilename()) {
6482 CmdArgs.push_back("-o");
6483 CmdArgs.push_back(Output.getFilename());
6484 } else {
6485 assert(Output.isNothing() && "Unexpected output");
6486 CmdArgs.push_back("-fsyntax-only");
6487 }
6488
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006489 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6490 std::string N = llvm::utostr(G.getValue());
6491 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6492 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006493
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006494 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006495
Tony Linthicum76329bf2011-12-12 21:14:55 +00006496 // Only pass -x if gcc will understand it; otherwise hope gcc
6497 // understands the suffix correctly. The main use case this would go
6498 // wrong in is for linker inputs if they happened to have an odd
6499 // suffix; really the only way to get this to happen is a command
6500 // like '-x foobar a.c' which will treat a.c like a linker input.
6501 //
6502 // FIXME: For the linker case specifically, can we safely convert
6503 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006504 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006505 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006506 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006507 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006508 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006509 else if (II.getType() == types::TY_AST)
6510 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006511 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006512 else if (II.getType() == types::TY_ModuleFile)
6513 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006514 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006515
6516 if (II.isFilename())
6517 CmdArgs.push_back(II.getFilename());
6518 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006519 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006520 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006521 II.getInputArg().render(Args, CmdArgs);
6522 }
6523
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006524 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006525 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006526}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006527
Douglas Katzman95354292015-06-23 20:42:09 +00006528void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6529 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006530}
6531
Douglas Katzman54366072015-07-27 16:53:08 +00006532static void
6533constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006534 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006535 const InputInfo &Output, const InputInfoList &Inputs,
6536 const ArgList &Args, ArgStringList &CmdArgs,
6537 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006538
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006539 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006540
Matthew Curtise689b052012-12-06 15:46:07 +00006541 //----------------------------------------------------------------------------
6542 //
6543 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544 bool IsStatic = Args.hasArg(options::OPT_static);
6545 bool IsShared = Args.hasArg(options::OPT_shared);
6546 bool IsPIE = Args.hasArg(options::OPT_pie);
6547 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6548 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6549 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6550 bool UseG0 = false;
6551 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006552
Matthew Curtise689b052012-12-06 15:46:07 +00006553 //----------------------------------------------------------------------------
6554 // Silence warnings for various options
6555 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006556 Args.ClaimAllArgs(options::OPT_g_Group);
6557 Args.ClaimAllArgs(options::OPT_emit_llvm);
6558 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6559 // handled somewhere else.
6560 Args.ClaimAllArgs(options::OPT_static_libgcc);
6561
6562 //----------------------------------------------------------------------------
6563 //
6564 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006565 if (Args.hasArg(options::OPT_s))
6566 CmdArgs.push_back("-s");
6567
6568 if (Args.hasArg(options::OPT_r))
6569 CmdArgs.push_back("-r");
6570
6571 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006572 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006573
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 CmdArgs.push_back("-march=hexagon");
6575 std::string CpuVer =
6576 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6577 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6578 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006579
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006580 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006581 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006582 // The following should be the default, but doing as hexagon-gcc does.
6583 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006584 }
6585
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006586 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006587 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006588
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006589 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006590 CmdArgs.push_back("-pie");
6591
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006592 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6593 std::string N = llvm::utostr(G.getValue());
6594 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6595 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006596 }
6597
Matthew Curtise689b052012-12-06 15:46:07 +00006598 //----------------------------------------------------------------------------
6599 //
6600 //----------------------------------------------------------------------------
6601 CmdArgs.push_back("-o");
6602 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006603
Matthew Curtise689b052012-12-06 15:46:07 +00006604 //----------------------------------------------------------------------------
6605 // moslib
6606 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006607 std::vector<std::string> OsLibs;
6608 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006609
Sean Silva14facf32015-06-09 01:57:17 +00006610 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6611 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612 OsLibs.emplace_back(A->getValue());
6613 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006614 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006615 if (OsLibs.empty()) {
6616 OsLibs.push_back("standalone");
6617 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006618 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006619
Matthew Curtise689b052012-12-06 15:46:07 +00006620 //----------------------------------------------------------------------------
6621 // Start Files
6622 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006623 const std::string MCpuSuffix = "/" + CpuVer;
6624 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6625 const std::string RootDir =
6626 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6627 const std::string StartSubDir =
6628 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006629
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006630 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6631 const char *Name) -> std::string {
6632 std::string RelName = SubDir + Name;
6633 std::string P = HTC.GetFilePath(RelName.c_str());
6634 if (llvm::sys::fs::exists(P))
6635 return P;
6636 return RootDir + RelName;
6637 };
6638
6639 if (IncStdLib && IncStartFiles) {
6640 if (!IsShared) {
6641 if (HasStandalone) {
6642 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6643 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006644 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6646 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006647 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006648 std::string Init = UseShared
6649 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6650 : Find(RootDir, StartSubDir, "/init.o");
6651 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006652 }
6653
6654 //----------------------------------------------------------------------------
6655 // Library Search Paths
6656 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6658 for (const auto &LibPath : LibPaths)
6659 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006660
6661 //----------------------------------------------------------------------------
6662 //
6663 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006664 Args.AddAllArgs(CmdArgs,
6665 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6666 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006667
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006668 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006669
6670 //----------------------------------------------------------------------------
6671 // Libraries
6672 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006673 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006674 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006675 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006676 CmdArgs.push_back("-lm");
6677 }
6678
6679 CmdArgs.push_back("--start-group");
6680
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006681 if (!IsShared) {
6682 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006683 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006684 CmdArgs.push_back("-lc");
6685 }
6686 CmdArgs.push_back("-lgcc");
6687
6688 CmdArgs.push_back("--end-group");
6689 }
6690
6691 //----------------------------------------------------------------------------
6692 // End files
6693 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006694 if (IncStdLib && IncStartFiles) {
6695 std::string Fini = UseShared
6696 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6697 : Find(RootDir, StartSubDir, "/fini.o");
6698 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006699 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006700}
6701
Douglas Katzman95354292015-06-23 20:42:09 +00006702void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6703 const InputInfo &Output,
6704 const InputInfoList &Inputs,
6705 const ArgList &Args,
6706 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006707 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006708
6709 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006710 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006711 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006712
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006713 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006714 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006715 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006716}
6717// Hexagon tools end.
6718
Tom Stellard8fa33092015-07-18 01:49:05 +00006719void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6720 const InputInfo &Output,
6721 const InputInfoList &Inputs,
6722 const ArgList &Args,
6723 const char *LinkingOutput) const {
6724
6725 std::string Linker = getToolChain().GetProgramPath(getShortName());
6726 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006727 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6728 CmdArgs.push_back("-o");
6729 CmdArgs.push_back(Output.getFilename());
6730 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6731 CmdArgs, Inputs));
6732}
6733// AMDGPU tools end.
6734
Dan Gohman52816862015-12-16 23:30:41 +00006735wasm::Linker::Linker(const ToolChain &TC)
6736 : GnuTool("wasm::Linker", "lld", TC) {}
6737
6738bool wasm::Linker::isLinkJob() const {
6739 return true;
6740}
6741
6742bool wasm::Linker::hasIntegratedCPP() const {
6743 return false;
6744}
6745
6746void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6747 const InputInfo &Output,
6748 const InputInfoList &Inputs,
6749 const ArgList &Args,
6750 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006751
6752 const ToolChain &ToolChain = getToolChain();
6753 const Driver &D = ToolChain.getDriver();
6754 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006755 ArgStringList CmdArgs;
6756 CmdArgs.push_back("-flavor");
6757 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006758
6759 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006760 // size is of particular importance. This is significantly facilitated by
6761 // the enabling of -ffunction-sections and -fdata-sections in
6762 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006763 if (areOptimizationsEnabled(Args))
6764 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006765
Dan Gohman57b62c52016-02-22 19:26:15 +00006766 if (Args.hasArg(options::OPT_rdynamic))
6767 CmdArgs.push_back("-export-dynamic");
6768 if (Args.hasArg(options::OPT_s))
6769 CmdArgs.push_back("--strip-all");
6770 if (Args.hasArg(options::OPT_shared))
6771 CmdArgs.push_back("-shared");
6772 if (Args.hasArg(options::OPT_static))
6773 CmdArgs.push_back("-Bstatic");
6774
6775 Args.AddAllArgs(CmdArgs, options::OPT_L);
6776 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6777
6778 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6779 if (Args.hasArg(options::OPT_shared))
6780 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6781 else if (Args.hasArg(options::OPT_pie))
6782 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6783 else
6784 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6785
6786 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6787 }
6788
6789 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6790
6791 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6792 if (D.CCCIsCXX())
6793 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6794
6795 if (Args.hasArg(options::OPT_pthread))
6796 CmdArgs.push_back("-lpthread");
6797
6798 CmdArgs.push_back("-lc");
6799 CmdArgs.push_back("-lcompiler_rt");
6800 }
6801
6802 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6803 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6804
Dan Gohman52816862015-12-16 23:30:41 +00006805 CmdArgs.push_back("-o");
6806 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006807
Dan Gohman52816862015-12-16 23:30:41 +00006808 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6809}
6810
Renato Golin7c542b42015-07-27 23:44:45 +00006811const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006812 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006813 if (!Arch.empty())
6814 MArch = Arch;
6815 else
Bernard Ogden31561762013-12-12 13:27:11 +00006816 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006817 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006818
6819 // Handle -march=native.
6820 if (MArch == "native") {
6821 std::string CPU = llvm::sys::getHostCPUName();
6822 if (CPU != "generic") {
6823 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006824 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006825 // If there is no valid architecture suffix for this CPU we don't know how
6826 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006827 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006828 MArch = "";
6829 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006830 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006831 }
6832 }
6833
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006834 return MArch;
6835}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006836
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006837/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006838StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006839 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006840 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6841 // here means an -march=native that we can't handle, so instead return no CPU.
6842 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006843 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006844
John Brawna95c1a82015-05-08 12:52:18 +00006845 // We need to return an empty string here on invalid MArch values as the
6846 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006847 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006848}
6849
6850/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006851std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006852 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006853 // FIXME: Warn on inconsistent use of -mcpu and -march.
6854 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006855 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006856 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006857 // Handle -mcpu=native.
6858 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006859 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006860 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006861 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006862 }
6863
Renato Goline17c5802015-07-27 23:44:42 +00006864 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006865}
6866
6867/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006868/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006869// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006870StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6871 const llvm::Triple &Triple) {
6872 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006873 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006874 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006875 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006876 if (ArchKind == llvm::ARM::AK_INVALID)
6877 // In case of generic Arch, i.e. "arm",
6878 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006879 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006880 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006881 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6882 // armv7k triple if it's actually been specified via "-arch armv7k".
6883 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006884 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006885 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006886 }
Renato Golin3c007252015-05-28 15:05:53 +00006887 if (ArchKind == llvm::ARM::AK_INVALID)
6888 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006889 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006890}
6891
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006892void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006893 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006894 if (Args.hasArg(options::OPT_r))
6895 return;
6896
John Brawn94fd9632015-05-21 12:19:49 +00006897 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6898 // to generate BE-8 executables.
6899 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6900 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006901}
6902
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006903mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006904 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6905 // was first introduced in Release 3. However, other compilers have
6906 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006907 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6908 .Case("mips1", NanLegacy)
6909 .Case("mips2", NanLegacy)
6910 .Case("mips3", NanLegacy)
6911 .Case("mips4", NanLegacy)
6912 .Case("mips5", NanLegacy)
6913 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006914 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006915 .Case("mips32r3", NanLegacy | Nan2008)
6916 .Case("mips32r5", NanLegacy | Nan2008)
6917 .Case("mips32r6", Nan2008)
6918 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006919 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006920 .Case("mips64r3", NanLegacy | Nan2008)
6921 .Case("mips64r5", NanLegacy | Nan2008)
6922 .Case("mips64r6", Nan2008)
6923 .Default(NanLegacy);
6924}
6925
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006926bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6927 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6928 return A && (A->getValue() == StringRef(Value));
6929}
6930
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006931bool mips::isUCLibc(const ArgList &Args) {
6932 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006933 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006934}
6935
Daniel Sanders2bf13662014-07-10 14:40:57 +00006936bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006937 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6938 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006939 .Case("2008", true)
6940 .Case("legacy", false)
6941 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006942
6943 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006944 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006945 .Cases("mips32r6", "mips64r6", true)
6946 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006947
6948 return false;
6949}
6950
Daniel Sanders379d44b2014-07-16 11:52:23 +00006951bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006952 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006953 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006954 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006955 return false;
6956
6957 if (ABIName != "32")
6958 return false;
6959
Toma Tabacu94ea6862015-06-16 13:54:13 +00006960 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6961 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006962 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006963 return false;
6964
Daniel Sanders379d44b2014-07-16 11:52:23 +00006965 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006966 .Cases("mips2", "mips3", "mips4", "mips5", true)
6967 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6968 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6969 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006970}
6971
Toma Tabacu94ea6862015-06-16 13:54:13 +00006972bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6973 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006974 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006975 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6976
6977 // FPXX shouldn't be used if -msingle-float is present.
6978 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6979 options::OPT_mdouble_float))
6980 if (A->getOption().matches(options::OPT_msingle_float))
6981 UseFPXX = false;
6982
6983 return UseFPXX;
6984}
6985
Tim Northover157d9112014-01-16 08:48:16 +00006986llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006987 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6988 // archs which Darwin doesn't use.
6989
6990 // The matching this routine does is fairly pointless, since it is neither the
6991 // complete architecture list, nor a reasonable subset. The problem is that
6992 // historically the driver driver accepts this and also ties its -march=
6993 // handling to the architecture name, so we need to be careful before removing
6994 // support for it.
6995
6996 // This code must be kept in sync with Clang's Darwin specific argument
6997 // translation.
6998
6999 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007000 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7001 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7002 .Case("ppc64", llvm::Triple::ppc64)
7003 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7004 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7005 llvm::Triple::x86)
7006 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7007 // This is derived from the driver driver.
7008 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7009 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7010 .Cases("armv7s", "xscale", llvm::Triple::arm)
7011 .Case("arm64", llvm::Triple::aarch64)
7012 .Case("r600", llvm::Triple::r600)
7013 .Case("amdgcn", llvm::Triple::amdgcn)
7014 .Case("nvptx", llvm::Triple::nvptx)
7015 .Case("nvptx64", llvm::Triple::nvptx64)
7016 .Case("amdil", llvm::Triple::amdil)
7017 .Case("spir", llvm::Triple::spir)
7018 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007019}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007020
Tim Northover157d9112014-01-16 08:48:16 +00007021void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007022 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007023 T.setArch(Arch);
7024
7025 if (Str == "x86_64h")
7026 T.setArchName(Str);
7027 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7028 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007029 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007030 }
7031}
7032
Bob Wilsondecc03e2012-11-23 06:14:39 +00007033const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007034 const InputInfo &Input) {
7035 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007036}
7037
Bob Wilsondecc03e2012-11-23 06:14:39 +00007038const char *Clang::getBaseInputStem(const ArgList &Args,
7039 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007040 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007041
Chris Lattner906bb902011-01-16 08:14:11 +00007042 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007043 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007044
7045 return Str;
7046}
7047
Bob Wilsondecc03e2012-11-23 06:14:39 +00007048const char *Clang::getDependencyFileName(const ArgList &Args,
7049 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007050 // FIXME: Think about this more.
7051 std::string Res;
7052
7053 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007054 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007055 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007056 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007057 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007058 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007059 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007060}
7061
Douglas Katzman95354292015-06-23 20:42:09 +00007062void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7063 const InputInfo &Output,
7064 const InputInfoList &Inputs,
7065 const ArgList &Args,
7066 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007067 const ToolChain &ToolChain = getToolChain();
7068 const Driver &D = ToolChain.getDriver();
7069 ArgStringList CmdArgs;
7070
7071 // Silence warning for "clang -g foo.o -o foo"
7072 Args.ClaimAllArgs(options::OPT_g_Group);
7073 // and "clang -emit-llvm foo.o -o foo"
7074 Args.ClaimAllArgs(options::OPT_emit_llvm);
7075 // and for "clang -w foo.o -o foo". Other warning options are already
7076 // handled somewhere else.
7077 Args.ClaimAllArgs(options::OPT_w);
7078
7079 if (!D.SysRoot.empty())
7080 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7081
7082 // CloudABI only supports static linkage.
7083 CmdArgs.push_back("-Bstatic");
7084 CmdArgs.push_back("--eh-frame-hdr");
7085 CmdArgs.push_back("--gc-sections");
7086
7087 if (Output.isFilename()) {
7088 CmdArgs.push_back("-o");
7089 CmdArgs.push_back(Output.getFilename());
7090 } else {
7091 assert(Output.isNothing() && "Invalid output.");
7092 }
7093
Douglas Katzman78b37b02015-11-17 20:28:07 +00007094 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007095 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7096 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7097 }
7098
7099 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007100 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007101 Args.AddAllArgs(CmdArgs,
7102 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7103 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007104
Teresa Johnson945bc502015-10-15 20:35:53 +00007105 if (D.isUsingLTO())
7106 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007107
7108 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7109
Douglas Katzman78b37b02015-11-17 20:28:07 +00007110 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007111 if (D.CCCIsCXX())
7112 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7113 CmdArgs.push_back("-lc");
7114 CmdArgs.push_back("-lcompiler_rt");
7115 }
7116
Douglas Katzman78b37b02015-11-17 20:28:07 +00007117 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007118 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7119
7120 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007121 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007122}
7123
Douglas Katzman95354292015-06-23 20:42:09 +00007124void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7125 const InputInfo &Output,
7126 const InputInfoList &Inputs,
7127 const ArgList &Args,
7128 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007129 ArgStringList CmdArgs;
7130
7131 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7132 const InputInfo &Input = Inputs[0];
7133
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007134 // Determine the original source input.
7135 const Action *SourceAction = &JA;
7136 while (SourceAction->getKind() != Action::InputClass) {
7137 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7138 SourceAction = SourceAction->getInputs()[0];
7139 }
7140
Eric Christopherf5a8f492015-12-08 00:10:10 +00007141 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007142 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007143 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7144 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007145 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007146 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007147 const llvm::Triple &T(getToolChain().getTriple());
7148 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007149 CmdArgs.push_back("-Q");
7150 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007151
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007152 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007153 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007154 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007155 if (Args.hasArg(options::OPT_gstabs))
7156 CmdArgs.push_back("--gstabs");
7157 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007158 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007159 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007160
Daniel Dunbarbe220842009-03-20 16:06:39 +00007161 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007162 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007163
Daniel Dunbar6d484762010-07-22 01:47:22 +00007164 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007165 if (getToolChain().getArch() == llvm::Triple::x86 ||
7166 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007167 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7168 CmdArgs.push_back("-force_cpusubtype_ALL");
7169
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007170 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007171 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007172 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007173 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007174 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007175 CmdArgs.push_back("-static");
7176
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007177 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007178
7179 assert(Output.isFilename() && "Unexpected lipo output.");
7180 CmdArgs.push_back("-o");
7181 CmdArgs.push_back(Output.getFilename());
7182
Daniel Dunbarb440f562010-08-02 02:38:21 +00007183 assert(Input.isFilename() && "Invalid input.");
7184 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007185
7186 // asm_final spec is empty.
7187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007188 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007189 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007190}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007191
Tim Northover157d9112014-01-16 08:48:16 +00007192void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007193
Tim Northover157d9112014-01-16 08:48:16 +00007194void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7195 ArgStringList &CmdArgs) const {
7196 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007197
Daniel Dunbarc1964212009-03-26 16:23:12 +00007198 // Derived from darwin_arch spec.
7199 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007200 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007201
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007202 // FIXME: Is this needed anymore?
7203 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007204 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007205}
7206
Douglas Katzman95354292015-06-23 20:42:09 +00007207bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007208 // We only need to generate a temp path for LTO if we aren't compiling object
7209 // files. When compiling source files, we run 'dsymutil' after linking. We
7210 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007211 for (const auto &Input : Inputs)
7212 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007213 return true;
7214
7215 return false;
7216}
7217
Douglas Katzman95354292015-06-23 20:42:09 +00007218void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7219 ArgStringList &CmdArgs,
7220 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007221 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007222 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007223
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007224 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007225 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7226 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007227 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7228 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007229 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007230 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007231 }
7232
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007233 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007234 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007235 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7236 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007237
Bob Wilson3d27dad2013-08-02 22:25:34 +00007238 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7239 CmdArgs.push_back("-export_dynamic");
7240
Bob Wilsonb111ec92015-03-02 19:01:14 +00007241 // If we are using App Extension restrictions, pass a flag to the linker
7242 // telling it that the compiled code has been audited.
7243 if (Args.hasFlag(options::OPT_fapplication_extension,
7244 options::OPT_fno_application_extension, false))
7245 CmdArgs.push_back("-application_extension");
7246
Teresa Johnson945bc502015-10-15 20:35:53 +00007247 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007248 // If we are using LTO, then automatically create a temporary file path for
7249 // the linker to use, so that it's lifetime will extend past a possible
7250 // dsymutil step.
7251 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7252 const char *TmpPath = C.getArgs().MakeArgString(
7253 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7254 C.addTempFile(TmpPath);
7255 CmdArgs.push_back("-object_path_lto");
7256 CmdArgs.push_back(TmpPath);
7257 }
7258
7259 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7260 // it in clang installed libraries. If not found, the option is not used
7261 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7262 if (Version[0] >= 133) {
7263 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7264 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7265 SmallString<128> LibLTOPath(P);
7266 llvm::sys::path::append(LibLTOPath, "lib");
7267 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7268 if (llvm::sys::fs::exists(LibLTOPath)) {
7269 CmdArgs.push_back("-lto_library");
7270 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7271 } else {
7272 D.Diag(diag::warn_drv_lto_libpath);
7273 }
7274 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007275 }
7276
Daniel Dunbarc1964212009-03-26 16:23:12 +00007277 // Derived from the "link" spec.
7278 Args.AddAllArgs(CmdArgs, options::OPT_static);
7279 if (!Args.hasArg(options::OPT_static))
7280 CmdArgs.push_back("-dynamic");
7281 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7282 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7283 // here. How do we wish to handle such things?
7284 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007285
Daniel Dunbarc1964212009-03-26 16:23:12 +00007286 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007287 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007288 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007289 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007290
7291 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7292 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7293 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7294
7295 Arg *A;
7296 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7297 (A = Args.getLastArg(options::OPT_current__version)) ||
7298 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007299 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7300 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007301
7302 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7303 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7304 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7305 } else {
7306 CmdArgs.push_back("-dylib");
7307
7308 Arg *A;
7309 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7310 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7311 (A = Args.getLastArg(options::OPT_client__name)) ||
7312 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7313 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7314 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007315 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7316 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007317
Daniel Dunbarc1964212009-03-26 16:23:12 +00007318 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7319 "-dylib_compatibility_version");
7320 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7321 "-dylib_current_version");
7322
Tim Northover157d9112014-01-16 08:48:16 +00007323 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007324
7325 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7326 "-dylib_install_name");
7327 }
7328
7329 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7330 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7331 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007332 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007333 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007334 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7335 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7336 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7337 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7338 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7339 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007340 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007341 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7342 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7343 Args.AddAllArgs(CmdArgs, options::OPT_init);
7344
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007345 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007346 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007347
Daniel Dunbarc1964212009-03-26 16:23:12 +00007348 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7349 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7350 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7351 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7352 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007353
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007354 if (const Arg *A =
7355 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7356 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007357 if (A->getOption().matches(options::OPT_fpie) ||
7358 A->getOption().matches(options::OPT_fPIE))
7359 CmdArgs.push_back("-pie");
7360 else
7361 CmdArgs.push_back("-no_pie");
7362 }
Steven Wu574b0f22016-03-01 01:07:58 +00007363 // for embed-bitcode, use -bitcode_bundle in linker command
7364 if (C.getDriver().embedBitcodeEnabled() ||
7365 C.getDriver().embedBitcodeMarkerOnly()) {
7366 // Check if the toolchain supports bitcode build flow.
7367 if (MachOTC.SupportsEmbeddedBitcode())
7368 CmdArgs.push_back("-bitcode_bundle");
7369 else
7370 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7371 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007372
7373 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7374 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7375 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7376 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7377 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7378 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7379 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7380 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7381 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7382 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7383 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7384 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7385 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7386 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7387 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7388 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007389
Daniel Dunbar84384642011-05-02 21:03:47 +00007390 // Give --sysroot= preference, over the Apple specific behavior to also use
7391 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007392 StringRef sysroot = C.getSysRoot();
7393 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007394 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007395 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007396 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7397 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007398 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007399 }
7400
Daniel Dunbarc1964212009-03-26 16:23:12 +00007401 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7402 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7403 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7404 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7405 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007406 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007407 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7408 Args.AddAllArgs(CmdArgs, options::OPT_y);
7409 Args.AddLastArg(CmdArgs, options::OPT_w);
7410 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7411 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7412 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7413 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7414 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7415 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7416 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7417 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7418 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7419 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7420 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7421 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7422}
7423
Douglas Katzman95354292015-06-23 20:42:09 +00007424void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7425 const InputInfo &Output,
7426 const InputInfoList &Inputs,
7427 const ArgList &Args,
7428 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007429 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007430
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007431 // If the number of arguments surpasses the system limits, we will encode the
7432 // input files in a separate file, shortening the command line. To this end,
7433 // build a list of input file names that can be passed via a file with the
7434 // -filelist linker option.
7435 llvm::opt::ArgStringList InputFileList;
7436
Daniel Dunbarc1964212009-03-26 16:23:12 +00007437 // The logic here is derived from gcc's behavior; most of which
7438 // comes from specs (starting with link_command). Consult gcc for
7439 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007440 ArgStringList CmdArgs;
7441
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007442 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7443 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7444 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007445 for (const auto &Arg : Args)
7446 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007447 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007448 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007449 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007450 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007451 return;
7452 }
7453
Daniel Dunbarc1964212009-03-26 16:23:12 +00007454 // I'm not sure why this particular decomposition exists in gcc, but
7455 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007456 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007457
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007458 // It seems that the 'e' option is completely ignored for dynamic executables
7459 // (the default), and with static executables, the last one wins, as expected.
7460 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7461 options::OPT_Z_Flag, options::OPT_u_Group,
7462 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007463
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007464 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7465 // members of static archive libraries which implement Objective-C classes or
7466 // categories.
7467 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7468 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007469
Daniel Dunbarc1964212009-03-26 16:23:12 +00007470 CmdArgs.push_back("-o");
7471 CmdArgs.push_back(Output.getFilename());
7472
Douglas Katzman78b37b02015-11-17 20:28:07 +00007473 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007474 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007475
Peter Collingbournec4122c12015-06-15 21:08:13 +00007476 // SafeStack requires its own runtime libraries
7477 // These libraries should be linked first, to make sure the
7478 // __safestack_init constructor executes before everything else
7479 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7480 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7481 "libclang_rt.safestack_osx.a",
7482 /*AlwaysLink=*/true);
7483 }
7484
Daniel Dunbarc1964212009-03-26 16:23:12 +00007485 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007486
Douglas Gregor9295df02012-05-15 21:00:27 +00007487 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007488 // Build the input file for -filelist (list of linker input files) in case we
7489 // need it later
7490 for (const auto &II : Inputs) {
7491 if (!II.isFilename()) {
7492 // This is a linker input argument.
7493 // We cannot mix input arguments and file names in a -filelist input, thus
7494 // we prematurely stop our list (remaining files shall be passed as
7495 // arguments).
7496 if (InputFileList.size() > 0)
7497 break;
7498
7499 continue;
7500 }
7501
7502 InputFileList.push_back(II.getFilename());
7503 }
7504
Douglas Katzman78b37b02015-11-17 20:28:07 +00007505 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007506 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7507
Douglas Katzman78b37b02015-11-17 20:28:07 +00007508 if (isObjCRuntimeLinked(Args) &&
7509 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007510 // We use arclite library for both ARC and subscripting support.
7511 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7512
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007513 CmdArgs.push_back("-framework");
7514 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007515 // Link libobj.
7516 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007517 }
John McCall31168b02011-06-15 23:02:42 +00007518
Daniel Dunbarc1964212009-03-26 16:23:12 +00007519 if (LinkingOutput) {
7520 CmdArgs.push_back("-arch_multiple");
7521 CmdArgs.push_back("-final_output");
7522 CmdArgs.push_back(LinkingOutput);
7523 }
7524
Daniel Dunbarc1964212009-03-26 16:23:12 +00007525 if (Args.hasArg(options::OPT_fnested_functions))
7526 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007527
Justin Bognerc7701242015-05-12 05:44:36 +00007528 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7529
Douglas Katzman78b37b02015-11-17 20:28:07 +00007530 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007531 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007532 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007533
Daniel Dunbarc1964212009-03-26 16:23:12 +00007534 // link_ssp spec is empty.
7535
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007536 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007537 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007538 }
7539
Douglas Katzman78b37b02015-11-17 20:28:07 +00007540 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007541 // endfile_spec is empty.
7542 }
7543
7544 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7545 Args.AddAllArgs(CmdArgs, options::OPT_F);
7546
Steven Wu3ffb61b2015-02-06 18:08:29 +00007547 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007548 for (const Arg *A : Args.filtered(options::OPT_iframework))
7549 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007550
Douglas Katzman78b37b02015-11-17 20:28:07 +00007551 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007552 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7553 if (A->getValue() == StringRef("Accelerate")) {
7554 CmdArgs.push_back("-framework");
7555 CmdArgs.push_back("Accelerate");
7556 }
7557 }
7558 }
7559
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007560 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007561 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007562 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007563 Cmd->setInputFileList(std::move(InputFileList));
7564 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007565}
7566
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007567void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007568 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007569 const InputInfoList &Inputs,
7570 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007571 const char *LinkingOutput) const {
7572 ArgStringList CmdArgs;
7573
7574 CmdArgs.push_back("-create");
7575 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007576
7577 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007578 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007579
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007580 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007581 assert(II.isFilename() && "Unexpected lipo input.");
7582 CmdArgs.push_back(II.getFilename());
7583 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007584
7585 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007586 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007587}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007588
Daniel Dunbar88299622010-06-04 18:28:36 +00007589void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007590 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007591 const InputInfoList &Inputs,
7592 const ArgList &Args,
7593 const char *LinkingOutput) const {
7594 ArgStringList CmdArgs;
7595
Daniel Dunbareb86b042011-05-09 17:23:16 +00007596 CmdArgs.push_back("-o");
7597 CmdArgs.push_back(Output.getFilename());
7598
Daniel Dunbar88299622010-06-04 18:28:36 +00007599 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7600 const InputInfo &Input = Inputs[0];
7601 assert(Input.isFilename() && "Unexpected dsymutil input.");
7602 CmdArgs.push_back(Input.getFilename());
7603
Daniel Dunbar88299622010-06-04 18:28:36 +00007604 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007605 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007606 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007607}
7608
Eric Christopher551ef452011-08-23 17:56:55 +00007609void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007610 const InputInfo &Output,
7611 const InputInfoList &Inputs,
7612 const ArgList &Args,
7613 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007614 ArgStringList CmdArgs;
7615 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007616 CmdArgs.push_back("--debug-info");
7617 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007618 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007619
7620 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7621 const InputInfo &Input = Inputs[0];
7622 assert(Input.isFilename() && "Unexpected verify input");
7623
7624 // Grabbing the output of the earlier dsymutil run.
7625 CmdArgs.push_back(Input.getFilename());
7626
7627 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007628 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007629 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007630}
7631
Douglas Katzman95354292015-06-23 20:42:09 +00007632void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007633 const InputInfo &Output,
7634 const InputInfoList &Inputs,
7635 const ArgList &Args,
7636 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007637 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007638 ArgStringList CmdArgs;
7639
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007640 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007641
7642 CmdArgs.push_back("-o");
7643 CmdArgs.push_back(Output.getFilename());
7644
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007645 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007646 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007647
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007648 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007649 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007650}
7651
Douglas Katzman95354292015-06-23 20:42:09 +00007652void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7653 const InputInfo &Output,
7654 const InputInfoList &Inputs,
7655 const ArgList &Args,
7656 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007657 ArgStringList CmdArgs;
7658
David Chisnall272a0712012-02-29 15:06:12 +00007659 // Demangle C++ names in errors
7660 CmdArgs.push_back("-C");
7661
Douglas Katzman78b37b02015-11-17 20:28:07 +00007662 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007663 CmdArgs.push_back("-e");
7664 CmdArgs.push_back("_start");
7665 }
7666
7667 if (Args.hasArg(options::OPT_static)) {
7668 CmdArgs.push_back("-Bstatic");
7669 CmdArgs.push_back("-dn");
7670 } else {
7671 CmdArgs.push_back("-Bdynamic");
7672 if (Args.hasArg(options::OPT_shared)) {
7673 CmdArgs.push_back("-shared");
7674 } else {
7675 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007676 CmdArgs.push_back(
7677 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007678 }
7679 }
7680
7681 if (Output.isFilename()) {
7682 CmdArgs.push_back("-o");
7683 CmdArgs.push_back(Output.getFilename());
7684 } else {
7685 assert(Output.isNothing() && "Invalid output.");
7686 }
7687
Douglas Katzman78b37b02015-11-17 20:28:07 +00007688 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007689 if (!Args.hasArg(options::OPT_shared))
7690 CmdArgs.push_back(
7691 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7692
7693 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7694 CmdArgs.push_back(
7695 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7696 CmdArgs.push_back(
7697 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007698 }
7699
Douglas Katzman6059ef92015-11-17 17:41:23 +00007700 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007701
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007702 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7703 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007704
7705 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7706
Douglas Katzman78b37b02015-11-17 20:28:07 +00007707 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007708 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007709 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007710 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007711 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007712 if (!Args.hasArg(options::OPT_shared)) {
7713 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007714 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007715 }
David Chisnallf571cde2012-02-15 13:39:01 +00007716 }
7717
Douglas Katzman78b37b02015-11-17 20:28:07 +00007718 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007719 CmdArgs.push_back(
7720 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007721 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007722 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007723
Xinliang David Li69306c02015-10-22 06:15:31 +00007724 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007725
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007726 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007727 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007728}
7729
Douglas Katzman95354292015-06-23 20:42:09 +00007730void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7731 const InputInfo &Output,
7732 const InputInfoList &Inputs,
7733 const ArgList &Args,
7734 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007735 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007736 ArgStringList CmdArgs;
7737
Rafael Espindolacc126272014-02-28 01:55:21 +00007738 switch (getToolChain().getArch()) {
7739 case llvm::Triple::x86:
7740 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7741 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007742 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007743 break;
7744
7745 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007746 CmdArgs.push_back("-mppc");
7747 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007748 break;
7749
7750 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007751 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007752 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007753 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7754 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7755 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007756 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007757 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007758
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007759 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007760 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007761 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7762 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7763 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007764 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007765 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007766
7767 case llvm::Triple::mips64:
7768 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007769 StringRef CPUName;
7770 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007771 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007772
7773 CmdArgs.push_back("-mabi");
7774 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7775
7776 if (getToolChain().getArch() == llvm::Triple::mips64)
7777 CmdArgs.push_back("-EB");
7778 else
7779 CmdArgs.push_back("-EL");
7780
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007781 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007782 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007783 }
7784
Rafael Espindolacc126272014-02-28 01:55:21 +00007785 default:
7786 break;
7787 }
7788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007789 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007790
7791 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007792 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007793
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007794 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007795 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007797 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007798 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007799}
7800
Douglas Katzman95354292015-06-23 20:42:09 +00007801void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7802 const InputInfo &Output,
7803 const InputInfoList &Inputs,
7804 const ArgList &Args,
7805 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007806 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007807 ArgStringList CmdArgs;
7808
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007809 // Silence warning for "clang -g foo.o -o foo"
7810 Args.ClaimAllArgs(options::OPT_g_Group);
7811 // and "clang -emit-llvm foo.o -o foo"
7812 Args.ClaimAllArgs(options::OPT_emit_llvm);
7813 // and for "clang -w foo.o -o foo". Other warning options are already
7814 // handled somewhere else.
7815 Args.ClaimAllArgs(options::OPT_w);
7816
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007817 if (getToolChain().getArch() == llvm::Triple::mips64)
7818 CmdArgs.push_back("-EB");
7819 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7820 CmdArgs.push_back("-EL");
7821
Douglas Katzman78b37b02015-11-17 20:28:07 +00007822 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007823 CmdArgs.push_back("-e");
7824 CmdArgs.push_back("__start");
7825 }
7826
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007827 if (Args.hasArg(options::OPT_static)) {
7828 CmdArgs.push_back("-Bstatic");
7829 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007830 if (Args.hasArg(options::OPT_rdynamic))
7831 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007832 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007833 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007834 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007835 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007836 } else {
7837 CmdArgs.push_back("-dynamic-linker");
7838 CmdArgs.push_back("/usr/libexec/ld.so");
7839 }
7840 }
7841
Rafael Espindola044f7832013-06-05 04:28:55 +00007842 if (Args.hasArg(options::OPT_nopie))
7843 CmdArgs.push_back("-nopie");
7844
Daniel Dunbarb440f562010-08-02 02:38:21 +00007845 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007846 CmdArgs.push_back("-o");
7847 CmdArgs.push_back(Output.getFilename());
7848 } else {
7849 assert(Output.isNothing() && "Invalid output.");
7850 }
7851
Douglas Katzman78b37b02015-11-17 20:28:07 +00007852 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007853 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007854 if (Args.hasArg(options::OPT_pg))
7855 CmdArgs.push_back(
7856 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007857 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007858 CmdArgs.push_back(
7859 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7860 CmdArgs.push_back(
7861 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007862 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007863 CmdArgs.push_back(
7864 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007865 }
7866 }
7867
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007868 std::string Triple = getToolChain().getTripleString();
7869 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007870 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007871 CmdArgs.push_back(
7872 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007873
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007874 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7875 options::OPT_e, options::OPT_s, options::OPT_t,
7876 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007877
Daniel Dunbar54423b22010-09-17 00:24:54 +00007878 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007879
Douglas Katzman78b37b02015-11-17 20:28:07 +00007880 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007881 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007882 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007883 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007884 CmdArgs.push_back("-lm_p");
7885 else
7886 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007887 }
7888
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007889 // FIXME: For some reason GCC passes -lgcc before adding
7890 // the default system libraries. Just mimic this for now.
7891 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007892
Eric Christopher17674ec2012-09-13 06:32:34 +00007893 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007894 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7895 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007896 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007897 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007898 }
7899
Chandler Carruth45661652011-12-17 22:32:42 +00007900 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007901 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007902 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007903 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007904 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007905 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007906
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007907 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007908 }
7909
Douglas Katzman78b37b02015-11-17 20:28:07 +00007910 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007911 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007912 CmdArgs.push_back(
7913 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007914 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007915 CmdArgs.push_back(
7916 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007917 }
7918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007919 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007920 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007921}
Ed Schoutene33194b2009-04-02 19:13:12 +00007922
Douglas Katzman95354292015-06-23 20:42:09 +00007923void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7924 const InputInfo &Output,
7925 const InputInfoList &Inputs,
7926 const ArgList &Args,
7927 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007928 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007929 ArgStringList CmdArgs;
7930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007931 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007932
7933 CmdArgs.push_back("-o");
7934 CmdArgs.push_back(Output.getFilename());
7935
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007936 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007937 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007938
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007939 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007940 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007941}
7942
Douglas Katzman95354292015-06-23 20:42:09 +00007943void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7944 const InputInfo &Output,
7945 const InputInfoList &Inputs,
7946 const ArgList &Args,
7947 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007948 const Driver &D = getToolChain().getDriver();
7949 ArgStringList CmdArgs;
7950
Douglas Katzman78b37b02015-11-17 20:28:07 +00007951 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007952 CmdArgs.push_back("-e");
7953 CmdArgs.push_back("__start");
7954 }
7955
7956 if (Args.hasArg(options::OPT_static)) {
7957 CmdArgs.push_back("-Bstatic");
7958 } else {
7959 if (Args.hasArg(options::OPT_rdynamic))
7960 CmdArgs.push_back("-export-dynamic");
7961 CmdArgs.push_back("--eh-frame-hdr");
7962 CmdArgs.push_back("-Bdynamic");
7963 if (Args.hasArg(options::OPT_shared)) {
7964 CmdArgs.push_back("-shared");
7965 } else {
7966 CmdArgs.push_back("-dynamic-linker");
7967 CmdArgs.push_back("/usr/libexec/ld.so");
7968 }
7969 }
7970
7971 if (Output.isFilename()) {
7972 CmdArgs.push_back("-o");
7973 CmdArgs.push_back(Output.getFilename());
7974 } else {
7975 assert(Output.isNothing() && "Invalid output.");
7976 }
7977
Douglas Katzman78b37b02015-11-17 20:28:07 +00007978 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007979 if (!Args.hasArg(options::OPT_shared)) {
7980 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007981 CmdArgs.push_back(
7982 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007983 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007984 CmdArgs.push_back(
7985 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7986 CmdArgs.push_back(
7987 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007988 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007989 CmdArgs.push_back(
7990 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007991 }
7992 }
7993
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007994 Args.AddAllArgs(CmdArgs,
7995 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007996
7997 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7998
Douglas Katzman78b37b02015-11-17 20:28:07 +00007999 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008000 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008001 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8002 if (Args.hasArg(options::OPT_pg))
8003 CmdArgs.push_back("-lm_p");
8004 else
8005 CmdArgs.push_back("-lm");
8006 }
8007
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008008 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008009 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008010 CmdArgs.push_back("-lpthread_p");
8011 else
8012 CmdArgs.push_back("-lpthread");
8013 }
8014
Eli Friedman9fa28852012-08-08 23:57:20 +00008015 if (!Args.hasArg(options::OPT_shared)) {
8016 if (Args.hasArg(options::OPT_pg))
8017 CmdArgs.push_back("-lc_p");
8018 else
8019 CmdArgs.push_back("-lc");
8020 }
8021
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008022 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008023 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008024 case llvm::Triple::arm:
8025 MyArch = "arm";
8026 break;
8027 case llvm::Triple::x86:
8028 MyArch = "i386";
8029 break;
8030 case llvm::Triple::x86_64:
8031 MyArch = "amd64";
8032 break;
8033 default:
8034 llvm_unreachable("Unsupported architecture");
8035 }
8036 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008037 }
8038
Douglas Katzman78b37b02015-11-17 20:28:07 +00008039 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008040 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008041 CmdArgs.push_back(
8042 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008043 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008044 CmdArgs.push_back(
8045 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008046 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008048 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008049 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008050}
8051
Douglas Katzman95354292015-06-23 20:42:09 +00008052void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8053 const InputInfo &Output,
8054 const InputInfoList &Inputs,
8055 const ArgList &Args,
8056 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008057 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008058 ArgStringList CmdArgs;
8059
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008060 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8061 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008062 switch (getToolChain().getArch()) {
8063 default:
8064 break;
8065 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008066 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008067 break;
8068 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008069 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008070 break;
8071 case llvm::Triple::mips:
8072 case llvm::Triple::mipsel:
8073 case llvm::Triple::mips64:
8074 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008075 StringRef CPUName;
8076 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008077 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008078
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008079 CmdArgs.push_back("-march");
8080 CmdArgs.push_back(CPUName.data());
8081
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008082 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008083 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008084
8085 if (getToolChain().getArch() == llvm::Triple::mips ||
8086 getToolChain().getArch() == llvm::Triple::mips64)
8087 CmdArgs.push_back("-EB");
8088 else
8089 CmdArgs.push_back("-EL");
8090
Dimitry Andric46f338c2015-12-27 10:36:44 +00008091 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8092 StringRef v = A->getValue();
8093 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8094 A->claim();
8095 }
8096
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008097 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008098 break;
8099 }
8100 case llvm::Triple::arm:
8101 case llvm::Triple::armeb:
8102 case llvm::Triple::thumb:
8103 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008104 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008105
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008106 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008107 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008108 else
Renato Golinf4421f72014-02-19 10:44:07 +00008109 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008110
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008111 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008112 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008113 case llvm::Triple::GNUEABI:
8114 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008115 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008116 break;
8117
8118 default:
8119 CmdArgs.push_back("-matpcs");
8120 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008121 break;
8122 }
8123 case llvm::Triple::sparc:
8124 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008125 case llvm::Triple::sparcv9: {
8126 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8127 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008128 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008129 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008130 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008131 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008133 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008134
8135 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008136 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008137
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008138 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008139 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008140
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008141 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008142 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008143}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008144
Douglas Katzman95354292015-06-23 20:42:09 +00008145void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8146 const InputInfo &Output,
8147 const InputInfoList &Inputs,
8148 const ArgList &Args,
8149 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008150 const toolchains::FreeBSD &ToolChain =
8151 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008152 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008153 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008154 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008155 !Args.hasArg(options::OPT_shared) &&
8156 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008157 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008158
8159 // Silence warning for "clang -g foo.o -o foo"
8160 Args.ClaimAllArgs(options::OPT_g_Group);
8161 // and "clang -emit-llvm foo.o -o foo"
8162 Args.ClaimAllArgs(options::OPT_emit_llvm);
8163 // and for "clang -w foo.o -o foo". Other warning options are already
8164 // handled somewhere else.
8165 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008166
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008167 if (!D.SysRoot.empty())
8168 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8169
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008170 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008171 CmdArgs.push_back("-pie");
8172
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008173 if (Args.hasArg(options::OPT_static)) {
8174 CmdArgs.push_back("-Bstatic");
8175 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008176 if (Args.hasArg(options::OPT_rdynamic))
8177 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008178 CmdArgs.push_back("--eh-frame-hdr");
8179 if (Args.hasArg(options::OPT_shared)) {
8180 CmdArgs.push_back("-Bshareable");
8181 } else {
8182 CmdArgs.push_back("-dynamic-linker");
8183 CmdArgs.push_back("/libexec/ld-elf.so.1");
8184 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008185 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008186 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8187 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8188 CmdArgs.push_back("--hash-style=both");
8189 }
8190 }
8191 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008192 }
8193
8194 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8195 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008196 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008197 CmdArgs.push_back("-m");
8198 CmdArgs.push_back("elf_i386_fbsd");
8199 }
8200
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008201 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008202 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008203 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008204 }
8205
Dimitry Andric904895f2015-12-27 06:47:09 +00008206 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8207 if (ToolChain.getArch() == llvm::Triple::mips ||
8208 ToolChain.getArch() == llvm::Triple::mipsel ||
8209 ToolChain.getArch() == llvm::Triple::mips64 ||
8210 ToolChain.getArch() == llvm::Triple::mips64el) {
8211 StringRef v = A->getValue();
8212 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8213 A->claim();
8214 }
8215 }
8216
Daniel Dunbarb440f562010-08-02 02:38:21 +00008217 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008218 CmdArgs.push_back("-o");
8219 CmdArgs.push_back(Output.getFilename());
8220 } else {
8221 assert(Output.isNothing() && "Invalid output.");
8222 }
8223
Douglas Katzman78b37b02015-11-17 20:28:07 +00008224 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008225 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008226 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008227 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008228 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008229 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008230 crt1 = "Scrt1.o";
8231 else
8232 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008233 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008234 if (crt1)
8235 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8236
8237 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8238
Craig Topper92fc2df2014-05-17 16:56:41 +00008239 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008240 if (Args.hasArg(options::OPT_static))
8241 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008242 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008243 crtbegin = "crtbeginS.o";
8244 else
8245 crtbegin = "crtbegin.o";
8246
8247 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008248 }
8249
8250 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008251 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008252 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8253 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008254 Args.AddAllArgs(CmdArgs, options::OPT_s);
8255 Args.AddAllArgs(CmdArgs, options::OPT_t);
8256 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8257 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008258
Teresa Johnson945bc502015-10-15 20:35:53 +00008259 if (D.isUsingLTO())
8260 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008261
Alexey Samsonov52550342014-09-15 19:58:40 +00008262 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008263 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008264
Douglas Katzman78b37b02015-11-17 20:28:07 +00008265 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008266 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008267 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008268 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008269 if (Args.hasArg(options::OPT_pg))
8270 CmdArgs.push_back("-lm_p");
8271 else
8272 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008273 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008274 if (NeedsSanitizerDeps)
8275 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008276 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8277 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008278 if (Args.hasArg(options::OPT_pg))
8279 CmdArgs.push_back("-lgcc_p");
8280 else
8281 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008282 if (Args.hasArg(options::OPT_static)) {
8283 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008284 } else if (Args.hasArg(options::OPT_pg)) {
8285 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008286 } else {
8287 CmdArgs.push_back("--as-needed");
8288 CmdArgs.push_back("-lgcc_s");
8289 CmdArgs.push_back("--no-as-needed");
8290 }
8291
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008292 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008293 if (Args.hasArg(options::OPT_pg))
8294 CmdArgs.push_back("-lpthread_p");
8295 else
8296 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008297 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008298
Roman Divacky66f22762011-02-10 16:59:40 +00008299 if (Args.hasArg(options::OPT_pg)) {
8300 if (Args.hasArg(options::OPT_shared))
8301 CmdArgs.push_back("-lc");
8302 else
8303 CmdArgs.push_back("-lc_p");
8304 CmdArgs.push_back("-lgcc_p");
8305 } else {
8306 CmdArgs.push_back("-lc");
8307 CmdArgs.push_back("-lgcc");
8308 }
8309
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008310 if (Args.hasArg(options::OPT_static)) {
8311 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008312 } else if (Args.hasArg(options::OPT_pg)) {
8313 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008314 } else {
8315 CmdArgs.push_back("--as-needed");
8316 CmdArgs.push_back("-lgcc_s");
8317 CmdArgs.push_back("--no-as-needed");
8318 }
8319 }
8320
Douglas Katzman78b37b02015-11-17 20:28:07 +00008321 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008322 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008323 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008324 else
8325 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008326 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008327 }
8328
Xinliang David Li69306c02015-10-22 06:15:31 +00008329 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008331 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008332 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008333}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008334
Douglas Katzman95354292015-06-23 20:42:09 +00008335void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008336 const InputInfo &Output,
8337 const InputInfoList &Inputs,
8338 const ArgList &Args,
8339 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008340 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008341 ArgStringList CmdArgs;
8342
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008343 // GNU as needs different flags for creating the correct output format
8344 // on architectures with different ABIs or optional feature sets.
8345 switch (getToolChain().getArch()) {
8346 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008347 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008348 break;
8349 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008350 case llvm::Triple::armeb:
8351 case llvm::Triple::thumb:
8352 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008353 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008354 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8355 std::string Arch =
8356 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008357 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008358 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008359 }
8360
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008361 case llvm::Triple::mips:
8362 case llvm::Triple::mipsel:
8363 case llvm::Triple::mips64:
8364 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008365 StringRef CPUName;
8366 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008367 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008368
8369 CmdArgs.push_back("-march");
8370 CmdArgs.push_back(CPUName.data());
8371
8372 CmdArgs.push_back("-mabi");
8373 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8374
8375 if (getToolChain().getArch() == llvm::Triple::mips ||
8376 getToolChain().getArch() == llvm::Triple::mips64)
8377 CmdArgs.push_back("-EB");
8378 else
8379 CmdArgs.push_back("-EL");
8380
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008381 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008382 break;
8383 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008384
8385 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008386 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008387 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008388 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8389 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008390 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008391 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008392 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008393
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008394 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008395 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008396 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8397 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008398 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008399 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008400 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008401
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008402 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008403 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008404 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008405
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008406 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008407
8408 CmdArgs.push_back("-o");
8409 CmdArgs.push_back(Output.getFilename());
8410
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008411 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008412 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008413
David Chisnallddbd68f2011-09-27 22:03:18 +00008414 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008415 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008416}
8417
Douglas Katzman95354292015-06-23 20:42:09 +00008418void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8419 const InputInfo &Output,
8420 const InputInfoList &Inputs,
8421 const ArgList &Args,
8422 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008423 const Driver &D = getToolChain().getDriver();
8424 ArgStringList CmdArgs;
8425
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008426 if (!D.SysRoot.empty())
8427 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8428
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008429 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008430 if (Args.hasArg(options::OPT_static)) {
8431 CmdArgs.push_back("-Bstatic");
8432 } else {
8433 if (Args.hasArg(options::OPT_rdynamic))
8434 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008435 if (Args.hasArg(options::OPT_shared)) {
8436 CmdArgs.push_back("-Bshareable");
8437 } else {
8438 CmdArgs.push_back("-dynamic-linker");
8439 CmdArgs.push_back("/libexec/ld.elf_so");
8440 }
8441 }
8442
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008443 // Many NetBSD architectures support more than one ABI.
8444 // Determine the correct emulation for ld.
8445 switch (getToolChain().getArch()) {
8446 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008447 CmdArgs.push_back("-m");
8448 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008449 break;
8450 case llvm::Triple::arm:
8451 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008452 CmdArgs.push_back("-m");
8453 switch (getToolChain().getTriple().getEnvironment()) {
8454 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008455 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008456 CmdArgs.push_back("armelf_nbsd_eabi");
8457 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008458 case llvm::Triple::EABIHF:
8459 case llvm::Triple::GNUEABIHF:
8460 CmdArgs.push_back("armelf_nbsd_eabihf");
8461 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008462 default:
8463 CmdArgs.push_back("armelf_nbsd");
8464 break;
8465 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008466 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008467 case llvm::Triple::armeb:
8468 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008469 arm::appendEBLinkFlags(
8470 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008471 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008472 CmdArgs.push_back("-m");
8473 switch (getToolChain().getTriple().getEnvironment()) {
8474 case llvm::Triple::EABI:
8475 case llvm::Triple::GNUEABI:
8476 CmdArgs.push_back("armelfb_nbsd_eabi");
8477 break;
8478 case llvm::Triple::EABIHF:
8479 case llvm::Triple::GNUEABIHF:
8480 CmdArgs.push_back("armelfb_nbsd_eabihf");
8481 break;
8482 default:
8483 CmdArgs.push_back("armelfb_nbsd");
8484 break;
8485 }
8486 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008487 case llvm::Triple::mips64:
8488 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008489 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008490 CmdArgs.push_back("-m");
8491 if (getToolChain().getArch() == llvm::Triple::mips64)
8492 CmdArgs.push_back("elf32btsmip");
8493 else
8494 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008495 } else if (mips::hasMipsAbiArg(Args, "64")) {
8496 CmdArgs.push_back("-m");
8497 if (getToolChain().getArch() == llvm::Triple::mips64)
8498 CmdArgs.push_back("elf64btsmip");
8499 else
8500 CmdArgs.push_back("elf64ltsmip");
8501 }
8502 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008503 case llvm::Triple::ppc:
8504 CmdArgs.push_back("-m");
8505 CmdArgs.push_back("elf32ppc_nbsd");
8506 break;
8507
8508 case llvm::Triple::ppc64:
8509 case llvm::Triple::ppc64le:
8510 CmdArgs.push_back("-m");
8511 CmdArgs.push_back("elf64ppc");
8512 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008513
8514 case llvm::Triple::sparc:
8515 CmdArgs.push_back("-m");
8516 CmdArgs.push_back("elf32_sparc");
8517 break;
8518
8519 case llvm::Triple::sparcv9:
8520 CmdArgs.push_back("-m");
8521 CmdArgs.push_back("elf64_sparc");
8522 break;
8523
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008524 default:
8525 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008526 }
8527
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008528 if (Output.isFilename()) {
8529 CmdArgs.push_back("-o");
8530 CmdArgs.push_back(Output.getFilename());
8531 } else {
8532 assert(Output.isNothing() && "Invalid output.");
8533 }
8534
Douglas Katzman78b37b02015-11-17 20:28:07 +00008535 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008536 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008537 CmdArgs.push_back(
8538 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8539 CmdArgs.push_back(
8540 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8541 CmdArgs.push_back(
8542 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008543 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008544 CmdArgs.push_back(
8545 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8546 CmdArgs.push_back(
8547 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008548 }
8549 }
8550
8551 Args.AddAllArgs(CmdArgs, options::OPT_L);
8552 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8553 Args.AddAllArgs(CmdArgs, options::OPT_e);
8554 Args.AddAllArgs(CmdArgs, options::OPT_s);
8555 Args.AddAllArgs(CmdArgs, options::OPT_t);
8556 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8557 Args.AddAllArgs(CmdArgs, options::OPT_r);
8558
8559 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8560
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008561 unsigned Major, Minor, Micro;
8562 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8563 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008564 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008565 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008566 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008567 case llvm::Triple::arm:
8568 case llvm::Triple::armeb:
8569 case llvm::Triple::thumb:
8570 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008571 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008572 case llvm::Triple::ppc64:
8573 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008574 case llvm::Triple::sparc:
8575 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008576 case llvm::Triple::x86:
8577 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008578 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008579 break;
8580 default:
8581 break;
8582 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008583 }
8584
Douglas Katzman78b37b02015-11-17 20:28:07 +00008585 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008586 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008587 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008588 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8589 CmdArgs.push_back("-lm");
8590 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008591 if (Args.hasArg(options::OPT_pthread))
8592 CmdArgs.push_back("-lpthread");
8593 CmdArgs.push_back("-lc");
8594
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008595 if (useLibgcc) {
8596 if (Args.hasArg(options::OPT_static)) {
8597 // libgcc_eh depends on libc, so resolve as much as possible,
8598 // pull in any new requirements from libc and then get the rest
8599 // of libgcc.
8600 CmdArgs.push_back("-lgcc_eh");
8601 CmdArgs.push_back("-lc");
8602 CmdArgs.push_back("-lgcc");
8603 } else {
8604 CmdArgs.push_back("-lgcc");
8605 CmdArgs.push_back("--as-needed");
8606 CmdArgs.push_back("-lgcc_s");
8607 CmdArgs.push_back("--no-as-needed");
8608 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008609 }
8610 }
8611
Douglas Katzman78b37b02015-11-17 20:28:07 +00008612 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008613 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008614 CmdArgs.push_back(
8615 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008616 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008617 CmdArgs.push_back(
8618 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8619 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008620 }
8621
Xinliang David Li69306c02015-10-22 06:15:31 +00008622 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008623
Logan Chieneb9162f2014-06-26 14:23:45 +00008624 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008625 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008626}
8627
Douglas Katzman95354292015-06-23 20:42:09 +00008628void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8629 const InputInfo &Output,
8630 const InputInfoList &Inputs,
8631 const ArgList &Args,
8632 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008633 claimNoWarnArgs(Args);
8634
James Y Knight2db38f32015-08-15 03:45:25 +00008635 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8636 llvm::Triple Triple = llvm::Triple(TripleStr);
8637
Rafael Espindola92b00932010-08-10 00:25:48 +00008638 ArgStringList CmdArgs;
8639
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008640 llvm::Reloc::Model RelocationModel;
8641 unsigned PICLevel;
8642 bool IsPIE;
8643 std::tie(RelocationModel, PICLevel, IsPIE) =
8644 ParsePICArgs(getToolChain(), Triple, Args);
8645
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008646 switch (getToolChain().getArch()) {
8647 default:
8648 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008649 // Add --32/--64 to make sure we get the format we want.
8650 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008651 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008652 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008653 break;
8654 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008655 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8656 CmdArgs.push_back("--x32");
8657 else
8658 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008659 break;
8660 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008661 CmdArgs.push_back("-a32");
8662 CmdArgs.push_back("-mppc");
8663 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008664 break;
8665 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008666 CmdArgs.push_back("-a64");
8667 CmdArgs.push_back("-mppc64");
8668 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008669 break;
8670 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008671 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008672 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008673 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008674 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008675 break;
8676 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008677 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008678 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008679 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8680 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8681 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008682 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008683 }
8684 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008685 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008686 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8687 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8688 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008689 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008690 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008691 case llvm::Triple::arm:
8692 case llvm::Triple::armeb:
8693 case llvm::Triple::thumb:
8694 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008695 const llvm::Triple &Triple2 = getToolChain().getTriple();
8696 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008697 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008698 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008699 break;
8700 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008701 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008702 break;
8703 default:
8704 break;
8705 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008706
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008707 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008708 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8709 case arm::FloatABI::Soft:
8710 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8711 break;
8712 case arm::FloatABI::SoftFP:
8713 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8714 break;
8715 case arm::FloatABI::Hard:
8716 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8717 break;
8718 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008719
8720 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008721
8722 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008723 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008724 // march from being picked in the absence of a cpu flag.
8725 Arg *A;
8726 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008727 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008728 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008729 else
8730 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008731 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008732 break;
8733 }
8734 case llvm::Triple::mips:
8735 case llvm::Triple::mipsel:
8736 case llvm::Triple::mips64:
8737 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008738 StringRef CPUName;
8739 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008740 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008741 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008742
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008743 CmdArgs.push_back("-march");
8744 CmdArgs.push_back(CPUName.data());
8745
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008746 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008747 CmdArgs.push_back(ABIName.data());
8748
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008749 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8750 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008751 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008752 CmdArgs.push_back("-mno-shared");
8753
Daniel Sanders379d44b2014-07-16 11:52:23 +00008754 // LLVM doesn't support -mplt yet and acts as if it is always given.
8755 // However, -mplt has no effect with the N64 ABI.
8756 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008757
8758 if (getToolChain().getArch() == llvm::Triple::mips ||
8759 getToolChain().getArch() == llvm::Triple::mips64)
8760 CmdArgs.push_back("-EB");
8761 else
8762 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008763
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008764 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8765 if (StringRef(A->getValue()) == "2008")
8766 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8767 }
8768
Daniel Sanders379d44b2014-07-16 11:52:23 +00008769 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8770 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8771 options::OPT_mfp64)) {
8772 A->claim();
8773 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008774 } else if (mips::shouldUseFPXX(
8775 Args, getToolChain().getTriple(), CPUName, ABIName,
8776 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008777 CmdArgs.push_back("-mfpxx");
8778
8779 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8780 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008781 if (Arg *A =
8782 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008783 if (A->getOption().matches(options::OPT_mips16)) {
8784 A->claim();
8785 A->render(Args, CmdArgs);
8786 } else {
8787 A->claim();
8788 CmdArgs.push_back("-no-mips16");
8789 }
8790 }
8791
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008792 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8793 options::OPT_mno_micromips);
8794 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8795 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8796
Simon Atanasyanbd986632013-11-26 11:58:04 +00008797 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8798 // Do not use AddLastArg because not all versions of MIPS assembler
8799 // support -mmsa / -mno-msa options.
8800 if (A->getOption().matches(options::OPT_mmsa))
8801 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8802 }
8803
Daniel Sanders379d44b2014-07-16 11:52:23 +00008804 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8805 options::OPT_msoft_float);
8806
Toma Tabacub36d6102015-06-11 12:13:18 +00008807 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8808 options::OPT_msingle_float);
8809
Daniel Sanders379d44b2014-07-16 11:52:23 +00008810 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8811 options::OPT_mno_odd_spreg);
8812
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008813 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008814 break;
8815 }
8816 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008817 // Always pass an -march option, since our default of z10 is later
8818 // than the GNU assembler's default.
8819 StringRef CPUName = getSystemZTargetCPU(Args);
8820 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008821 break;
8822 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008823 }
8824
Renato Golina74bbc72015-07-22 15:32:36 +00008825 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008826 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008827
8828 CmdArgs.push_back("-o");
8829 CmdArgs.push_back(Output.getFilename());
8830
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008831 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008832 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008833
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008834 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008835 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008836
8837 // Handle the debug info splitting at object creation time if we're
8838 // creating an object.
8839 // TODO: Currently only works on linux with newer objcopy.
8840 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008841 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008842 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008843 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008844}
8845
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008846static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008847 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008848 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008849 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008850 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8851 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008852 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008853 CmdArgs.push_back("-lgcc");
8854
Logan Chien3d3373c2012-11-19 12:04:11 +00008855 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008856 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008857 CmdArgs.push_back("-lgcc");
8858 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008859 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008860 CmdArgs.push_back("--as-needed");
8861 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008862 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008863 CmdArgs.push_back("--no-as-needed");
8864 }
8865
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008866 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008867 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008868 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008869 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008870
8871 // According to Android ABI, we have to link with libdl if we are
8872 // linking with non-static libgcc.
8873 //
8874 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8875 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8876 if (isAndroid && !StaticLibgcc)
8877 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008878}
8879
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008880static std::string getLinuxDynamicLinker(const ArgList &Args,
8881 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008882 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8883
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008884 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008885 if (ToolChain.getTriple().isArch64Bit())
8886 return "/system/bin/linker64";
8887 else
8888 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008889 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8890 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008891 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008892 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008893 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008894 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008895 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008896 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008897 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008898 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008899 return "/lib/ld-linux-armhf.so.3";
8900 else
8901 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008902 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8903 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008904 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008905 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008906 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008907 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008908 return "/lib/ld-linux.so.3";
8909 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8910 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008911 std::string LibDir =
8912 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008913 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008914 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008915 if (mips::isUCLibc(Args))
8916 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008917 else if (!ToolChain.getTriple().hasEnvironment()) {
8918 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8919 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8920 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8921 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008922 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008923
8924 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008925 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008926 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008927 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008928 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8929 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008930 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008931 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008932 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8933 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008934 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008935 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008936 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008937 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008938 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008939 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008940 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8941 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008942 else
8943 return "/lib64/ld-linux-x86-64.so.2";
8944}
8945
Renato Golinc4b49242014-02-13 10:01:16 +00008946static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008947 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008948 // Make use of compiler-rt if --rtlib option is used
8949 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8950
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008951 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008952 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008953 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008954 default:
8955 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008956 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008957 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008958 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008959 break;
8960 }
Renato Golinc4b49242014-02-13 10:01:16 +00008961 break;
8962 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00008963 // Make sure libgcc is not used under MSVC environment by default
8964 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
8965 // Issue error diagnostic if libgcc is explicitly specified
8966 // through command line as --rtlib option argument.
8967 if (Args.hasArg(options::OPT_rtlib_EQ)) {
8968 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
8969 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
8970 }
8971 } else
8972 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00008973 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008974 }
8975}
8976
Rafael Espindola1e085772014-08-15 17:14:35 +00008977static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8978 switch (T.getArch()) {
8979 case llvm::Triple::x86:
8980 return "elf_i386";
8981 case llvm::Triple::aarch64:
8982 return "aarch64linux";
8983 case llvm::Triple::aarch64_be:
8984 return "aarch64_be_linux";
8985 case llvm::Triple::arm:
8986 case llvm::Triple::thumb:
8987 return "armelf_linux_eabi";
8988 case llvm::Triple::armeb:
8989 case llvm::Triple::thumbeb:
8990 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8991 case llvm::Triple::ppc:
8992 return "elf32ppclinux";
8993 case llvm::Triple::ppc64:
8994 return "elf64ppc";
8995 case llvm::Triple::ppc64le:
8996 return "elf64lppc";
8997 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008998 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008999 return "elf32_sparc";
9000 case llvm::Triple::sparcv9:
9001 return "elf64_sparc";
9002 case llvm::Triple::mips:
9003 return "elf32btsmip";
9004 case llvm::Triple::mipsel:
9005 return "elf32ltsmip";
9006 case llvm::Triple::mips64:
9007 if (mips::hasMipsAbiArg(Args, "n32"))
9008 return "elf32btsmipn32";
9009 return "elf64btsmip";
9010 case llvm::Triple::mips64el:
9011 if (mips::hasMipsAbiArg(Args, "n32"))
9012 return "elf32ltsmipn32";
9013 return "elf64ltsmip";
9014 case llvm::Triple::systemz:
9015 return "elf64_s390";
9016 case llvm::Triple::x86_64:
9017 if (T.getEnvironment() == llvm::Triple::GNUX32)
9018 return "elf32_x86_64";
9019 return "elf_x86_64";
9020 default:
9021 llvm_unreachable("Unexpected arch");
9022 }
9023}
9024
Douglas Katzman95354292015-06-23 20:42:09 +00009025void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9026 const InputInfo &Output,
9027 const InputInfoList &Inputs,
9028 const ArgList &Args,
9029 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009030 const toolchains::Linux &ToolChain =
9031 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009032 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009033
9034 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9035 llvm::Triple Triple = llvm::Triple(TripleStr);
9036
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009037 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009038 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009039 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009040 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9041 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009042 const bool HasCRTBeginEndFiles =
9043 ToolChain.getTriple().hasEnvironment() ||
9044 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009045
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009046 ArgStringList CmdArgs;
9047
Rafael Espindolad1002f62010-11-15 18:28:16 +00009048 // Silence warning for "clang -g foo.o -o foo"
9049 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009050 // and "clang -emit-llvm foo.o -o foo"
9051 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009052 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009053 // handled somewhere else.
9054 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009055
Peter Collingbourne39719a72015-11-20 20:49:39 +00009056 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9057 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009058 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009059 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009060 CmdArgs.push_back("-target");
9061 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9062 }
9063
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009064 if (!D.SysRoot.empty())
9065 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009066
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009067 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009068 CmdArgs.push_back("-pie");
9069
Rafael Espindola1c76c592010-11-07 22:57:16 +00009070 if (Args.hasArg(options::OPT_rdynamic))
9071 CmdArgs.push_back("-export-dynamic");
9072
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009073 if (Args.hasArg(options::OPT_s))
9074 CmdArgs.push_back("-s");
9075
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009076 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009077 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009078
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009079 for (const auto &Opt : ToolChain.ExtraOpts)
9080 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009081
9082 if (!Args.hasArg(options::OPT_static)) {
9083 CmdArgs.push_back("--eh-frame-hdr");
9084 }
9085
9086 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009087 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009088
9089 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009090 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9091 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009092 CmdArgs.push_back("-Bstatic");
9093 else
9094 CmdArgs.push_back("-static");
9095 } else if (Args.hasArg(options::OPT_shared)) {
9096 CmdArgs.push_back("-shared");
9097 }
9098
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009099 if (!Args.hasArg(options::OPT_static)) {
9100 if (Args.hasArg(options::OPT_rdynamic))
9101 CmdArgs.push_back("-export-dynamic");
9102
9103 if (!Args.hasArg(options::OPT_shared)) {
9104 const std::string Loader =
9105 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9106 CmdArgs.push_back("-dynamic-linker");
9107 CmdArgs.push_back(Args.MakeArgString(Loader));
9108 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009109 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009110
9111 CmdArgs.push_back("-o");
9112 CmdArgs.push_back(Output.getFilename());
9113
Douglas Katzman78b37b02015-11-17 20:28:07 +00009114 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009115 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009116 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009117 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009118 if (Args.hasArg(options::OPT_pg))
9119 crt1 = "gcrt1.o";
9120 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009121 crt1 = "Scrt1.o";
9122 else
9123 crt1 = "crt1.o";
9124 }
9125 if (crt1)
9126 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009127
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009128 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9129 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009130
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009131 const char *crtbegin;
9132 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009133 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009134 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009135 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009136 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009137 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009138 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009139 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009140
9141 if (HasCRTBeginEndFiles)
9142 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009143
9144 // Add crtfastmath.o if available and fast math is enabled.
9145 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009146 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009147
9148 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009149 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009150
Douglas Katzman6059ef92015-11-17 17:41:23 +00009151 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009152
Teresa Johnson945bc502015-10-15 20:35:53 +00009153 if (D.isUsingLTO())
9154 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009155
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009156 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9157 CmdArgs.push_back("--no-demangle");
9158
Alexey Samsonov52550342014-09-15 19:58:40 +00009159 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009160 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009161 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009162 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009163
Douglas Katzman78b37b02015-11-17 20:28:07 +00009164 if (D.CCCIsCXX() &&
9165 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009166 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009167 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009168 if (OnlyLibstdcxxStatic)
9169 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009170 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009171 if (OnlyLibstdcxxStatic)
9172 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009173 CmdArgs.push_back("-lm");
9174 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009175 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9176 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009177
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009178 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009179 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9180 if (Args.hasArg(options::OPT_static))
9181 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009182
Alexey Samsonov52550342014-09-15 19:58:40 +00009183 if (NeedsSanitizerDeps)
9184 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9185
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009186 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9187 Args.hasArg(options::OPT_pthreads);
9188
9189 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9190 options::OPT_fno_openmp, false)) {
9191 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9192 // FIXME: Does this really make sense for all GNU toolchains?
9193 WantPthread = true;
9194
9195 // Also link the particular OpenMP runtimes.
9196 switch (getOpenMPRuntime(ToolChain, Args)) {
9197 case OMPRT_OMP:
9198 CmdArgs.push_back("-lomp");
9199 break;
9200 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009201 CmdArgs.push_back("-lgomp");
9202
9203 // FIXME: Exclude this for platforms with libgomp that don't require
9204 // librt. Most modern Linux platforms require it, but some may not.
9205 CmdArgs.push_back("-lrt");
9206 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009207 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009208 CmdArgs.push_back("-liomp5");
9209 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009210 case OMPRT_Unknown:
9211 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009212 break;
9213 }
Chandler Carruth01538002013-01-17 13:19:29 +00009214 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009215
Renato Golinc4b49242014-02-13 10:01:16 +00009216 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009217
Richard Smith31d1de22015-05-20 22:48:44 +00009218 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009219 CmdArgs.push_back("-lpthread");
9220
Rafael Espindolab17bc532016-01-25 18:29:16 +00009221 if (Args.hasArg(options::OPT_fsplit_stack))
9222 CmdArgs.push_back("--wrap=pthread_create");
9223
Chandler Carruth94a32012012-05-14 18:31:18 +00009224 CmdArgs.push_back("-lc");
9225
9226 if (Args.hasArg(options::OPT_static))
9227 CmdArgs.push_back("--end-group");
9228 else
Renato Golinc4b49242014-02-13 10:01:16 +00009229 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009230 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009231
Rafael Espindola81937ec2010-12-01 01:52:43 +00009232 if (!Args.hasArg(options::OPT_nostartfiles)) {
9233 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009234 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009235 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009236 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009237 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009238 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009239 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009240
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009241 if (HasCRTBeginEndFiles)
9242 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009243 if (!isAndroid)
9244 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009245 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009246 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009247
Peter Collingbourne39719a72015-11-20 20:49:39 +00009248 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009249}
9250
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009251// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9252// for the various SFI requirements like register masking. The assembly tool
9253// inserts the file containing the macros as an input into all the assembly
9254// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009255void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9256 const InputInfo &Output,
9257 const InputInfoList &Inputs,
9258 const ArgList &Args,
9259 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009260 const toolchains::NaClToolChain &ToolChain =
9261 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009262 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009263 "nacl-arm-macros.s");
9264 InputInfoList NewInputs;
9265 NewInputs.push_back(NaClMacros);
9266 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009267 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9268 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009269}
9270
Douglas Katzman750cfc52015-06-29 18:42:16 +00009271// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009272// we use static by default, do not yet support sanitizers or LTO, and a few
9273// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009274// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009275void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9276 const InputInfo &Output,
9277 const InputInfoList &Inputs,
9278 const ArgList &Args,
9279 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009280
Douglas Katzman54366072015-07-27 16:53:08 +00009281 const toolchains::NaClToolChain &ToolChain =
9282 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009283 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009284 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009285 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009286 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009287
9288 ArgStringList CmdArgs;
9289
9290 // Silence warning for "clang -g foo.o -o foo"
9291 Args.ClaimAllArgs(options::OPT_g_Group);
9292 // and "clang -emit-llvm foo.o -o foo"
9293 Args.ClaimAllArgs(options::OPT_emit_llvm);
9294 // and for "clang -w foo.o -o foo". Other warning options are already
9295 // handled somewhere else.
9296 Args.ClaimAllArgs(options::OPT_w);
9297
9298 if (!D.SysRoot.empty())
9299 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9300
9301 if (Args.hasArg(options::OPT_rdynamic))
9302 CmdArgs.push_back("-export-dynamic");
9303
9304 if (Args.hasArg(options::OPT_s))
9305 CmdArgs.push_back("-s");
9306
Douglas Katzman54366072015-07-27 16:53:08 +00009307 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9308 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009309 CmdArgs.push_back("--build-id");
9310
9311 if (!IsStatic)
9312 CmdArgs.push_back("--eh-frame-hdr");
9313
9314 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009315 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009316 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009317 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009318 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009319 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009320 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009321 else if (Arch == llvm::Triple::mipsel)
9322 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009323 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009324 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9325 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009326
9327 if (IsStatic)
9328 CmdArgs.push_back("-static");
9329 else if (Args.hasArg(options::OPT_shared))
9330 CmdArgs.push_back("-shared");
9331
9332 CmdArgs.push_back("-o");
9333 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009334 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009335 if (!Args.hasArg(options::OPT_shared))
9336 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9337 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9338
9339 const char *crtbegin;
9340 if (IsStatic)
9341 crtbegin = "crtbeginT.o";
9342 else if (Args.hasArg(options::OPT_shared))
9343 crtbegin = "crtbeginS.o";
9344 else
9345 crtbegin = "crtbegin.o";
9346 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9347 }
9348
9349 Args.AddAllArgs(CmdArgs, options::OPT_L);
9350 Args.AddAllArgs(CmdArgs, options::OPT_u);
9351
Douglas Katzman6059ef92015-11-17 17:41:23 +00009352 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009353
9354 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9355 CmdArgs.push_back("--no-demangle");
9356
9357 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9358
Douglas Katzman78b37b02015-11-17 20:28:07 +00009359 if (D.CCCIsCXX() &&
9360 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009361 bool OnlyLibstdcxxStatic =
9362 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009363 if (OnlyLibstdcxxStatic)
9364 CmdArgs.push_back("-Bstatic");
9365 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9366 if (OnlyLibstdcxxStatic)
9367 CmdArgs.push_back("-Bdynamic");
9368 CmdArgs.push_back("-lm");
9369 }
9370
9371 if (!Args.hasArg(options::OPT_nostdlib)) {
9372 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9373 // Always use groups, since it has no effect on dynamic libraries.
9374 CmdArgs.push_back("--start-group");
9375 CmdArgs.push_back("-lc");
9376 // NaCl's libc++ currently requires libpthread, so just always include it
9377 // in the group for C++.
9378 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009379 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009380 // Gold, used by Mips, handles nested groups differently than ld, and
9381 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9382 // which is not a desired behaviour here.
9383 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9384 if (getToolChain().getArch() == llvm::Triple::mipsel)
9385 CmdArgs.push_back("-lnacl");
9386
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009387 CmdArgs.push_back("-lpthread");
9388 }
9389
9390 CmdArgs.push_back("-lgcc");
9391 CmdArgs.push_back("--as-needed");
9392 if (IsStatic)
9393 CmdArgs.push_back("-lgcc_eh");
9394 else
9395 CmdArgs.push_back("-lgcc_s");
9396 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009397
9398 // Mips needs to create and use pnacl_legacy library that contains
9399 // definitions from bitcode/pnaclmm.c and definitions for
9400 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9401 if (getToolChain().getArch() == llvm::Triple::mipsel)
9402 CmdArgs.push_back("-lpnacl_legacy");
9403
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009404 CmdArgs.push_back("--end-group");
9405 }
9406
9407 if (!Args.hasArg(options::OPT_nostartfiles)) {
9408 const char *crtend;
9409 if (Args.hasArg(options::OPT_shared))
9410 crtend = "crtendS.o";
9411 else
9412 crtend = "crtend.o";
9413
9414 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9415 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9416 }
9417 }
9418
Peter Collingbourne39719a72015-11-20 20:49:39 +00009419 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9420 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009421}
9422
Douglas Katzman95354292015-06-23 20:42:09 +00009423void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9424 const InputInfo &Output,
9425 const InputInfoList &Inputs,
9426 const ArgList &Args,
9427 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009428 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009429 ArgStringList CmdArgs;
9430
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009431 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009432
9433 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009434 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009435
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009436 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009437 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009438
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009439 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009440 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009441}
9442
Douglas Katzman95354292015-06-23 20:42:09 +00009443void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9444 const InputInfo &Output,
9445 const InputInfoList &Inputs,
9446 const ArgList &Args,
9447 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009448 const Driver &D = getToolChain().getDriver();
9449 ArgStringList CmdArgs;
9450
Daniel Dunbarb440f562010-08-02 02:38:21 +00009451 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009452 CmdArgs.push_back("-o");
9453 CmdArgs.push_back(Output.getFilename());
9454 } else {
9455 assert(Output.isNothing() && "Invalid output.");
9456 }
9457
Douglas Katzman78b37b02015-11-17 20:28:07 +00009458 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009459 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9460 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9461 CmdArgs.push_back(
9462 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9463 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009464 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009465
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009466 Args.AddAllArgs(CmdArgs,
9467 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009468
Daniel Dunbar54423b22010-09-17 00:24:54 +00009469 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009470
Xinliang David Li69306c02015-10-22 06:15:31 +00009471 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009472
Douglas Katzman78b37b02015-11-17 20:28:07 +00009473 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009474 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009475 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009476 CmdArgs.push_back("-lm");
9477 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009478 }
9479
Douglas Katzman78b37b02015-11-17 20:28:07 +00009480 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009481 if (Args.hasArg(options::OPT_pthread))
9482 CmdArgs.push_back("-lpthread");
9483 CmdArgs.push_back("-lc");
9484 CmdArgs.push_back("-lCompilerRT-Generic");
9485 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9486 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009487 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009488 }
9489
Logan Chieneb9162f2014-06-26 14:23:45 +00009490 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009491 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009492}
9493
Daniel Dunbarcc912342009-05-02 18:28:39 +00009494/// DragonFly Tools
9495
9496// For now, DragonFly Assemble does just about the same as for
9497// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009498void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9499 const InputInfo &Output,
9500 const InputInfoList &Inputs,
9501 const ArgList &Args,
9502 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009503 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009504 ArgStringList CmdArgs;
9505
9506 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9507 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009508 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009509 CmdArgs.push_back("--32");
9510
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009511 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009512
9513 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009514 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009515
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009516 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009517 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009518
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009519 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009520 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009521}
9522
Douglas Katzman95354292015-06-23 20:42:09 +00009523void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9524 const InputInfo &Output,
9525 const InputInfoList &Inputs,
9526 const ArgList &Args,
9527 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009528 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009529 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009530
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009531 if (!D.SysRoot.empty())
9532 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9533
John McCall65b8da02013-04-11 22:55:55 +00009534 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009535 if (Args.hasArg(options::OPT_static)) {
9536 CmdArgs.push_back("-Bstatic");
9537 } else {
John McCall65b8da02013-04-11 22:55:55 +00009538 if (Args.hasArg(options::OPT_rdynamic))
9539 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009540 if (Args.hasArg(options::OPT_shared))
9541 CmdArgs.push_back("-Bshareable");
9542 else {
9543 CmdArgs.push_back("-dynamic-linker");
9544 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9545 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009546 CmdArgs.push_back("--hash-style=gnu");
9547 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009548 }
9549
9550 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9551 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009552 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009553 CmdArgs.push_back("-m");
9554 CmdArgs.push_back("elf_i386");
9555 }
9556
Daniel Dunbarb440f562010-08-02 02:38:21 +00009557 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009558 CmdArgs.push_back("-o");
9559 CmdArgs.push_back(Output.getFilename());
9560 } else {
9561 assert(Output.isNothing() && "Invalid output.");
9562 }
9563
Douglas Katzman78b37b02015-11-17 20:28:07 +00009564 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009565 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009566 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009567 CmdArgs.push_back(
9568 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009569 else {
9570 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009571 CmdArgs.push_back(
9572 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009573 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009574 CmdArgs.push_back(
9575 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009576 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009577 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009578 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009579 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009580 CmdArgs.push_back(
9581 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009582 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009583 CmdArgs.push_back(
9584 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009585 }
9586
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009587 Args.AddAllArgs(CmdArgs,
9588 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009589
Daniel Dunbar54423b22010-09-17 00:24:54 +00009590 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009591
Douglas Katzman78b37b02015-11-17 20:28:07 +00009592 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009593 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009594
9595 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009596 CmdArgs.push_back("-rpath");
9597 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009598 }
9599
Hans Wennborg70850d82013-07-18 20:29:38 +00009600 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009601 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009602 CmdArgs.push_back("-lm");
9603 }
9604
Daniel Dunbarcc912342009-05-02 18:28:39 +00009605 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009606 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009607
9608 if (!Args.hasArg(options::OPT_nolibc)) {
9609 CmdArgs.push_back("-lc");
9610 }
9611
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009612 if (Args.hasArg(options::OPT_static) ||
9613 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009614 CmdArgs.push_back("-lgcc");
9615 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009616 } else {
9617 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009618 CmdArgs.push_back("-lgcc_pic");
9619 if (!Args.hasArg(options::OPT_shared))
9620 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009621 } else {
John McCall65b8da02013-04-11 22:55:55 +00009622 CmdArgs.push_back("-lgcc");
9623 CmdArgs.push_back("--as-needed");
9624 CmdArgs.push_back("-lgcc_pic");
9625 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009626 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009627 }
9628 }
9629
Douglas Katzman78b37b02015-11-17 20:28:07 +00009630 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009631 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009632 CmdArgs.push_back(
9633 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009634 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009635 CmdArgs.push_back(
9636 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9637 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009638 }
9639
Xinliang David Li69306c02015-10-22 06:15:31 +00009640 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009641
Logan Chieneb9162f2014-06-26 14:23:45 +00009642 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009643 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009644}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009645
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009646// Try to find Exe from a Visual Studio distribution. This first tries to find
9647// an installed copy of Visual Studio and, failing that, looks in the PATH,
9648// making sure that whatever executable that's found is not a same-named exe
9649// from clang itself to prevent clang from falling back to itself.
9650static std::string FindVisualStudioExecutable(const ToolChain &TC,
9651 const char *Exe,
9652 const char *ClangProgramPath) {
9653 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9654 std::string visualStudioBinDir;
9655 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9656 visualStudioBinDir)) {
9657 SmallString<128> FilePath(visualStudioBinDir);
9658 llvm::sys::path::append(FilePath, Exe);
9659 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9660 return FilePath.str();
9661 }
9662
9663 return Exe;
9664}
9665
Douglas Katzman95354292015-06-23 20:42:09 +00009666void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9667 const InputInfo &Output,
9668 const InputInfoList &Inputs,
9669 const ArgList &Args,
9670 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009671 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009672 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009673
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009674 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9675 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009676 CmdArgs.push_back(
9677 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009678
Douglas Katzman78b37b02015-11-17 20:28:07 +00009679 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9680 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009681 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009682
Zachary Turner10d75b22014-10-22 20:40:43 +00009683 if (!llvm::sys::Process::GetEnv("LIB")) {
9684 // If the VC environment hasn't been configured (perhaps because the user
9685 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009686 // the environment variable is set however, assume the user knows what
9687 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009688 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009689 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009690 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9691 SmallString<128> LibDir(VisualStudioDir);
9692 llvm::sys::path::append(LibDir, "VC", "lib");
9693 switch (MSVC.getArch()) {
9694 case llvm::Triple::x86:
9695 // x86 just puts the libraries directly in lib
9696 break;
9697 case llvm::Triple::x86_64:
9698 llvm::sys::path::append(LibDir, "amd64");
9699 break;
9700 case llvm::Triple::arm:
9701 llvm::sys::path::append(LibDir, "arm");
9702 break;
9703 default:
9704 break;
9705 }
9706 CmdArgs.push_back(
9707 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009708
9709 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9710 std::string UniversalCRTLibPath;
9711 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9712 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9713 UniversalCRTLibPath.c_str()));
9714 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009715 }
9716
9717 std::string WindowsSdkLibPath;
9718 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9719 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9720 WindowsSdkLibPath.c_str()));
9721 }
9722
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009723 CmdArgs.push_back("-nologo");
9724
Reid Kleckner124955a2015-08-05 18:51:13 +00009725 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009726 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009727
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009728 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009729 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009730 if (DLL) {
9731 CmdArgs.push_back(Args.MakeArgString("-dll"));
9732
9733 SmallString<128> ImplibName(Output.getFilename());
9734 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009735 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009736 }
9737
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009738 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009739 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009740 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009741 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009742 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9743 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009744 // Make sure the dynamic runtime thunk is not optimized out at link time
9745 // to ensure proper SEH handling.
9746 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009747 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009748 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009749 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009750 for (const auto &Lib : {"asan", "asan_cxx"})
9751 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009752 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009753 }
9754
Hans Wennborg2e274592013-08-13 23:38:57 +00009755 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009756
Alexey Bataevc7e84352015-08-19 04:49:01 +00009757 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9758 options::OPT_fno_openmp, false)) {
9759 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9760 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9761 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9762 TC.getDriver().Dir + "/../lib"));
9763 switch (getOpenMPRuntime(getToolChain(), Args)) {
9764 case OMPRT_OMP:
9765 CmdArgs.push_back("-defaultlib:libomp.lib");
9766 break;
9767 case OMPRT_IOMP5:
9768 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9769 break;
9770 case OMPRT_GOMP:
9771 break;
9772 case OMPRT_Unknown:
9773 // Already diagnosed.
9774 break;
9775 }
9776 }
9777
Andrey Turetskiya4868572016-03-14 11:19:43 +00009778 // Add compiler-rt lib in case if it was explicitly
9779 // specified as an argument for --rtlib option.
9780 if (!Args.hasArg(options::OPT_nostdlib)) {
9781 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9782 }
9783
Reid Kleckner337188f2014-09-16 19:22:00 +00009784 // Add filenames, libraries, and other linker inputs.
9785 for (const auto &Input : Inputs) {
9786 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009787 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009788 continue;
9789 }
9790
9791 const Arg &A = Input.getInputArg();
9792
9793 // Render -l options differently for the MSVC linker.
9794 if (A.getOption().matches(options::OPT_l)) {
9795 StringRef Lib = A.getValue();
9796 const char *LinkLibArg;
9797 if (Lib.endswith(".lib"))
9798 LinkLibArg = Args.MakeArgString(Lib);
9799 else
9800 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9801 CmdArgs.push_back(LinkLibArg);
9802 continue;
9803 }
9804
9805 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9806 // or -L. Render it, even if MSVC doesn't understand it.
9807 A.renderAsInput(Args, CmdArgs);
9808 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009809
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009810 TC.addProfileRTLibs(Args, CmdArgs);
9811
Zachary Turner719f58c2014-12-01 23:06:47 +00009812 // We need to special case some linker paths. In the case of lld, we need to
9813 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9814 // linker, we need to use a special search algorithm.
9815 llvm::SmallString<128> linkPath;
9816 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9817 if (Linker.equals_lower("lld"))
9818 Linker = "lld-link";
9819
9820 if (Linker.equals_lower("link")) {
9821 // If we're using the MSVC linker, it's not sufficient to just use link
9822 // from the program PATH, because other environments like GnuWin32 install
9823 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009824 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009825 C.getDriver().getClangProgramPath());
9826 } else {
9827 linkPath = Linker;
9828 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009829 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009830 }
9831
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009832 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009833 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009834}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009835
Douglas Katzman95354292015-06-23 20:42:09 +00009836void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9837 const InputInfo &Output,
9838 const InputInfoList &Inputs,
9839 const ArgList &Args,
9840 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009841 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9842}
9843
Douglas Katzman95354292015-06-23 20:42:09 +00009844std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009845 Compilation &C, const JobAction &JA, const InputInfo &Output,
9846 const InputInfoList &Inputs, const ArgList &Args,
9847 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009848 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009849 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009850 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009851 CmdArgs.push_back("/W0"); // No warnings.
9852
9853 // The goal is to be able to invoke this tool correctly based on
9854 // any flag accepted by clang-cl.
9855
9856 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009857 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009858
9859 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009860 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9861 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9862 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009863 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9864 if (A->getOption().getID() == options::OPT_O0) {
9865 CmdArgs.push_back("/Od");
9866 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009867 CmdArgs.push_back("/Og");
9868
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009869 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009870 if (OptLevel == "s" || OptLevel == "z")
9871 CmdArgs.push_back("/Os");
9872 else
9873 CmdArgs.push_back("/Ot");
9874
9875 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009876 }
9877 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009878 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9879 options::OPT_fno_omit_frame_pointer))
9880 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9881 ? "/Oy"
9882 : "/Oy-");
9883 if (!Args.hasArg(options::OPT_fwritable_strings))
9884 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009885
Nico Weber3f8dafb2015-03-12 19:37:10 +00009886 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009887 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9888
David Majnemerf6072342014-07-01 22:24:56 +00009889 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9890 /*default=*/false))
9891 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009892 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9893 options::OPT_fno_function_sections))
9894 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9895 ? "/Gy"
9896 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009897 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9898 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009899 CmdArgs.push_back(
9900 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009901 if (Args.hasArg(options::OPT_fsyntax_only))
9902 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009903 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9904 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009905 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009906
Nico Weber3f8dafb2015-03-12 19:37:10 +00009907 std::vector<std::string> Includes =
9908 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009909 for (const auto &Include : Includes)
9910 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009911
Hans Wennborg87cfa712013-09-19 20:32:16 +00009912 // Flags that can simply be passed through.
9913 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9914 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009915 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9916 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009917 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009918 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009919
9920 // The order of these flags is relevant, so pick the last one.
9921 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9922 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9923 A->render(Args, CmdArgs);
9924
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009925 // Pass through all unknown arguments so that the fallback command can see
9926 // them too.
9927 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9928
Hans Wennborg87cfa712013-09-19 20:32:16 +00009929 // Input filename.
9930 assert(Inputs.size() == 1);
9931 const InputInfo &II = Inputs[0];
9932 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9933 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9934 if (II.isFilename())
9935 CmdArgs.push_back(II.getFilename());
9936 else
9937 II.getInputArg().renderAsInput(Args, CmdArgs);
9938
9939 // Output filename.
9940 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009941 const char *Fo =
9942 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009943 CmdArgs.push_back(Fo);
9944
Hans Wennborg188382e2013-09-20 18:16:35 +00009945 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009946 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9947 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009948 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009949 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009950}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009951
Yaron Keren1c0070c2015-07-02 04:45:27 +00009952/// MinGW Tools
9953void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9954 const InputInfo &Output,
9955 const InputInfoList &Inputs,
9956 const ArgList &Args,
9957 const char *LinkingOutput) const {
9958 claimNoWarnArgs(Args);
9959 ArgStringList CmdArgs;
9960
9961 if (getToolChain().getArch() == llvm::Triple::x86) {
9962 CmdArgs.push_back("--32");
9963 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9964 CmdArgs.push_back("--64");
9965 }
9966
9967 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9968
9969 CmdArgs.push_back("-o");
9970 CmdArgs.push_back(Output.getFilename());
9971
9972 for (const auto &II : Inputs)
9973 CmdArgs.push_back(II.getFilename());
9974
9975 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009976 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009977
9978 if (Args.hasArg(options::OPT_gsplit_dwarf))
9979 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9980 SplitDebugName(Args, Inputs[0]));
9981}
9982
9983void MinGW::Linker::AddLibGCC(const ArgList &Args,
9984 ArgStringList &CmdArgs) const {
9985 if (Args.hasArg(options::OPT_mthreads))
9986 CmdArgs.push_back("-lmingwthrd");
9987 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009988
Yaron Kerenaa281332015-08-09 00:24:07 +00009989 // Make use of compiler-rt if --rtlib option is used
9990 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9991 if (RLT == ToolChain::RLT_Libgcc) {
9992 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9993 Args.hasArg(options::OPT_static);
9994 bool Shared = Args.hasArg(options::OPT_shared);
9995 bool CXX = getToolChain().getDriver().CCCIsCXX();
9996
9997 if (Static || (!CXX && !Shared)) {
9998 CmdArgs.push_back("-lgcc");
9999 CmdArgs.push_back("-lgcc_eh");
10000 } else {
10001 CmdArgs.push_back("-lgcc_s");
10002 CmdArgs.push_back("-lgcc");
10003 }
10004 } else {
10005 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10006 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010007
Yaron Keren1c0070c2015-07-02 04:45:27 +000010008 CmdArgs.push_back("-lmoldname");
10009 CmdArgs.push_back("-lmingwex");
10010 CmdArgs.push_back("-lmsvcrt");
10011}
10012
10013void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10014 const InputInfo &Output,
10015 const InputInfoList &Inputs,
10016 const ArgList &Args,
10017 const char *LinkingOutput) const {
10018 const ToolChain &TC = getToolChain();
10019 const Driver &D = TC.getDriver();
10020 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10021
10022 ArgStringList CmdArgs;
10023
10024 // Silence warning for "clang -g foo.o -o foo"
10025 Args.ClaimAllArgs(options::OPT_g_Group);
10026 // and "clang -emit-llvm foo.o -o foo"
10027 Args.ClaimAllArgs(options::OPT_emit_llvm);
10028 // and for "clang -w foo.o -o foo". Other warning options are already
10029 // handled somewhere else.
10030 Args.ClaimAllArgs(options::OPT_w);
10031
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010032 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10033 if (LinkerName.equals_lower("lld")) {
10034 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010035 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010036 } else if (!LinkerName.equals_lower("ld")) {
10037 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010038 }
10039
Yaron Keren1c0070c2015-07-02 04:45:27 +000010040 if (!D.SysRoot.empty())
10041 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10042
10043 if (Args.hasArg(options::OPT_s))
10044 CmdArgs.push_back("-s");
10045
10046 CmdArgs.push_back("-m");
10047 if (TC.getArch() == llvm::Triple::x86)
10048 CmdArgs.push_back("i386pe");
10049 if (TC.getArch() == llvm::Triple::x86_64)
10050 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010051 if (TC.getArch() == llvm::Triple::arm)
10052 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010053
10054 if (Args.hasArg(options::OPT_mwindows)) {
10055 CmdArgs.push_back("--subsystem");
10056 CmdArgs.push_back("windows");
10057 } else if (Args.hasArg(options::OPT_mconsole)) {
10058 CmdArgs.push_back("--subsystem");
10059 CmdArgs.push_back("console");
10060 }
10061
10062 if (Args.hasArg(options::OPT_static))
10063 CmdArgs.push_back("-Bstatic");
10064 else {
10065 if (Args.hasArg(options::OPT_mdll))
10066 CmdArgs.push_back("--dll");
10067 else if (Args.hasArg(options::OPT_shared))
10068 CmdArgs.push_back("--shared");
10069 CmdArgs.push_back("-Bdynamic");
10070 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10071 CmdArgs.push_back("-e");
10072 if (TC.getArch() == llvm::Triple::x86)
10073 CmdArgs.push_back("_DllMainCRTStartup@12");
10074 else
10075 CmdArgs.push_back("DllMainCRTStartup");
10076 CmdArgs.push_back("--enable-auto-image-base");
10077 }
10078 }
10079
10080 CmdArgs.push_back("-o");
10081 CmdArgs.push_back(Output.getFilename());
10082
10083 Args.AddAllArgs(CmdArgs, options::OPT_e);
10084 // FIXME: add -N, -n flags
10085 Args.AddLastArg(CmdArgs, options::OPT_r);
10086 Args.AddLastArg(CmdArgs, options::OPT_s);
10087 Args.AddLastArg(CmdArgs, options::OPT_t);
10088 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10089 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10090
Douglas Katzman78b37b02015-11-17 20:28:07 +000010091 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010092 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10093 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10094 } else {
10095 if (Args.hasArg(options::OPT_municode))
10096 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10097 else
10098 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10099 }
10100 if (Args.hasArg(options::OPT_pg))
10101 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10102 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10103 }
10104
10105 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010106 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010107 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10108
10109 // TODO: Add ASan stuff here
10110
10111 // TODO: Add profile stuff here
10112
Douglas Katzman78b37b02015-11-17 20:28:07 +000010113 if (D.CCCIsCXX() &&
10114 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010115 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10116 !Args.hasArg(options::OPT_static);
10117 if (OnlyLibstdcxxStatic)
10118 CmdArgs.push_back("-Bstatic");
10119 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10120 if (OnlyLibstdcxxStatic)
10121 CmdArgs.push_back("-Bdynamic");
10122 }
10123
10124 if (!Args.hasArg(options::OPT_nostdlib)) {
10125 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10126 if (Args.hasArg(options::OPT_static))
10127 CmdArgs.push_back("--start-group");
10128
10129 if (Args.hasArg(options::OPT_fstack_protector) ||
10130 Args.hasArg(options::OPT_fstack_protector_strong) ||
10131 Args.hasArg(options::OPT_fstack_protector_all)) {
10132 CmdArgs.push_back("-lssp_nonshared");
10133 CmdArgs.push_back("-lssp");
10134 }
10135 if (Args.hasArg(options::OPT_fopenmp))
10136 CmdArgs.push_back("-lgomp");
10137
10138 AddLibGCC(Args, CmdArgs);
10139
10140 if (Args.hasArg(options::OPT_pg))
10141 CmdArgs.push_back("-lgmon");
10142
Yaron Kerenadce68e2015-07-06 18:52:19 +000010143 if (Args.hasArg(options::OPT_pthread))
10144 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010145
10146 // add system libraries
10147 if (Args.hasArg(options::OPT_mwindows)) {
10148 CmdArgs.push_back("-lgdi32");
10149 CmdArgs.push_back("-lcomdlg32");
10150 }
10151 CmdArgs.push_back("-ladvapi32");
10152 CmdArgs.push_back("-lshell32");
10153 CmdArgs.push_back("-luser32");
10154 CmdArgs.push_back("-lkernel32");
10155
10156 if (Args.hasArg(options::OPT_static))
10157 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010158 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010159 AddLibGCC(Args, CmdArgs);
10160 }
10161
10162 if (!Args.hasArg(options::OPT_nostartfiles)) {
10163 // Add crtfastmath.o if available and fast math is enabled.
10164 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10165
10166 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10167 }
10168 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010169 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010170 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010171}
10172
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010173/// XCore Tools
10174// We pass assemble and link construction to the xcc tool.
10175
Douglas Katzman95354292015-06-23 20:42:09 +000010176void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10177 const InputInfo &Output,
10178 const InputInfoList &Inputs,
10179 const ArgList &Args,
10180 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010181 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010182 ArgStringList CmdArgs;
10183
10184 CmdArgs.push_back("-o");
10185 CmdArgs.push_back(Output.getFilename());
10186
10187 CmdArgs.push_back("-c");
10188
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010189 if (Args.hasArg(options::OPT_v))
10190 CmdArgs.push_back("-v");
10191
Robert Lytton894d25c2014-05-02 09:33:25 +000010192 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10193 if (!A->getOption().matches(options::OPT_g0))
10194 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010195
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010196 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10197 false))
10198 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010199
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010200 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010202 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010203 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010204
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010205 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010206 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010207}
10208
Douglas Katzman95354292015-06-23 20:42:09 +000010209void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10210 const InputInfo &Output,
10211 const InputInfoList &Inputs,
10212 const ArgList &Args,
10213 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010214 ArgStringList CmdArgs;
10215
10216 if (Output.isFilename()) {
10217 CmdArgs.push_back("-o");
10218 CmdArgs.push_back(Output.getFilename());
10219 } else {
10220 assert(Output.isNothing() && "Invalid output.");
10221 }
10222
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010223 if (Args.hasArg(options::OPT_v))
10224 CmdArgs.push_back("-v");
10225
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010226 // Pass -fexceptions through to the linker if it was present.
10227 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10228 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010229 CmdArgs.push_back("-fexceptions");
10230
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010231 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10232
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010233 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010234 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010235}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010236
Douglas Katzman95354292015-06-23 20:42:09 +000010237void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10238 const InputInfo &Output,
10239 const InputInfoList &Inputs,
10240 const ArgList &Args,
10241 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010242 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010243 const auto &TC =
10244 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10245 ArgStringList CmdArgs;
10246 const char *Exec;
10247
10248 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010249 default:
10250 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010251 case llvm::Triple::arm:
10252 case llvm::Triple::thumb:
10253 break;
10254 case llvm::Triple::x86:
10255 CmdArgs.push_back("--32");
10256 break;
10257 case llvm::Triple::x86_64:
10258 CmdArgs.push_back("--64");
10259 break;
10260 }
10261
10262 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10263
10264 CmdArgs.push_back("-o");
10265 CmdArgs.push_back(Output.getFilename());
10266
10267 for (const auto &Input : Inputs)
10268 CmdArgs.push_back(Input.getFilename());
10269
10270 const std::string Assembler = TC.GetProgramPath("as");
10271 Exec = Args.MakeArgString(Assembler);
10272
Justin Bognerd3371d82015-07-17 03:35:54 +000010273 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010274}
10275
Douglas Katzman95354292015-06-23 20:42:09 +000010276void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10277 const InputInfo &Output,
10278 const InputInfoList &Inputs,
10279 const ArgList &Args,
10280 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010281 const auto &TC =
10282 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10283 const llvm::Triple &T = TC.getTriple();
10284 const Driver &D = TC.getDriver();
10285 SmallString<128> EntryPoint;
10286 ArgStringList CmdArgs;
10287 const char *Exec;
10288
10289 // Silence warning for "clang -g foo.o -o foo"
10290 Args.ClaimAllArgs(options::OPT_g_Group);
10291 // and "clang -emit-llvm foo.o -o foo"
10292 Args.ClaimAllArgs(options::OPT_emit_llvm);
10293 // and for "clang -w foo.o -o foo"
10294 Args.ClaimAllArgs(options::OPT_w);
10295 // Other warning options are already handled somewhere else.
10296
10297 if (!D.SysRoot.empty())
10298 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10299
10300 if (Args.hasArg(options::OPT_pie))
10301 CmdArgs.push_back("-pie");
10302 if (Args.hasArg(options::OPT_rdynamic))
10303 CmdArgs.push_back("-export-dynamic");
10304 if (Args.hasArg(options::OPT_s))
10305 CmdArgs.push_back("--strip-all");
10306
10307 CmdArgs.push_back("-m");
10308 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010309 default:
10310 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010311 case llvm::Triple::arm:
10312 case llvm::Triple::thumb:
10313 // FIXME: this is incorrect for WinCE
10314 CmdArgs.push_back("thumb2pe");
10315 break;
10316 case llvm::Triple::x86:
10317 CmdArgs.push_back("i386pe");
10318 EntryPoint.append("_");
10319 break;
10320 case llvm::Triple::x86_64:
10321 CmdArgs.push_back("i386pep");
10322 break;
10323 }
10324
10325 if (Args.hasArg(options::OPT_shared)) {
10326 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010327 default:
10328 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010329 case llvm::Triple::arm:
10330 case llvm::Triple::thumb:
10331 case llvm::Triple::x86_64:
10332 EntryPoint.append("_DllMainCRTStartup");
10333 break;
10334 case llvm::Triple::x86:
10335 EntryPoint.append("_DllMainCRTStartup@12");
10336 break;
10337 }
10338
10339 CmdArgs.push_back("-shared");
10340 CmdArgs.push_back("-Bdynamic");
10341
10342 CmdArgs.push_back("--enable-auto-image-base");
10343
10344 CmdArgs.push_back("--entry");
10345 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10346 } else {
10347 EntryPoint.append("mainCRTStartup");
10348
10349 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10350 : "-Bdynamic");
10351
Douglas Katzman78b37b02015-11-17 20:28:07 +000010352 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010353 CmdArgs.push_back("--entry");
10354 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10355 }
10356
10357 // FIXME: handle subsystem
10358 }
10359
10360 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010361 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010362
10363 CmdArgs.push_back("-o");
10364 CmdArgs.push_back(Output.getFilename());
10365
10366 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10367 SmallString<261> ImpLib(Output.getFilename());
10368 llvm::sys::path::replace_extension(ImpLib, ".lib");
10369
10370 CmdArgs.push_back("--out-implib");
10371 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10372 }
10373
Douglas Katzman78b37b02015-11-17 20:28:07 +000010374 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010375 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10376 const char *CRTBegin;
10377
10378 CRTBegin =
10379 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10380 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10381 }
10382
10383 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010384 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010385 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10386
10387 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10388 !Args.hasArg(options::OPT_nodefaultlibs)) {
10389 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10390 !Args.hasArg(options::OPT_static);
10391 if (StaticCXX)
10392 CmdArgs.push_back("-Bstatic");
10393 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10394 if (StaticCXX)
10395 CmdArgs.push_back("-Bdynamic");
10396 }
10397
10398 if (!Args.hasArg(options::OPT_nostdlib)) {
10399 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10400 // TODO handle /MT[d] /MD[d]
10401 CmdArgs.push_back("-lmsvcrt");
10402 AddRunTimeLibs(TC, D, CmdArgs, Args);
10403 }
10404 }
10405
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010406 if (TC.getSanitizerArgs().needsAsanRt()) {
10407 // TODO handle /MT[d] /MD[d]
10408 if (Args.hasArg(options::OPT_shared)) {
10409 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10410 } else {
10411 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10412 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10413 // Make sure the dynamic runtime thunk is not optimized out at link time
10414 // to ensure proper SEH handling.
10415 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10416 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10417 ? "___asan_seh_interceptor"
10418 : "__asan_seh_interceptor"));
10419 }
10420 }
10421
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010422 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010423
Justin Bognerd3371d82015-07-17 03:35:54 +000010424 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010425}
Douglas Katzman84a75642015-06-19 14:55:19 +000010426
Douglas Katzman95354292015-06-23 20:42:09 +000010427void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10428 const InputInfo &Output,
10429 const InputInfoList &Inputs,
10430 const ArgList &Args,
10431 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010432 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010433 assert(Inputs.size() == 1);
10434 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010435 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10436 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010437
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010438 if (JA.getKind() == Action::PreprocessJobClass) {
10439 Args.ClaimAllArgs();
10440 CmdArgs.push_back("-E");
10441 } else {
10442 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10443 CmdArgs.push_back("-S");
10444 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10445 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010446 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010447
Douglas Katzmanf6071112015-08-03 14:34:22 +000010448 // Append all -I, -iquote, -isystem paths, defines/undefines,
10449 // 'f' flags, optimize flags, and warning options.
10450 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010451 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010452 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010453 options::OPT_f_Group, options::OPT_f_clang_Group,
10454 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010455 options::OPT_O_Group, options::OPT_W_Group,
10456 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010457
10458 // If we're producing a dependency file, and assembly is the final action,
10459 // then the name of the target in the dependency file should be the '.o'
10460 // file, not the '.s' file produced by this step. For example, instead of
10461 // /tmp/mumble.s: mumble.c .../someheader.h
10462 // the filename on the lefthand side should be "mumble.o"
10463 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10464 C.getActions().size() == 1 &&
10465 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10466 Arg *A = Args.getLastArg(options::OPT_o);
10467 if (A) {
10468 CmdArgs.push_back("-MT");
10469 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10470 }
10471 }
10472
Douglas Katzman84a75642015-06-19 14:55:19 +000010473 CmdArgs.push_back(II.getFilename());
10474 CmdArgs.push_back("-o");
10475 CmdArgs.push_back(Output.getFilename());
10476
10477 std::string Exec =
10478 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010479 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10480 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010481}
10482
Douglas Katzman95354292015-06-23 20:42:09 +000010483void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10484 const InputInfo &Output,
10485 const InputInfoList &Inputs,
10486 const ArgList &Args,
10487 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010488 ArgStringList CmdArgs;
10489
10490 assert(Inputs.size() == 1);
10491 const InputInfo &II = Inputs[0];
10492 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10493 assert(Output.getType() == types::TY_Object);
10494
10495 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010496 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10497 if (CPUArg)
10498 CmdArgs.push_back(
10499 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010500 CmdArgs.push_back("-noSPrefixing");
10501 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010502 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10503 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10504 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010505 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010506 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010507 }
10508 CmdArgs.push_back("-elf"); // Output format.
10509 CmdArgs.push_back(II.getFilename());
10510 CmdArgs.push_back(
10511 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10512
10513 std::string Exec =
10514 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010515 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10516 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010517}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010518
10519void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10520 const InputInfo &Output,
10521 const InputInfoList &Inputs,
10522 const ArgList &Args,
10523 const char *LinkingOutput) const {
10524 const auto &TC =
10525 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10526 const llvm::Triple &T = TC.getTriple();
10527 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010528 bool UseStartfiles =
10529 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010530 bool UseDefaultLibs =
10531 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010532
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010533 if (T.getArch() == llvm::Triple::sparc)
10534 CmdArgs.push_back("-EB");
10535 else // SHAVE assumes little-endian, and sparcel is expressly so.
10536 CmdArgs.push_back("-EL");
10537
10538 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10539 // but we never pass through a --sysroot option and various other bits.
10540 // For example, there are no sanitizers (yet) nor gold linker.
10541
10542 // Eat some arguments that may be present but have no effect.
10543 Args.ClaimAllArgs(options::OPT_g_Group);
10544 Args.ClaimAllArgs(options::OPT_w);
10545 Args.ClaimAllArgs(options::OPT_static_libgcc);
10546
10547 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10548 CmdArgs.push_back("-s");
10549
10550 CmdArgs.push_back("-o");
10551 CmdArgs.push_back(Output.getFilename());
10552
10553 if (UseStartfiles) {
10554 // If you want startfiles, it means you want the builtin crti and crtbegin,
10555 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010556 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10557 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010558 }
10559
10560 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10561 options::OPT_e, options::OPT_s, options::OPT_t,
10562 options::OPT_Z_Flag, options::OPT_r});
10563
Douglas Katzman674a3122015-11-18 16:24:46 +000010564 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010565
10566 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10567
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010568 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010569 if (C.getDriver().CCCIsCXX())
10570 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010571 if (T.getOS() == llvm::Triple::RTEMS) {
10572 CmdArgs.push_back("--start-group");
10573 CmdArgs.push_back("-lc");
10574 // You must provide your own "-L" option to enable finding these.
10575 CmdArgs.push_back("-lrtemscpu");
10576 CmdArgs.push_back("-lrtemsbsp");
10577 CmdArgs.push_back("--end-group");
10578 } else {
10579 CmdArgs.push_back("-lc");
10580 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010581 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010582 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010583 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010584 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10585 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010586 }
10587
10588 std::string Exec =
10589 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10590 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10591 CmdArgs, Inputs));
10592}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010593
10594void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10595 const InputInfo &Output,
10596 const InputInfoList &Inputs,
10597 const ArgList &Args,
10598 const char *LinkingOutput) const {
10599 claimNoWarnArgs(Args);
10600 ArgStringList CmdArgs;
10601
10602 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10603
10604 CmdArgs.push_back("-o");
10605 CmdArgs.push_back(Output.getFilename());
10606
10607 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10608 const InputInfo &Input = Inputs[0];
10609 assert(Input.isFilename() && "Invalid input.");
10610 CmdArgs.push_back(Input.getFilename());
10611
10612 const char *Exec =
10613 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10614 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10615}
10616
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010617static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10618 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10619 if (SanArgs.needsUbsanRt()) {
10620 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10621 }
10622 if (SanArgs.needsAsanRt()) {
10623 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10624 }
10625}
10626
10627static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10628 const JobAction &JA, const InputInfo &Output,
10629 const InputInfoList &Inputs,
10630 const ArgList &Args,
10631 const char *LinkingOutput) {
10632 const toolchains::FreeBSD &ToolChain =
10633 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10634 const Driver &D = ToolChain.getDriver();
10635 ArgStringList CmdArgs;
10636
10637 // Silence warning for "clang -g foo.o -o foo"
10638 Args.ClaimAllArgs(options::OPT_g_Group);
10639 // and "clang -emit-llvm foo.o -o foo"
10640 Args.ClaimAllArgs(options::OPT_emit_llvm);
10641 // and for "clang -w foo.o -o foo". Other warning options are already
10642 // handled somewhere else.
10643 Args.ClaimAllArgs(options::OPT_w);
10644
10645 if (!D.SysRoot.empty())
10646 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10647
10648 if (Args.hasArg(options::OPT_pie))
10649 CmdArgs.push_back("-pie");
10650
10651 if (Args.hasArg(options::OPT_rdynamic))
10652 CmdArgs.push_back("-export-dynamic");
10653 if (Args.hasArg(options::OPT_shared))
10654 CmdArgs.push_back("--oformat=so");
10655
10656 if (Output.isFilename()) {
10657 CmdArgs.push_back("-o");
10658 CmdArgs.push_back(Output.getFilename());
10659 } else {
10660 assert(Output.isNothing() && "Invalid output.");
10661 }
10662
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010663 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10664
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010665 Args.AddAllArgs(CmdArgs, options::OPT_L);
10666 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10667 Args.AddAllArgs(CmdArgs, options::OPT_e);
10668 Args.AddAllArgs(CmdArgs, options::OPT_s);
10669 Args.AddAllArgs(CmdArgs, options::OPT_t);
10670 Args.AddAllArgs(CmdArgs, options::OPT_r);
10671
10672 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10673 CmdArgs.push_back("--no-demangle");
10674
10675 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10676
10677 if (Args.hasArg(options::OPT_pthread)) {
10678 CmdArgs.push_back("-lpthread");
10679 }
10680
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010681 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10682
10683 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10684}
10685
10686static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10687 const JobAction &JA, const InputInfo &Output,
10688 const InputInfoList &Inputs,
10689 const ArgList &Args,
10690 const char *LinkingOutput) {
10691 const toolchains::FreeBSD &ToolChain =
10692 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10693 const Driver &D = ToolChain.getDriver();
10694 ArgStringList CmdArgs;
10695
10696 // Silence warning for "clang -g foo.o -o foo"
10697 Args.ClaimAllArgs(options::OPT_g_Group);
10698 // and "clang -emit-llvm foo.o -o foo"
10699 Args.ClaimAllArgs(options::OPT_emit_llvm);
10700 // and for "clang -w foo.o -o foo". Other warning options are already
10701 // handled somewhere else.
10702 Args.ClaimAllArgs(options::OPT_w);
10703
10704 if (!D.SysRoot.empty())
10705 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10706
10707 if (Args.hasArg(options::OPT_pie))
10708 CmdArgs.push_back("-pie");
10709
10710 if (Args.hasArg(options::OPT_static)) {
10711 CmdArgs.push_back("-Bstatic");
10712 } else {
10713 if (Args.hasArg(options::OPT_rdynamic))
10714 CmdArgs.push_back("-export-dynamic");
10715 CmdArgs.push_back("--eh-frame-hdr");
10716 if (Args.hasArg(options::OPT_shared)) {
10717 CmdArgs.push_back("-Bshareable");
10718 } else {
10719 CmdArgs.push_back("-dynamic-linker");
10720 CmdArgs.push_back("/libexec/ld-elf.so.1");
10721 }
10722 CmdArgs.push_back("--enable-new-dtags");
10723 }
10724
10725 if (Output.isFilename()) {
10726 CmdArgs.push_back("-o");
10727 CmdArgs.push_back(Output.getFilename());
10728 } else {
10729 assert(Output.isNothing() && "Invalid output.");
10730 }
10731
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010732 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10733
Douglas Katzman78b37b02015-11-17 20:28:07 +000010734 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010735 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010736 if (!Args.hasArg(options::OPT_shared)) {
10737 if (Args.hasArg(options::OPT_pg))
10738 crt1 = "gcrt1.o";
10739 else if (Args.hasArg(options::OPT_pie))
10740 crt1 = "Scrt1.o";
10741 else
10742 crt1 = "crt1.o";
10743 }
10744 if (crt1)
10745 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10746
10747 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10748
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010749 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010750 if (Args.hasArg(options::OPT_static))
10751 crtbegin = "crtbeginT.o";
10752 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10753 crtbegin = "crtbeginS.o";
10754 else
10755 crtbegin = "crtbegin.o";
10756
10757 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10758 }
10759
10760 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010761 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010762 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10763 Args.AddAllArgs(CmdArgs, options::OPT_e);
10764 Args.AddAllArgs(CmdArgs, options::OPT_s);
10765 Args.AddAllArgs(CmdArgs, options::OPT_t);
10766 Args.AddAllArgs(CmdArgs, options::OPT_r);
10767
10768 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10769 CmdArgs.push_back("--no-demangle");
10770
10771 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10772
Douglas Katzman78b37b02015-11-17 20:28:07 +000010773 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010774 // For PS4, we always want to pass libm, libstdc++ and libkernel
10775 // libraries for both C and C++ compilations.
10776 CmdArgs.push_back("-lkernel");
10777 if (D.CCCIsCXX()) {
10778 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10779 if (Args.hasArg(options::OPT_pg))
10780 CmdArgs.push_back("-lm_p");
10781 else
10782 CmdArgs.push_back("-lm");
10783 }
10784 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10785 // the default system libraries. Just mimic this for now.
10786 if (Args.hasArg(options::OPT_pg))
10787 CmdArgs.push_back("-lgcc_p");
10788 else
10789 CmdArgs.push_back("-lcompiler_rt");
10790 if (Args.hasArg(options::OPT_static)) {
10791 CmdArgs.push_back("-lstdc++");
10792 } else if (Args.hasArg(options::OPT_pg)) {
10793 CmdArgs.push_back("-lgcc_eh_p");
10794 } else {
10795 CmdArgs.push_back("--as-needed");
10796 CmdArgs.push_back("-lstdc++");
10797 CmdArgs.push_back("--no-as-needed");
10798 }
10799
10800 if (Args.hasArg(options::OPT_pthread)) {
10801 if (Args.hasArg(options::OPT_pg))
10802 CmdArgs.push_back("-lpthread_p");
10803 else
10804 CmdArgs.push_back("-lpthread");
10805 }
10806
10807 if (Args.hasArg(options::OPT_pg)) {
10808 if (Args.hasArg(options::OPT_shared))
10809 CmdArgs.push_back("-lc");
10810 else {
10811 if (Args.hasArg(options::OPT_static)) {
10812 CmdArgs.push_back("--start-group");
10813 CmdArgs.push_back("-lc_p");
10814 CmdArgs.push_back("-lpthread_p");
10815 CmdArgs.push_back("--end-group");
10816 } else {
10817 CmdArgs.push_back("-lc_p");
10818 }
10819 }
10820 CmdArgs.push_back("-lgcc_p");
10821 } else {
10822 if (Args.hasArg(options::OPT_static)) {
10823 CmdArgs.push_back("--start-group");
10824 CmdArgs.push_back("-lc");
10825 CmdArgs.push_back("-lpthread");
10826 CmdArgs.push_back("--end-group");
10827 } else {
10828 CmdArgs.push_back("-lc");
10829 }
10830 CmdArgs.push_back("-lcompiler_rt");
10831 }
10832
10833 if (Args.hasArg(options::OPT_static)) {
10834 CmdArgs.push_back("-lstdc++");
10835 } else if (Args.hasArg(options::OPT_pg)) {
10836 CmdArgs.push_back("-lgcc_eh_p");
10837 } else {
10838 CmdArgs.push_back("--as-needed");
10839 CmdArgs.push_back("-lstdc++");
10840 CmdArgs.push_back("--no-as-needed");
10841 }
10842 }
10843
Douglas Katzman78b37b02015-11-17 20:28:07 +000010844 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010845 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10846 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10847 else
10848 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10849 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10850 }
10851
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010852 const char *Exec =
10853#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010854 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010855#else
10856 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10857#endif
10858
10859 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10860}
10861
10862void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10863 const InputInfo &Output,
10864 const InputInfoList &Inputs,
10865 const ArgList &Args,
10866 const char *LinkingOutput) const {
10867 const toolchains::FreeBSD &ToolChain =
10868 static_cast<const toolchains::FreeBSD &>(getToolChain());
10869 const Driver &D = ToolChain.getDriver();
10870 bool PS4Linker;
10871 StringRef LinkerOptName;
10872 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10873 LinkerOptName = A->getValue();
10874 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10875 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10876 }
10877
10878 if (LinkerOptName == "gold")
10879 PS4Linker = false;
10880 else if (LinkerOptName == "ps4")
10881 PS4Linker = true;
10882 else
10883 PS4Linker = !Args.hasArg(options::OPT_shared);
10884
10885 if (PS4Linker)
10886 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10887 else
10888 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10889}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010890
10891void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10892 const InputInfo &Output,
10893 const InputInfoList &Inputs,
10894 const ArgList &Args,
10895 const char *LinkingOutput) const {
10896 const auto &TC =
10897 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010898 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010899
10900 std::vector<std::string> gpu_archs =
10901 Args.getAllArgValues(options::OPT_march_EQ);
10902 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10903 const std::string& gpu_arch = gpu_archs[0];
10904
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010905 ArgStringList CmdArgs;
10906 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010907 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10908 // ptxas does not accept -g option if optimization is enabled, so
10909 // we ignore the compiler's -O* options if we want debug info.
10910 CmdArgs.push_back("-g");
10911 CmdArgs.push_back("--dont-merge-basicblocks");
10912 CmdArgs.push_back("--return-at-end");
10913 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10914 // Map the -O we received to -O{0,1,2,3}.
10915 //
10916 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10917 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010918
Justin Lebar2836dcd2016-01-19 19:52:21 +000010919 // -O3 seems like the least-bad option when -Osomething is specified to
10920 // clang but it isn't handled below.
10921 StringRef OOpt = "3";
10922 if (A->getOption().matches(options::OPT_O4) ||
10923 A->getOption().matches(options::OPT_Ofast))
10924 OOpt = "3";
10925 else if (A->getOption().matches(options::OPT_O0))
10926 OOpt = "0";
10927 else if (A->getOption().matches(options::OPT_O)) {
10928 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10929 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10930 .Case("1", "1")
10931 .Case("2", "2")
10932 .Case("3", "3")
10933 .Case("s", "2")
10934 .Case("z", "2")
10935 .Default("2");
10936 }
10937 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10938 } else {
10939 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10940 // to no optimizations, but ptxas's default is -O3.
10941 CmdArgs.push_back("-O0");
10942 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010943
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010944 CmdArgs.push_back("--gpu-name");
10945 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10946 CmdArgs.push_back("--output-file");
10947 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10948 for (const auto& II : Inputs)
10949 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10950
10951 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10952 CmdArgs.push_back(Args.MakeArgString(A));
10953
10954 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10955 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10956}
10957
10958// All inputs to this linker must be from CudaDeviceActions, as we need to look
10959// at the Inputs' Actions in order to figure out which GPU architecture they
10960// correspond to.
10961void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10962 const InputInfo &Output,
10963 const InputInfoList &Inputs,
10964 const ArgList &Args,
10965 const char *LinkingOutput) const {
10966 const auto &TC =
10967 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010968 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010969
10970 ArgStringList CmdArgs;
10971 CmdArgs.push_back("--cuda");
10972 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10973 CmdArgs.push_back(Args.MakeArgString("--create"));
10974 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10975
10976 for (const auto& II : Inputs) {
10977 auto* A = cast<const CudaDeviceAction>(II.getAction());
10978 // We need to pass an Arch of the form "sm_XX" for cubin files and
10979 // "compute_XX" for ptx.
10980 const char *Arch = (II.getType() == types::TY_PP_Asm)
10981 ? A->getComputeArchName()
10982 : A->getGpuArchName();
10983 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10984 Arch + ",file=" + II.getFilename()));
10985 }
10986
10987 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10988 CmdArgs.push_back(Args.MakeArgString(A));
10989
10990 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10991 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10992}