blob: 98c0d1deebcdc464f4f935eb699479f793b25099 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001186 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001187 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001188
Brad Smithba26f582015-01-06 02:53:17 +00001189 // MIPS3 is the default for mips64*-unknown-openbsd.
1190 if (Triple.getOS() == llvm::Triple::OpenBSD)
1191 DefMips64CPU = "mips3";
1192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001194 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001195
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001197 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 // Convert a GNU style Mips ABI name to the name
1199 // accepted by LLVM Mips backend.
1200 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001201 .Case("32", "o32")
1202 .Case("64", "n64")
1203 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001204 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001205
1206 // Setup default CPU and ABI names.
1207 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001208 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001209 default:
1210 llvm_unreachable("Unexpected triple arch name");
1211 case llvm::Triple::mips:
1212 case llvm::Triple::mipsel:
1213 CPUName = DefMips32CPU;
1214 break;
1215 case llvm::Triple::mips64:
1216 case llvm::Triple::mips64el:
1217 CPUName = DefMips64CPU;
1218 break;
1219 }
1220 }
1221
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001222 if (ABIName.empty()) {
1223 // Deduce ABI name from the target triple.
1224 if (Triple.getArch() == llvm::Triple::mips ||
1225 Triple.getArch() == llvm::Triple::mipsel)
1226 ABIName = "o32";
1227 else
1228 ABIName = "n64";
1229 }
1230
1231 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 // Deduce CPU name from ABI name.
1233 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001234 .Cases("o32", "eabi", DefMips32CPU)
1235 .Cases("n32", "n64", DefMips64CPU)
1236 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001237 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001238
1239 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001240}
1241
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001242std::string mips::getMipsABILibSuffix(const ArgList &Args,
1243 const llvm::Triple &Triple) {
1244 StringRef CPUName, ABIName;
1245 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1246 return llvm::StringSwitch<std::string>(ABIName)
1247 .Case("o32", "")
1248 .Case("n32", "32")
1249 .Case("n64", "64");
1250}
1251
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252// Convert ABI name to the GNU tools acceptable variant.
1253static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1254 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001255 .Case("o32", "32")
1256 .Case("n64", "64")
1257 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001258}
1259
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001260// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1261// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1263 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001264 if (Arg *A =
1265 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1266 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001267 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001268 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1273 .Case("soft", mips::FloatABI::Soft)
1274 .Case("hard", mips::FloatABI::Hard)
1275 .Default(mips::FloatABI::Invalid);
1276 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001277 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 }
1280 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
1283 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001284 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001285 // Assume "hard", because it's a default value used by gcc.
1286 // When we start to recognize specific target MIPS processors,
1287 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001288 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001289 }
1290
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001291 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1292 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293}
1294
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 std::vector<const char *> &Features,
1297 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 StringRef FeatureName) {
1299 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001300 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001302 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001304 }
1305}
1306
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1308 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001309 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001310 StringRef CPUName;
1311 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001313 ABIName = getGnuCompatibleMipsABIName(ABIName);
1314
Daniel Sandersfeb61302014-08-08 15:47:17 +00001315 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1316 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001317
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001318 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1319 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001320 // FIXME: Note, this is a hack. We need to pass the selected float
1321 // mode to the MipsTargetInfoBase to define appropriate macros there.
1322 // Now it is the only method.
1323 Features.push_back("+soft-float");
1324 }
1325
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001327 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001328 if (Val == "2008") {
1329 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1330 Features.push_back("+nan2008");
1331 else {
1332 Features.push_back("-nan2008");
1333 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1334 }
1335 } else if (Val == "legacy") {
1336 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1337 Features.push_back("-nan2008");
1338 else {
1339 Features.push_back("+nan2008");
1340 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1341 }
1342 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001343 D.Diag(diag::err_drv_unsupported_option_argument)
1344 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001345 }
1346
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001347 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1348 options::OPT_mdouble_float, "single-float");
1349 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1350 "mips16");
1351 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1352 options::OPT_mno_micromips, "micromips");
1353 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1354 "dsp");
1355 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1356 "dspr2");
1357 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1358 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001359
1360 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1361 // pass -mfpxx
1362 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1363 options::OPT_mfp64)) {
1364 if (A->getOption().matches(options::OPT_mfp32))
1365 Features.push_back(Args.MakeArgString("-fp64"));
1366 else if (A->getOption().matches(options::OPT_mfpxx)) {
1367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 } else
1370 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001371 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001372 Features.push_back(Args.MakeArgString("+fpxx"));
1373 Features.push_back(Args.MakeArgString("+nooddspreg"));
1374 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001375
Daniel Sanders28e5d392014-07-10 10:39:51 +00001376 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1377 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001378}
1379
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001380void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001381 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382 const Driver &D = getToolChain().getDriver();
1383 StringRef CPUName;
1384 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001385 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001386 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001387
1388 CmdArgs.push_back("-target-abi");
1389 CmdArgs.push_back(ABIName.data());
1390
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1392 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001393 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001397 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001398 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001399 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001400 CmdArgs.push_back("-mfloat-abi");
1401 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001402 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001403
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001404 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1405 if (A->getOption().matches(options::OPT_mxgot)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mxgot");
1408 }
1409 }
1410
Simon Atanasyanc580b322013-05-11 06:33:44 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1412 options::OPT_mno_ldc1_sdc1)) {
1413 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-ldc1-sdc1");
1416 }
1417 }
1418
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001419 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1420 options::OPT_mno_check_zero_division)) {
1421 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1422 CmdArgs.push_back("-mllvm");
1423 CmdArgs.push_back("-mno-check-zero-division");
1424 }
1425 }
1426
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001427 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001428 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001429 CmdArgs.push_back("-mllvm");
1430 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1431 A->claim();
1432 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001433}
1434
Hal Finkel8eb59282012-06-11 22:35:19 +00001435/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1436static std::string getPPCTargetCPU(const ArgList &Args) {
1437 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001438 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001439
1440 if (CPUName == "native") {
1441 std::string CPU = llvm::sys::getHostCPUName();
1442 if (!CPU.empty() && CPU != "generic")
1443 return CPU;
1444 else
1445 return "";
1446 }
1447
1448 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001449 .Case("common", "generic")
1450 .Case("440", "440")
1451 .Case("440fp", "440")
1452 .Case("450", "450")
1453 .Case("601", "601")
1454 .Case("602", "602")
1455 .Case("603", "603")
1456 .Case("603e", "603e")
1457 .Case("603ev", "603ev")
1458 .Case("604", "604")
1459 .Case("604e", "604e")
1460 .Case("620", "620")
1461 .Case("630", "pwr3")
1462 .Case("G3", "g3")
1463 .Case("7400", "7400")
1464 .Case("G4", "g4")
1465 .Case("7450", "7450")
1466 .Case("G4+", "g4+")
1467 .Case("750", "750")
1468 .Case("970", "970")
1469 .Case("G5", "g5")
1470 .Case("a2", "a2")
1471 .Case("a2q", "a2q")
1472 .Case("e500mc", "e500mc")
1473 .Case("e5500", "e5500")
1474 .Case("power3", "pwr3")
1475 .Case("power4", "pwr4")
1476 .Case("power5", "pwr5")
1477 .Case("power5x", "pwr5x")
1478 .Case("power6", "pwr6")
1479 .Case("power6x", "pwr6x")
1480 .Case("power7", "pwr7")
1481 .Case("power8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001482 .Case("power9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 .Case("pwr3", "pwr3")
1484 .Case("pwr4", "pwr4")
1485 .Case("pwr5", "pwr5")
1486 .Case("pwr5x", "pwr5x")
1487 .Case("pwr6", "pwr6")
1488 .Case("pwr6x", "pwr6x")
1489 .Case("pwr7", "pwr7")
1490 .Case("pwr8", "pwr8")
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001491 .Case("pwr9", "pwr9")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001492 .Case("powerpc", "ppc")
1493 .Case("powerpc64", "ppc64")
1494 .Case("powerpc64le", "ppc64le")
1495 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001496 }
1497
1498 return "";
1499}
1500
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001501static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1502 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001503 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001504 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001505
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001506 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1507 if (FloatABI == ppc::FloatABI::Soft &&
1508 !(Triple.getArch() == llvm::Triple::ppc64 ||
1509 Triple.getArch() == llvm::Triple::ppc64le))
1510 Features.push_back("+soft-float");
1511 else if (FloatABI == ppc::FloatABI::Soft &&
1512 (Triple.getArch() == llvm::Triple::ppc64 ||
1513 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001514 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001515 << "soft float is not supported for ppc64";
1516
Eric Christopher643bb6a2013-10-16 20:40:08 +00001517 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001518 AddTargetFeature(Args, Features, options::OPT_faltivec,
1519 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001520}
1521
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001522ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1523 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1524 if (Arg *A =
1525 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1526 options::OPT_mfloat_abi_EQ)) {
1527 if (A->getOption().matches(options::OPT_msoft_float))
1528 ABI = ppc::FloatABI::Soft;
1529 else if (A->getOption().matches(options::OPT_mhard_float))
1530 ABI = ppc::FloatABI::Hard;
1531 else {
1532 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1533 .Case("soft", ppc::FloatABI::Soft)
1534 .Case("hard", ppc::FloatABI::Hard)
1535 .Default(ppc::FloatABI::Invalid);
1536 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1537 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1538 ABI = ppc::FloatABI::Hard;
1539 }
1540 }
1541 }
1542
1543 // If unspecified, choose the default based on the platform.
1544 if (ABI == ppc::FloatABI::Invalid) {
1545 ABI = ppc::FloatABI::Hard;
1546 }
1547
1548 return ABI;
1549}
1550
Ulrich Weigand8afad612014-07-28 13:17:52 +00001551void Clang::AddPPCTargetArgs(const ArgList &Args,
1552 ArgStringList &CmdArgs) const {
1553 // Select the ABI to use.
1554 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001555 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001556 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001557 case llvm::Triple::ppc64: {
1558 // When targeting a processor that supports QPX, or if QPX is
1559 // specifically enabled, default to using the ABI that supports QPX (so
1560 // long as it is not specifically disabled).
1561 bool HasQPX = false;
1562 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1563 HasQPX = A->getValue() == StringRef("a2q");
1564 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1565 if (HasQPX) {
1566 ABIName = "elfv1-qpx";
1567 break;
1568 }
1569
Ulrich Weigand8afad612014-07-28 13:17:52 +00001570 ABIName = "elfv1";
1571 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001572 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001573 case llvm::Triple::ppc64le:
1574 ABIName = "elfv2";
1575 break;
1576 default:
1577 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001578 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001579
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001580 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1581 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1582 // the option if given as we don't have backend support for any targets
1583 // that don't use the altivec abi.
1584 if (StringRef(A->getValue()) != "altivec")
1585 ABIName = A->getValue();
1586
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001587 ppc::FloatABI FloatABI =
1588 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1589
1590 if (FloatABI == ppc::FloatABI::Soft) {
1591 // Floating point operations and argument passing are soft.
1592 CmdArgs.push_back("-msoft-float");
1593 CmdArgs.push_back("-mfloat-abi");
1594 CmdArgs.push_back("soft");
1595 } else {
1596 // Floating point operations and argument passing are hard.
1597 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1598 CmdArgs.push_back("-mfloat-abi");
1599 CmdArgs.push_back("hard");
1600 }
1601
Ulrich Weigand8afad612014-07-28 13:17:52 +00001602 if (ABIName) {
1603 CmdArgs.push_back("-target-abi");
1604 CmdArgs.push_back(ABIName);
1605 }
1606}
1607
1608bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1609 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1610 return A && (A->getValue() == StringRef(Value));
1611}
1612
Tom Stellard6674c702013-04-01 20:56:53 +00001613/// Get the (LLVM) name of the R600 gpu we are targeting.
1614static std::string getR600TargetGPU(const ArgList &Args) {
1615 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001616 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001617 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001618 .Cases("rv630", "rv635", "r600")
1619 .Cases("rv610", "rv620", "rs780", "rs880")
1620 .Case("rv740", "rv770")
1621 .Case("palm", "cedar")
1622 .Cases("sumo", "sumo2", "sumo")
1623 .Case("hemlock", "cypress")
1624 .Case("aruba", "cayman")
1625 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001626 }
1627 return "";
1628}
1629
Jacques Pienaard964cc22016-03-28 21:02:54 +00001630static std::string getLanaiTargetCPU(const ArgList &Args) {
1631 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1632 return A->getValue();
1633 }
1634 return "";
1635}
1636
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001637void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001638 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001639 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001640 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001641
James Y Knightb2406522015-06-15 20:51:24 +00001642 bool SoftFloatABI = false;
1643 if (Arg *A =
1644 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001645 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001646 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001647 }
1648
James Y Knightb2406522015-06-15 20:51:24 +00001649 // Only the hard-float ABI on Sparc is standardized, and it is the
1650 // default. GCC also supports a nonstandard soft-float ABI mode, and
1651 // perhaps LLVM should implement that, too. However, since llvm
1652 // currently does not support Sparc soft-float, at all, display an
1653 // error if it's requested.
1654 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1656 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001657 }
1658}
1659
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00001660void Clang::AddSystemZTargetArgs(const ArgList &Args,
1661 ArgStringList &CmdArgs) const {
1662 if (Args.hasFlag(options::OPT_mbackchain, options::OPT_mno_backchain, false))
1663 CmdArgs.push_back("-mbackchain");
1664}
1665
Richard Sandiford4652d892013-07-19 16:51:51 +00001666static const char *getSystemZTargetCPU(const ArgList &Args) {
1667 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1668 return A->getValue();
1669 return "z10";
1670}
1671
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001672static void getSystemZTargetFeatures(const ArgList &Args,
1673 std::vector<const char *> &Features) {
1674 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001675 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001676 if (A->getOption().matches(options::OPT_mhtm))
1677 Features.push_back("+transactional-execution");
1678 else
1679 Features.push_back("-transactional-execution");
1680 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001681 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001682 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001683 if (A->getOption().matches(options::OPT_mvx))
1684 Features.push_back("+vector");
1685 else
1686 Features.push_back("-vector");
1687 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001688}
1689
Chandler Carruth953fb082013-01-13 11:46:33 +00001690static const char *getX86TargetCPU(const ArgList &Args,
1691 const llvm::Triple &Triple) {
1692 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001693 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001694 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001695 return "core-avx2";
1696
Chandler Carruth953fb082013-01-13 11:46:33 +00001697 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001698 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001699
1700 // FIXME: Reject attempts to use -march=native unless the target matches
1701 // the host.
1702 //
1703 // FIXME: We should also incorporate the detected target features for use
1704 // with -native.
1705 std::string CPU = llvm::sys::getHostCPUName();
1706 if (!CPU.empty() && CPU != "generic")
1707 return Args.MakeArgString(CPU);
1708 }
1709
Reid Kleckner3123eff2015-06-30 16:32:04 +00001710 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1711 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1712 StringRef Arch = A->getValue();
1713 const char *CPU;
1714 if (Triple.getArch() == llvm::Triple::x86) {
1715 CPU = llvm::StringSwitch<const char *>(Arch)
1716 .Case("IA32", "i386")
1717 .Case("SSE", "pentium3")
1718 .Case("SSE2", "pentium4")
1719 .Case("AVX", "sandybridge")
1720 .Case("AVX2", "haswell")
1721 .Default(nullptr);
1722 } else {
1723 CPU = llvm::StringSwitch<const char *>(Arch)
1724 .Case("AVX", "sandybridge")
1725 .Case("AVX2", "haswell")
1726 .Default(nullptr);
1727 }
1728 if (CPU)
1729 return CPU;
1730 }
1731
Chandler Carruth953fb082013-01-13 11:46:33 +00001732 // Select the default CPU if none was given (or detection failed).
1733
1734 if (Triple.getArch() != llvm::Triple::x86_64 &&
1735 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001736 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001737
1738 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1739
1740 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001741 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001742 if (Triple.getArchName() == "x86_64h")
1743 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001744 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001745 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001746
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001747 // Set up default CPU name for PS4 compilers.
1748 if (Triple.isPS4CPU())
1749 return "btver2";
1750
Alexey Bataev286d1b92014-01-31 04:07:13 +00001751 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001752 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001753 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001754
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001755 // Everything else goes to x86-64 in 64-bit mode.
1756 if (Is64Bit)
1757 return "x86-64";
1758
1759 switch (Triple.getOS()) {
1760 case llvm::Triple::FreeBSD:
1761 case llvm::Triple::NetBSD:
1762 case llvm::Triple::OpenBSD:
1763 return "i486";
1764 case llvm::Triple::Haiku:
1765 return "i586";
1766 case llvm::Triple::Bitrig:
1767 return "i686";
1768 default:
1769 // Fallback to p4.
1770 return "pentium4";
1771 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001772}
1773
Dan Gohmanc2853072015-09-03 22:51:53 +00001774/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1775static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1776 // If we have -mcpu=, use that.
1777 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1778 StringRef CPU = A->getValue();
1779
1780#ifdef __wasm__
1781 // Handle "native" by examining the host. "native" isn't meaningful when
1782 // cross compiling, so only support this when the host is also WebAssembly.
1783 if (CPU == "native")
1784 return llvm::sys::getHostCPUName();
1785#endif
1786
1787 return CPU;
1788 }
1789
1790 return "generic";
1791}
1792
Renato Golin7c542b42015-07-27 23:44:45 +00001793static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1794 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001795 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001796 default:
1797 return "";
1798
Amara Emerson703da2e2013-10-31 09:32:33 +00001799 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001800 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001801 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001802
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001803 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001804 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001805 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001806 case llvm::Triple::thumbeb: {
1807 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001808 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001809 return arm::getARMTargetCPU(MCPU, MArch, T);
1810 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001811 case llvm::Triple::mips:
1812 case llvm::Triple::mipsel:
1813 case llvm::Triple::mips64:
1814 case llvm::Triple::mips64el: {
1815 StringRef CPUName;
1816 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001817 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001818 return CPUName;
1819 }
1820
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001821 case llvm::Triple::nvptx:
1822 case llvm::Triple::nvptx64:
1823 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1824 return A->getValue();
1825 return "";
1826
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001827 case llvm::Triple::ppc:
1828 case llvm::Triple::ppc64:
1829 case llvm::Triple::ppc64le: {
1830 std::string TargetCPUName = getPPCTargetCPU(Args);
1831 // LLVM may default to generating code for the native CPU,
1832 // but, like gcc, we default to a more generic option for
1833 // each architecture. (except on Darwin)
1834 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1835 if (T.getArch() == llvm::Triple::ppc64)
1836 TargetCPUName = "ppc64";
1837 else if (T.getArch() == llvm::Triple::ppc64le)
1838 TargetCPUName = "ppc64le";
1839 else
1840 TargetCPUName = "ppc";
1841 }
1842 return TargetCPUName;
1843 }
1844
1845 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001846 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001847 case llvm::Triple::sparcv9:
1848 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001849 return A->getValue();
1850 return "";
1851
1852 case llvm::Triple::x86:
1853 case llvm::Triple::x86_64:
1854 return getX86TargetCPU(Args, T);
1855
1856 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001857 return "hexagon" +
1858 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001859
Jacques Pienaard964cc22016-03-28 21:02:54 +00001860 case llvm::Triple::lanai:
1861 return getLanaiTargetCPU(Args);
1862
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001863 case llvm::Triple::systemz:
1864 return getSystemZTargetCPU(Args);
1865
1866 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001867 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001868 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001869
1870 case llvm::Triple::wasm32:
1871 case llvm::Triple::wasm64:
1872 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001873 }
1874}
1875
Alp Tokerce365ca2013-12-02 12:43:03 +00001876static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001877 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001878 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1879 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1880 // forward.
1881 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001882 std::string Plugin =
1883 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001884 CmdArgs.push_back(Args.MakeArgString(Plugin));
1885
1886 // Try to pass driver level flags relevant to LTO code generation down to
1887 // the plugin.
1888
1889 // Handle flags for selecting CPU variants.
1890 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1891 if (!CPU.empty())
1892 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001893
James Molloyf97fdae2015-12-21 10:44:36 +00001894 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1895 StringRef OOpt;
1896 if (A->getOption().matches(options::OPT_O4) ||
1897 A->getOption().matches(options::OPT_Ofast))
1898 OOpt = "3";
1899 else if (A->getOption().matches(options::OPT_O))
1900 OOpt = A->getValue();
1901 else if (A->getOption().matches(options::OPT_O0))
1902 OOpt = "0";
1903 if (!OOpt.empty())
1904 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1905 }
1906
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001907 if (IsThinLTO)
1908 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001909
1910 // If an explicit debugger tuning argument appeared, pass it along.
1911 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1912 options::OPT_ggdbN_Group)) {
1913 if (A->getOption().matches(options::OPT_glldb))
1914 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1915 else if (A->getOption().matches(options::OPT_gsce))
1916 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1917 else
1918 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1919 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001920}
1921
Sanjay Patel2987c292015-06-11 14:53:41 +00001922/// This is a helper function for validating the optional refinement step
1923/// parameter in reciprocal argument strings. Return false if there is an error
1924/// parsing the refinement step. Otherwise, return true and set the Position
1925/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001926static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001927 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001928 const char RefinementStepToken = ':';
1929 Position = In.find(RefinementStepToken);
1930 if (Position != StringRef::npos) {
1931 StringRef Option = A.getOption().getName();
1932 StringRef RefStep = In.substr(Position + 1);
1933 // Allow exactly one numeric character for the additional refinement
1934 // step parameter. This is reasonable for all currently-supported
1935 // operations and architectures because we would expect that a larger value
1936 // of refinement steps would cause the estimate "optimization" to
1937 // under-perform the native operation. Also, if the estimate does not
1938 // converge quickly, it probably will not ever converge, so further
1939 // refinement steps will not produce a better answer.
1940 if (RefStep.size() != 1) {
1941 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1942 return false;
1943 }
1944 char RefStepChar = RefStep[0];
1945 if (RefStepChar < '0' || RefStepChar > '9') {
1946 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1947 return false;
1948 }
1949 }
1950 return true;
1951}
1952
1953/// The -mrecip flag requires processing of many optional parameters.
1954static void ParseMRecip(const Driver &D, const ArgList &Args,
1955 ArgStringList &OutStrings) {
1956 StringRef DisabledPrefixIn = "!";
1957 StringRef DisabledPrefixOut = "!";
1958 StringRef EnabledPrefixOut = "";
1959 StringRef Out = "-mrecip=";
1960
1961 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1962 if (!A)
1963 return;
1964
1965 unsigned NumOptions = A->getNumValues();
1966 if (NumOptions == 0) {
1967 // No option is the same as "all".
1968 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1969 return;
1970 }
1971
1972 // Pass through "all", "none", or "default" with an optional refinement step.
1973 if (NumOptions == 1) {
1974 StringRef Val = A->getValue(0);
1975 size_t RefStepLoc;
1976 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1977 return;
1978 StringRef ValBase = Val.slice(0, RefStepLoc);
1979 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1980 OutStrings.push_back(Args.MakeArgString(Out + Val));
1981 return;
1982 }
1983 }
1984
1985 // Each reciprocal type may be enabled or disabled individually.
1986 // Check each input value for validity, concatenate them all back together,
1987 // and pass through.
1988
1989 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001990 OptionStrings.insert(std::make_pair("divd", false));
1991 OptionStrings.insert(std::make_pair("divf", false));
1992 OptionStrings.insert(std::make_pair("vec-divd", false));
1993 OptionStrings.insert(std::make_pair("vec-divf", false));
1994 OptionStrings.insert(std::make_pair("sqrtd", false));
1995 OptionStrings.insert(std::make_pair("sqrtf", false));
1996 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1997 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001998
1999 for (unsigned i = 0; i != NumOptions; ++i) {
2000 StringRef Val = A->getValue(i);
2001
2002 bool IsDisabled = Val.startswith(DisabledPrefixIn);
2003 // Ignore the disablement token for string matching.
2004 if (IsDisabled)
2005 Val = Val.substr(1);
2006
2007 size_t RefStep;
2008 if (!getRefinementStep(Val, D, *A, RefStep))
2009 return;
2010
2011 StringRef ValBase = Val.slice(0, RefStep);
2012 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2013 if (OptionIter == OptionStrings.end()) {
2014 // Try again specifying float suffix.
2015 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2016 if (OptionIter == OptionStrings.end()) {
2017 // The input name did not match any known option string.
2018 D.Diag(diag::err_drv_unknown_argument) << Val;
2019 return;
2020 }
2021 // The option was specified without a float or double suffix.
2022 // Make sure that the double entry was not already specified.
2023 // The float entry will be checked below.
2024 if (OptionStrings[ValBase.str() + 'd']) {
2025 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2026 return;
2027 }
2028 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002029
Sanjay Patel2987c292015-06-11 14:53:41 +00002030 if (OptionIter->second == true) {
2031 // Duplicate option specified.
2032 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2033 return;
2034 }
2035
2036 // Mark the matched option as found. Do not allow duplicate specifiers.
2037 OptionIter->second = true;
2038
2039 // If the precision was not specified, also mark the double entry as found.
2040 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2041 OptionStrings[ValBase.str() + 'd'] = true;
2042
2043 // Build the output string.
2044 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2045 Out = Args.MakeArgString(Out + Prefix + Val);
2046 if (i != NumOptions - 1)
2047 Out = Args.MakeArgString(Out + ",");
2048 }
2049
2050 OutStrings.push_back(Args.MakeArgString(Out));
2051}
2052
Eric Christopherc54920a2015-03-23 19:26:05 +00002053static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002054 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002055 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002056 // If -march=native, autodetect the feature list.
2057 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2058 if (StringRef(A->getValue()) == "native") {
2059 llvm::StringMap<bool> HostFeatures;
2060 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2061 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002062 Features.push_back(
2063 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002064 }
2065 }
2066
Jim Grosbach82eee262013-11-16 00:53:35 +00002067 if (Triple.getArchName() == "x86_64h") {
2068 // x86_64h implies quite a few of the more modern subtarget features
2069 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2070 Features.push_back("-rdrnd");
2071 Features.push_back("-aes");
2072 Features.push_back("-pclmul");
2073 Features.push_back("-rtm");
2074 Features.push_back("-hle");
2075 Features.push_back("-fsgsbase");
2076 }
2077
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002078 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002079 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002080 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002081 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002082 Features.push_back("+sse4.2");
2083 Features.push_back("+popcnt");
2084 } else
2085 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002086 }
2087
Eric Christopherc54920a2015-03-23 19:26:05 +00002088 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002089 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2090 StringRef Arch = A->getValue();
2091 bool ArchUsed = false;
2092 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002093 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002094 if (Arch == "AVX" || Arch == "AVX2") {
2095 ArchUsed = true;
2096 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2097 }
2098 }
2099 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002100 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002101 if (Arch == "IA32") {
2102 ArchUsed = true;
2103 } else if (Arch == "SSE" || Arch == "SSE2") {
2104 ArchUsed = true;
2105 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2106 }
2107 }
2108 if (!ArchUsed)
2109 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2110 }
2111
Jim Grosbach82eee262013-11-16 00:53:35 +00002112 // Now add any that the user explicitly requested on the command line,
2113 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002114 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002115}
2116
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002117void Clang::AddX86TargetArgs(const ArgList &Args,
2118 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002119 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002120 Args.hasArg(options::OPT_mkernel) ||
2121 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002122 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002123
Bob Wilson2616e2e2013-02-10 16:01:41 +00002124 // Default to avoid implicit floating-point for kernel/kext code, but allow
2125 // that to be overridden with -mno-soft-float.
2126 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2127 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002128 if (Arg *A = Args.getLastArg(
2129 options::OPT_msoft_float, options::OPT_mno_soft_float,
2130 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002131 const Option &O = A->getOption();
2132 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2133 O.matches(options::OPT_msoft_float));
2134 }
2135 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002136 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002137
2138 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2139 StringRef Value = A->getValue();
2140 if (Value == "intel" || Value == "att") {
2141 CmdArgs.push_back("-mllvm");
2142 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2143 } else {
2144 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2145 << A->getOption().getName() << Value;
2146 }
2147 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002148
2149 // Set flags to support MCU ABI.
2150 if (Args.hasArg(options::OPT_miamcu)) {
2151 CmdArgs.push_back("-mfloat-abi");
2152 CmdArgs.push_back("soft");
2153 CmdArgs.push_back("-mstack-alignment=4");
2154 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002155}
2156
Tony Linthicum76329bf2011-12-12 21:14:55 +00002157void Clang::AddHexagonTargetArgs(const ArgList &Args,
2158 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002159 CmdArgs.push_back("-mqdsp6-compat");
2160 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002161
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002162 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2163 std::string N = llvm::utostr(G.getValue());
2164 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002165 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002166 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002167 }
2168
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002169 if (!Args.hasArg(options::OPT_fno_short_enums))
2170 CmdArgs.push_back("-fshort-enums");
2171 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002172 CmdArgs.push_back("-mllvm");
2173 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002174 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002175 CmdArgs.push_back("-mllvm");
2176 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002177}
2178
Jacques Pienaard964cc22016-03-28 21:02:54 +00002179void Clang::AddLanaiTargetArgs(const ArgList &Args,
2180 ArgStringList &CmdArgs) const {
2181 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2182 StringRef CPUName = A->getValue();
2183
2184 CmdArgs.push_back("-target-cpu");
2185 CmdArgs.push_back(Args.MakeArgString(CPUName));
2186 }
2187 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2188 StringRef Value = A->getValue();
2189 // Only support mregparm=4 to support old usage. Report error for all other
2190 // cases.
2191 int Mregparm;
2192 if (Value.getAsInteger(10, Mregparm)) {
2193 if (Mregparm != 4) {
2194 getToolChain().getDriver().Diag(
2195 diag::err_drv_unsupported_option_argument)
2196 << A->getOption().getName() << Value;
2197 }
2198 }
2199 }
2200}
2201
Dan Gohmane3d71e12016-01-07 01:00:21 +00002202void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2203 ArgStringList &CmdArgs) const {
2204 // Default to "hidden" visibility.
2205 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2206 options::OPT_fvisibility_ms_compat)) {
2207 CmdArgs.push_back("-fvisibility");
2208 CmdArgs.push_back("hidden");
2209 }
2210}
2211
Kevin Qin110db6f2014-07-18 07:03:22 +00002212// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002213static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002214 std::vector<const char *> &Features) {
2215 SmallVector<StringRef, 8> Split;
2216 text.split(Split, StringRef("+"), -1, false);
2217
Benjamin Kramer72e64312015-09-24 14:48:49 +00002218 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002219 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002220 .Case("fp", "+fp-armv8")
2221 .Case("simd", "+neon")
2222 .Case("crc", "+crc")
2223 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002224 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002225 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002226 .Case("nofp", "-fp-armv8")
2227 .Case("nosimd", "-neon")
2228 .Case("nocrc", "-crc")
2229 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002230 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002231 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002232 .Default(nullptr);
2233 if (result)
2234 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002235 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002236 D.Diag(diag::err_drv_no_neon_modifier);
2237 else
2238 return false;
2239 }
2240 return true;
2241}
2242
2243// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2244// decode CPU and feature.
2245static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2246 std::vector<const char *> &Features) {
2247 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2248 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002249 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002250 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2251 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002252 Features.push_back("+neon");
2253 Features.push_back("+crc");
2254 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002255 } else if (CPU == "cyclone") {
2256 Features.push_back("+neon");
2257 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002258 } else if (CPU == "generic") {
2259 Features.push_back("+neon");
2260 } else {
2261 return false;
2262 }
2263
2264 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2265 return false;
2266
2267 return true;
2268}
2269
2270static bool
2271getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2272 const ArgList &Args,
2273 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002274 std::string MarchLowerCase = March.lower();
2275 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002276
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002277 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002278 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002279 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002280 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002281 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2282 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002283 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002284 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002285 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002286
2287 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2288 return false;
2289
2290 return true;
2291}
2292
2293static bool
2294getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2295 const ArgList &Args,
2296 std::vector<const char *> &Features) {
2297 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002298 std::string McpuLowerCase = Mcpu.lower();
2299 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002300 return false;
2301
2302 return true;
2303}
2304
2305static bool
2306getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2307 const ArgList &Args,
2308 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002309 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002310 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002311 if (MtuneLowerCase == "native")
2312 MtuneLowerCase = llvm::sys::getHostCPUName();
2313 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002314 Features.push_back("+zcm");
2315 Features.push_back("+zcz");
2316 }
2317 return true;
2318}
2319
2320static bool
2321getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2322 const ArgList &Args,
2323 std::vector<const char *> &Features) {
2324 StringRef CPU;
2325 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002326 std::string McpuLowerCase = Mcpu.lower();
2327 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002328 return false;
2329
2330 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2331}
2332
Justin Bognerf9052562015-11-13 23:07:31 +00002333static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002334 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002335 Arg *A;
2336 bool success = true;
2337 // Enable NEON by default.
2338 Features.push_back("+neon");
2339 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2340 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2341 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2342 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002343 else if (Args.hasArg(options::OPT_arch))
2344 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2345 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002346
2347 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2348 success =
2349 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2350 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2351 success =
2352 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002353 else if (Args.hasArg(options::OPT_arch))
2354 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2355 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002356
2357 if (!success)
2358 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002359
2360 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2361 Features.push_back("-fp-armv8");
2362 Features.push_back("-crypto");
2363 Features.push_back("-neon");
2364 }
Bradley Smith418c5932014-05-02 15:17:51 +00002365
2366 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002367 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002368 if (A->getOption().matches(options::OPT_mcrc))
2369 Features.push_back("+crc");
2370 else
2371 Features.push_back("-crc");
2372 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002373
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002374 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2375 options::OPT_munaligned_access))
2376 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2377 Features.push_back("+strict-align");
2378
Justin Bognerf9052562015-11-13 23:07:31 +00002379 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002380 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002381}
2382
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002383static void getHexagonTargetFeatures(const ArgList &Args,
2384 std::vector<const char *> &Features) {
2385 bool HasHVX = false, HasHVXD = false;
2386
Eric Christopher49062a52015-12-22 03:12:34 +00002387 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2388 // doing dependent option handling here rather than in initFeatureMap or a
2389 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002390 for (auto &A : Args) {
2391 auto &Opt = A->getOption();
2392 if (Opt.matches(options::OPT_mhexagon_hvx))
2393 HasHVX = true;
2394 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2395 HasHVXD = HasHVX = false;
2396 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2397 HasHVXD = HasHVX = true;
2398 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2399 HasHVXD = false;
2400 else
2401 continue;
2402 A->claim();
2403 }
2404
2405 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2406 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2407}
2408
Dan Gohmanc2853072015-09-03 22:51:53 +00002409static void getWebAssemblyTargetFeatures(const ArgList &Args,
2410 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002411 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002412}
2413
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002414static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2415 std::vector<const char *> &Features) {
2416 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2417 StringRef value = dAbi->getValue();
2418 if (value == "1.0") {
2419 Features.push_back("+amdgpu-debugger-insert-nops");
2420 Features.push_back("+amdgpu-debugger-reserve-trap-regs");
2421 } else {
2422 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2423 }
2424 }
2425
2426 handleTargetFeaturesGroup(
2427 Args, Features, options::OPT_m_amdgpu_Features_Group);
2428}
2429
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002430static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002431 const ArgList &Args, ArgStringList &CmdArgs,
2432 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002433 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002434 std::vector<const char *> Features;
2435 switch (Triple.getArch()) {
2436 default:
2437 break;
2438 case llvm::Triple::mips:
2439 case llvm::Triple::mipsel:
2440 case llvm::Triple::mips64:
2441 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002442 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002443 break;
2444
2445 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002446 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002447 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002448 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002449 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002450 break;
2451
2452 case llvm::Triple::ppc:
2453 case llvm::Triple::ppc64:
2454 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002455 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002456 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002457 case llvm::Triple::systemz:
2458 getSystemZTargetFeatures(Args, Features);
2459 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002460 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002461 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002462 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002463 break;
2464 case llvm::Triple::x86:
2465 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002466 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002467 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002468 case llvm::Triple::hexagon:
2469 getHexagonTargetFeatures(Args, Features);
2470 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002471 case llvm::Triple::wasm32:
2472 case llvm::Triple::wasm64:
2473 getWebAssemblyTargetFeatures(Args, Features);
2474 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002475 case llvm::Triple::r600:
2476 case llvm::Triple::amdgcn:
2477 getAMDGPUTargetFeatures(D, Args, Features);
2478 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002479 }
Rafael Espindola43964802013-08-21 17:34:32 +00002480
2481 // Find the last of each feature.
2482 llvm::StringMap<unsigned> LastOpt;
2483 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2484 const char *Name = Features[I];
2485 assert(Name[0] == '-' || Name[0] == '+');
2486 LastOpt[Name + 1] = I;
2487 }
2488
2489 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2490 // If this feature was overridden, ignore it.
2491 const char *Name = Features[I];
2492 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2493 assert(LastI != LastOpt.end());
2494 unsigned Last = LastI->second;
2495 if (Last != I)
2496 continue;
2497
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002498 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002499 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002500 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002501}
2502
David Majnemerae394812014-12-09 00:12:30 +00002503static bool
2504shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2505 const llvm::Triple &Triple) {
2506 // We use the zero-cost exception tables for Objective-C if the non-fragile
2507 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2508 // later.
2509 if (runtime.isNonFragile())
2510 return true;
2511
2512 if (!Triple.isMacOSX())
2513 return false;
2514
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002515 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002516 (Triple.getArch() == llvm::Triple::x86_64 ||
2517 Triple.getArch() == llvm::Triple::arm));
2518}
2519
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002520/// Adds exception related arguments to the driver command arguments. There's a
2521/// master flag, -fexceptions and also language specific flags to enable/disable
2522/// C++ and Objective-C exceptions. This makes it possible to for example
2523/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002524static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002525 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002526 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002527 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002528 const Driver &D = TC.getDriver();
2529 const llvm::Triple &Triple = TC.getTriple();
2530
Chad Rosier4fab82c2012-03-26 22:04:46 +00002531 if (KernelOrKext) {
2532 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2533 // arguments now to avoid warnings about unused arguments.
2534 Args.ClaimAllArgs(options::OPT_fexceptions);
2535 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2536 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2537 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2538 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2539 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002540 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002541 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002542
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002543 // See if the user explicitly enabled exceptions.
2544 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2545 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002546
David Majnemerae394812014-12-09 00:12:30 +00002547 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2548 // is not necessarily sensible, but follows GCC.
2549 if (types::isObjC(InputType) &&
2550 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002551 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002552 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002553
David Majnemerae394812014-12-09 00:12:30 +00002554 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002555 }
2556
2557 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002558 // Disable C++ EH by default on XCore and PS4.
2559 bool CXXExceptionsEnabled =
2560 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002561 Arg *ExceptionArg = Args.getLastArg(
2562 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2563 options::OPT_fexceptions, options::OPT_fno_exceptions);
2564 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002565 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002566 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2567 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002568
2569 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002570 if (Triple.isPS4CPU()) {
2571 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2572 assert(ExceptionArg &&
2573 "On the PS4 exceptions should only be enabled if passing "
2574 "an argument");
2575 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2576 const Arg *RTTIArg = TC.getRTTIArg();
2577 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2578 D.Diag(diag::err_drv_argument_not_allowed_with)
2579 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2580 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2581 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2582 } else
2583 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2584
Anders Carlssone96ab552011-02-28 02:27:16 +00002585 CmdArgs.push_back("-fcxx-exceptions");
2586
David Majnemer8de68642014-12-05 08:11:58 +00002587 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002588 }
2589 }
2590
David Majnemer8de68642014-12-05 08:11:58 +00002591 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002592 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002593}
2594
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002595static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002596 bool Default = true;
2597 if (TC.getTriple().isOSDarwin()) {
2598 // The native darwin assembler doesn't support the linker_option directives,
2599 // so we disable them if we think the .s file will be passed to it.
2600 Default = TC.useIntegratedAs();
2601 }
2602 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2603 Default);
2604}
2605
Ted Kremenek62093662013-03-12 17:02:12 +00002606static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2607 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002608 bool UseDwarfDirectory =
2609 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2610 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002611 return !UseDwarfDirectory;
2612}
2613
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002614/// \brief Check whether the given input tree contains any compilation actions.
2615static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002616 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002617 return true;
2618
Nico Weber5a459f82016-02-23 19:30:43 +00002619 for (const auto &AI : A->inputs())
2620 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002621 return true;
2622
2623 return false;
2624}
2625
2626/// \brief Check if -relax-all should be passed to the internal assembler.
2627/// This is done by default when compiling non-assembler source with -O0.
2628static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2629 bool RelaxDefault = true;
2630
2631 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2632 RelaxDefault = A->getOption().matches(options::OPT_O0);
2633
2634 if (RelaxDefault) {
2635 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002636 for (const auto &Act : C.getActions()) {
2637 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002638 RelaxDefault = true;
2639 break;
2640 }
2641 }
2642 }
2643
2644 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002645 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002646}
2647
Paul Robinson0334a042015-12-19 19:41:48 +00002648// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2649// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002650static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002651 assert(A.getOption().matches(options::OPT_gN_Group) &&
2652 "Not a -g option that specifies a debug-info level");
2653 if (A.getOption().matches(options::OPT_g0) ||
2654 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002655 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002656 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2657 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002658 return codegenoptions::DebugLineTablesOnly;
2659 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002660}
2661
Douglas Katzman3459ce22015-10-08 04:24:12 +00002662// Extract the integer N from a string spelled "-dwarf-N", returning 0
2663// on mismatch. The StringRef input (rather than an Arg) allows
2664// for use by the "-Xassembler" option parser.
2665static unsigned DwarfVersionNum(StringRef ArgValue) {
2666 return llvm::StringSwitch<unsigned>(ArgValue)
2667 .Case("-gdwarf-2", 2)
2668 .Case("-gdwarf-3", 3)
2669 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002670 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002671 .Default(0);
2672}
2673
2674static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002675 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002676 unsigned DwarfVersion,
2677 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002678 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002679 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002680 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2681 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002682 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002683 CmdArgs.push_back("-debug-info-kind=limited");
2684 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002685 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002686 CmdArgs.push_back("-debug-info-kind=standalone");
2687 break;
2688 default:
2689 break;
2690 }
2691 if (DwarfVersion > 0)
2692 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002693 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002694 switch (DebuggerTuning) {
2695 case llvm::DebuggerKind::GDB:
2696 CmdArgs.push_back("-debugger-tuning=gdb");
2697 break;
2698 case llvm::DebuggerKind::LLDB:
2699 CmdArgs.push_back("-debugger-tuning=lldb");
2700 break;
2701 case llvm::DebuggerKind::SCE:
2702 CmdArgs.push_back("-debugger-tuning=sce");
2703 break;
2704 default:
2705 break;
2706 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002707}
2708
David Blaikie9260ed62013-07-25 21:19:01 +00002709static void CollectArgsForIntegratedAssembler(Compilation &C,
2710 const ArgList &Args,
2711 ArgStringList &CmdArgs,
2712 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002713 if (UseRelaxAll(C, Args))
2714 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002715
David Majnemer2b9349d2015-12-21 22:09:34 +00002716 // Only default to -mincremental-linker-compatible if we think we are
2717 // targeting the MSVC linker.
2718 bool DefaultIncrementalLinkerCompatible =
2719 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2720 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2721 options::OPT_mno_incremental_linker_compatible,
2722 DefaultIncrementalLinkerCompatible))
2723 CmdArgs.push_back("-mincremental-linker-compatible");
2724
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002725 // When passing -I arguments to the assembler we sometimes need to
2726 // unconditionally take the next argument. For example, when parsing
2727 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2728 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2729 // arg after parsing the '-I' arg.
2730 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002731
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002732 // When using an integrated assembler, translate -Wa, and -Xassembler
2733 // options.
2734 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002735 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002736 for (const Arg *A :
2737 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2738 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002739
Benjamin Kramer72e64312015-09-24 14:48:49 +00002740 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002741 if (TakeNextArg) {
2742 CmdArgs.push_back(Value.data());
2743 TakeNextArg = false;
2744 continue;
2745 }
David Blaikie9260ed62013-07-25 21:19:01 +00002746
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002747 switch (C.getDefaultToolChain().getArch()) {
2748 default:
2749 break;
2750 case llvm::Triple::mips:
2751 case llvm::Triple::mipsel:
2752 case llvm::Triple::mips64:
2753 case llvm::Triple::mips64el:
2754 if (Value == "--trap") {
2755 CmdArgs.push_back("-target-feature");
2756 CmdArgs.push_back("+use-tcc-in-div");
2757 continue;
2758 }
2759 if (Value == "--break") {
2760 CmdArgs.push_back("-target-feature");
2761 CmdArgs.push_back("-use-tcc-in-div");
2762 continue;
2763 }
2764 if (Value.startswith("-msoft-float")) {
2765 CmdArgs.push_back("-target-feature");
2766 CmdArgs.push_back("+soft-float");
2767 continue;
2768 }
2769 if (Value.startswith("-mhard-float")) {
2770 CmdArgs.push_back("-target-feature");
2771 CmdArgs.push_back("-soft-float");
2772 continue;
2773 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002774
2775 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2776 .Case("-mips1", "+mips1")
2777 .Case("-mips2", "+mips2")
2778 .Case("-mips3", "+mips3")
2779 .Case("-mips4", "+mips4")
2780 .Case("-mips5", "+mips5")
2781 .Case("-mips32", "+mips32")
2782 .Case("-mips32r2", "+mips32r2")
2783 .Case("-mips32r3", "+mips32r3")
2784 .Case("-mips32r5", "+mips32r5")
2785 .Case("-mips32r6", "+mips32r6")
2786 .Case("-mips64", "+mips64")
2787 .Case("-mips64r2", "+mips64r2")
2788 .Case("-mips64r3", "+mips64r3")
2789 .Case("-mips64r5", "+mips64r5")
2790 .Case("-mips64r6", "+mips64r6")
2791 .Default(nullptr);
2792 if (MipsTargetFeature)
2793 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002794 }
2795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002796 if (Value == "-force_cpusubtype_ALL") {
2797 // Do nothing, this is the default and we don't support anything else.
2798 } else if (Value == "-L") {
2799 CmdArgs.push_back("-msave-temp-labels");
2800 } else if (Value == "--fatal-warnings") {
2801 CmdArgs.push_back("-massembler-fatal-warnings");
2802 } else if (Value == "--noexecstack") {
2803 CmdArgs.push_back("-mnoexecstack");
2804 } else if (Value == "-compress-debug-sections" ||
2805 Value == "--compress-debug-sections") {
2806 CompressDebugSections = true;
2807 } else if (Value == "-nocompress-debug-sections" ||
2808 Value == "--nocompress-debug-sections") {
2809 CompressDebugSections = false;
2810 } else if (Value.startswith("-I")) {
2811 CmdArgs.push_back(Value.data());
2812 // We need to consume the next argument if the current arg is a plain
2813 // -I. The next arg will be the include directory.
2814 if (Value == "-I")
2815 TakeNextArg = true;
2816 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002817 // "-gdwarf-N" options are not cc1as options.
2818 unsigned DwarfVersion = DwarfVersionNum(Value);
2819 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2820 CmdArgs.push_back(Value.data());
2821 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002822 RenderDebugEnablingArgs(Args, CmdArgs,
2823 codegenoptions::LimitedDebugInfo,
2824 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002825 }
Renato Golin7c542b42015-07-27 23:44:45 +00002826 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2827 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2828 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002829 } else {
2830 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002831 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002832 }
2833 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002834 }
2835 if (CompressDebugSections) {
2836 if (llvm::zlib::isAvailable())
2837 CmdArgs.push_back("-compress-debug-sections");
2838 else
2839 D.Diag(diag::warn_debug_compression_unavailable);
2840 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002841 if (MipsTargetFeature != nullptr) {
2842 CmdArgs.push_back("-target-feature");
2843 CmdArgs.push_back(MipsTargetFeature);
2844 }
David Blaikie9260ed62013-07-25 21:19:01 +00002845}
2846
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002847// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002848// FIXME: Make sure we can also emit shared objects if they're requested
2849// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002850static void addClangRT(const ToolChain &TC, const ArgList &Args,
2851 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002852 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002853}
2854
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002855namespace {
2856enum OpenMPRuntimeKind {
2857 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2858 /// without knowing what runtime to target.
2859 OMPRT_Unknown,
2860
2861 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2862 /// the default for Clang.
2863 OMPRT_OMP,
2864
2865 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2866 /// this runtime but can swallow the pragmas, and find and link against the
2867 /// runtime library itself.
2868 OMPRT_GOMP,
2869
Chandler Carruthc6625c62015-05-28 21:10:31 +00002870 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002871 /// OpenMP runtime. We support this mode for users with existing dependencies
2872 /// on this runtime library name.
2873 OMPRT_IOMP5
2874};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002875}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002876
2877/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002878static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2879 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002880 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2881
2882 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2883 if (A)
2884 RuntimeName = A->getValue();
2885
2886 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002887 .Case("libomp", OMPRT_OMP)
2888 .Case("libgomp", OMPRT_GOMP)
2889 .Case("libiomp5", OMPRT_IOMP5)
2890 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002891
2892 if (RT == OMPRT_Unknown) {
2893 if (A)
2894 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002895 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002896 else
2897 // FIXME: We could use a nicer diagnostic here.
2898 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2899 }
2900
2901 return RT;
2902}
2903
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002904static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2905 const ArgList &Args) {
2906 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2907 options::OPT_fno_openmp, false))
2908 return;
2909
2910 switch (getOpenMPRuntime(TC, Args)) {
2911 case OMPRT_OMP:
2912 CmdArgs.push_back("-lomp");
2913 break;
2914 case OMPRT_GOMP:
2915 CmdArgs.push_back("-lgomp");
2916 break;
2917 case OMPRT_IOMP5:
2918 CmdArgs.push_back("-liomp5");
2919 break;
2920 case OMPRT_Unknown:
2921 // Already diagnosed.
2922 break;
2923 }
2924}
2925
Alexey Samsonov52550342014-09-15 19:58:40 +00002926static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2927 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002928 bool IsShared, bool IsWhole) {
2929 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002930 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002931 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002932 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002933 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002934}
2935
Alexey Samsonov52550342014-09-15 19:58:40 +00002936// Tries to use a file with the list of dynamic symbols that need to be exported
2937// from the runtime library. Returns true if the file was found.
2938static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2939 ArgStringList &CmdArgs,
2940 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002941 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002942 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2943 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002944 return true;
2945 }
2946 return false;
2947}
2948
2949static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2950 ArgStringList &CmdArgs) {
2951 // Force linking against the system libraries sanitizers depends on
2952 // (see PR15823 why this is necessary).
2953 CmdArgs.push_back("--no-as-needed");
2954 CmdArgs.push_back("-lpthread");
2955 CmdArgs.push_back("-lrt");
2956 CmdArgs.push_back("-lm");
2957 // There's no libdl on FreeBSD.
2958 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2959 CmdArgs.push_back("-ldl");
2960}
2961
2962static void
2963collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2964 SmallVectorImpl<StringRef> &SharedRuntimes,
2965 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002966 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2967 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2968 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002969 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2970 // Collect shared runtimes.
2971 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2972 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002973 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002974 // The stats_client library is also statically linked into DSOs.
2975 if (SanArgs.needsStatsRt())
2976 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002977
Alexey Samsonov52550342014-09-15 19:58:40 +00002978 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002979 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002980 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002981 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002982 }
2983 if (SanArgs.needsAsanRt()) {
2984 if (SanArgs.needsSharedAsanRt()) {
2985 HelperStaticRuntimes.push_back("asan-preinit");
2986 } else {
2987 StaticRuntimes.push_back("asan");
2988 if (SanArgs.linkCXXRuntimes())
2989 StaticRuntimes.push_back("asan_cxx");
2990 }
2991 }
2992 if (SanArgs.needsDfsanRt())
2993 StaticRuntimes.push_back("dfsan");
2994 if (SanArgs.needsLsanRt())
2995 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002996 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002997 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002998 if (SanArgs.linkCXXRuntimes())
2999 StaticRuntimes.push_back("msan_cxx");
3000 }
3001 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003002 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00003003 if (SanArgs.linkCXXRuntimes())
3004 StaticRuntimes.push_back("tsan_cxx");
3005 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003006 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00003007 StaticRuntimes.push_back("ubsan_standalone");
3008 if (SanArgs.linkCXXRuntimes())
3009 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003010 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003011 if (SanArgs.needsSafeStackRt())
3012 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003013 if (SanArgs.needsCfiRt())
3014 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003015 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003016 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003017 if (SanArgs.linkCXXRuntimes())
3018 StaticRuntimes.push_back("ubsan_standalone_cxx");
3019 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003020 if (SanArgs.needsStatsRt()) {
3021 NonWholeStaticRuntimes.push_back("stats");
3022 RequiredSymbols.push_back("__sanitizer_stats_register");
3023 }
Derek Bruening256c2e12016-04-21 21:32:04 +00003024 if (SanArgs.needsEsanRt())
3025 StaticRuntimes.push_back("esan");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003026}
3027
Alexey Samsonov52550342014-09-15 19:58:40 +00003028// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3029// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3030static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003031 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003032 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003033 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003034 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003035 NonWholeStaticRuntimes, HelperStaticRuntimes,
3036 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003037 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003038 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003039 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003040 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003041 bool AddExportDynamic = false;
3042 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003043 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003044 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3045 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003046 for (auto RT : NonWholeStaticRuntimes) {
3047 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3048 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3049 }
3050 for (auto S : RequiredSymbols) {
3051 CmdArgs.push_back("-u");
3052 CmdArgs.push_back(Args.MakeArgString(S));
3053 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003054 // If there is a static runtime with no dynamic list, force all the symbols
3055 // to be dynamic to be sure we export sanitizer interface functions.
3056 if (AddExportDynamic)
3057 CmdArgs.push_back("-export-dynamic");
3058 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003059}
3060
Reid Kleckner86ea7702015-02-04 23:45:07 +00003061static bool areOptimizationsEnabled(const ArgList &Args) {
3062 // Find the last -O arg and see if it is non-zero.
3063 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3064 return !A->getOption().matches(options::OPT_O0);
3065 // Defaults to -O0.
3066 return false;
3067}
3068
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003069static bool shouldUseFramePointerForTarget(const ArgList &Args,
3070 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003071 switch (Triple.getArch()) {
3072 case llvm::Triple::xcore:
3073 case llvm::Triple::wasm32:
3074 case llvm::Triple::wasm64:
3075 // XCore never wants frame pointers, regardless of OS.
3076 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003077 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003078 default:
3079 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003080 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003081
3082 if (Triple.isOSLinux()) {
3083 switch (Triple.getArch()) {
3084 // Don't use a frame pointer on linux if optimizing for certain targets.
3085 case llvm::Triple::mips64:
3086 case llvm::Triple::mips64el:
3087 case llvm::Triple::mips:
3088 case llvm::Triple::mipsel:
3089 case llvm::Triple::systemz:
3090 case llvm::Triple::x86:
3091 case llvm::Triple::x86_64:
3092 return !areOptimizationsEnabled(Args);
3093 default:
3094 return true;
3095 }
3096 }
3097
3098 if (Triple.isOSWindows()) {
3099 switch (Triple.getArch()) {
3100 case llvm::Triple::x86:
3101 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003102 case llvm::Triple::x86_64:
3103 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003104 case llvm::Triple::arm:
3105 case llvm::Triple::thumb:
3106 // Windows on ARM builds with FPO disabled to aid fast stack walking
3107 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003108 default:
3109 // All other supported Windows ISAs use xdata unwind information, so frame
3110 // pointers are not generally useful.
3111 return false;
3112 }
3113 }
3114
3115 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003116}
3117
Rafael Espindola224dd632011-12-14 21:02:23 +00003118static bool shouldUseFramePointer(const ArgList &Args,
3119 const llvm::Triple &Triple) {
3120 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3121 options::OPT_fomit_frame_pointer))
3122 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003123 if (Args.hasArg(options::OPT_pg))
3124 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003125
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003126 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003127}
3128
Eric Christopherb7d97e92013-04-03 01:58:53 +00003129static bool shouldUseLeafFramePointer(const ArgList &Args,
3130 const llvm::Triple &Triple) {
3131 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3132 options::OPT_momit_leaf_frame_pointer))
3133 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003134 if (Args.hasArg(options::OPT_pg))
3135 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003136
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003137 if (Triple.isPS4CPU())
3138 return false;
3139
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003140 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003141}
3142
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003143/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003144static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003145 SmallString<128> cwd;
3146 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003147 CmdArgs.push_back("-fdebug-compilation-dir");
3148 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003149 }
3150}
3151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003152static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003153 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3154 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3155 SmallString<128> T(FinalOutput->getValue());
3156 llvm::sys::path::replace_extension(T, "dwo");
3157 return Args.MakeArgString(T);
3158 } else {
3159 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003160 SmallString<128> T(
3161 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003162 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003163 llvm::sys::path::replace_extension(F, "dwo");
3164 T += F;
3165 return Args.MakeArgString(F);
3166 }
3167}
3168
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003169static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3170 const JobAction &JA, const ArgList &Args,
3171 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003172 ArgStringList ExtractArgs;
3173 ExtractArgs.push_back("--extract-dwo");
3174
3175 ArgStringList StripArgs;
3176 StripArgs.push_back("--strip-dwo");
3177
3178 // Grabbing the output of the earlier compile step.
3179 StripArgs.push_back(Output.getFilename());
3180 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003181 ExtractArgs.push_back(OutFile);
3182
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003183 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003184 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003185
3186 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003187 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003188
3189 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003190 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003191}
3192
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003193/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003194/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3195static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003196 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003197 if (A->getOption().matches(options::OPT_O4) ||
3198 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003199 return true;
3200
3201 if (A->getOption().matches(options::OPT_O0))
3202 return false;
3203
3204 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3205
Rafael Espindola91780de2013-08-26 14:05:41 +00003206 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003207 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003208 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003209 return true;
3210
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003211 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003212 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003213 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003214
3215 unsigned OptLevel = 0;
3216 if (S.getAsInteger(10, OptLevel))
3217 return false;
3218
3219 return OptLevel > 1;
3220 }
3221
3222 return false;
3223}
3224
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003225/// Add -x lang to \p CmdArgs for \p Input.
3226static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3227 ArgStringList &CmdArgs) {
3228 // When using -verify-pch, we don't want to provide the type
3229 // 'precompiled-header' if it was inferred from the file extension
3230 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3231 return;
3232
3233 CmdArgs.push_back("-x");
3234 if (Args.hasArg(options::OPT_rewrite_objc))
3235 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3236 else
3237 CmdArgs.push_back(types::getTypeName(Input.getType()));
3238}
3239
David Majnemerc371ff02015-03-22 08:39:22 +00003240static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003241 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003242 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003243
3244 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003245 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003246
3247 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003248 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003249 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003250 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003251}
3252
Rafael Espindola577637a2015-01-03 00:06:04 +00003253// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003254// options that build systems might add but are unused when assembling or only
3255// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003256static void claimNoWarnArgs(const ArgList &Args) {
3257 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003258 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003259 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003260 Args.ClaimAllArgs(options::OPT_flto);
3261 Args.ClaimAllArgs(options::OPT_fno_lto);
3262}
3263
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003264static void appendUserToPath(SmallVectorImpl<char> &Result) {
3265#ifdef LLVM_ON_UNIX
3266 const char *Username = getenv("LOGNAME");
3267#else
3268 const char *Username = getenv("USERNAME");
3269#endif
3270 if (Username) {
3271 // Validate that LoginName can be used in a path, and get its length.
3272 size_t Len = 0;
3273 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003274 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003275 Username = nullptr;
3276 break;
3277 }
3278 }
3279
3280 if (Username && Len > 0) {
3281 Result.append(Username, Username + Len);
3282 return;
3283 }
3284 }
3285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003286// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003287#ifdef LLVM_ON_UNIX
3288 std::string UID = llvm::utostr(getuid());
3289#else
3290 // FIXME: Windows seems to have an 'SID' that might work.
3291 std::string UID = "9999";
3292#endif
3293 Result.append(UID.begin(), UID.end());
3294}
3295
David Majnemere11d3732015-06-08 00:22:46 +00003296VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3297 const llvm::Triple &Triple,
3298 const llvm::opt::ArgList &Args,
3299 bool IsWindowsMSVC) {
3300 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3301 IsWindowsMSVC) ||
3302 Args.hasArg(options::OPT_fmsc_version) ||
3303 Args.hasArg(options::OPT_fms_compatibility_version)) {
3304 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3305 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003306 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003307
3308 if (MSCVersion && MSCompatibilityVersion) {
3309 if (D)
3310 D->Diag(diag::err_drv_argument_not_allowed_with)
3311 << MSCVersion->getAsString(Args)
3312 << MSCompatibilityVersion->getAsString(Args);
3313 return VersionTuple();
3314 }
3315
3316 if (MSCompatibilityVersion) {
3317 VersionTuple MSVT;
3318 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3319 D->Diag(diag::err_drv_invalid_value)
3320 << MSCompatibilityVersion->getAsString(Args)
3321 << MSCompatibilityVersion->getValue();
3322 return MSVT;
3323 }
3324
3325 if (MSCVersion) {
3326 unsigned Version = 0;
3327 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3328 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3329 << MSCVersion->getValue();
3330 return getMSCompatibilityVersion(Version);
3331 }
3332
3333 unsigned Major, Minor, Micro;
3334 Triple.getEnvironmentVersion(Major, Minor, Micro);
3335 if (Major || Minor || Micro)
3336 return VersionTuple(Major, Minor, Micro);
3337
Nico Weber9a952752016-03-23 23:26:59 +00003338 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003339 return VersionTuple(18);
3340 }
3341 return VersionTuple();
3342}
3343
Diego Novilloa0545962015-07-10 18:00:07 +00003344static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3345 const InputInfo &Output, const ArgList &Args,
3346 ArgStringList &CmdArgs) {
3347 auto *ProfileGenerateArg = Args.getLastArg(
3348 options::OPT_fprofile_instr_generate,
3349 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003350 options::OPT_fprofile_generate_EQ,
3351 options::OPT_fno_profile_instr_generate);
3352 if (ProfileGenerateArg &&
3353 ProfileGenerateArg->getOption().matches(
3354 options::OPT_fno_profile_instr_generate))
3355 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003356
3357 auto *ProfileUseArg = Args.getLastArg(
3358 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003359 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3360 options::OPT_fno_profile_instr_use);
3361 if (ProfileUseArg &&
3362 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3363 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003364
3365 if (ProfileGenerateArg && ProfileUseArg)
3366 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003367 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003368
Diego Novillo758f3f52015-08-05 21:49:51 +00003369 if (ProfileGenerateArg) {
3370 if (ProfileGenerateArg->getOption().matches(
3371 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003372 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3373 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003374 else if (ProfileGenerateArg->getOption().matches(
3375 options::OPT_fprofile_generate_EQ)) {
3376 SmallString<128> Path(ProfileGenerateArg->getValue());
3377 llvm::sys::path::append(Path, "default.profraw");
3378 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003379 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3380 }
3381 // The default is to use Clang Instrumentation.
3382 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003383 }
Diego Novilloa0545962015-07-10 18:00:07 +00003384
Diego Novillo758f3f52015-08-05 21:49:51 +00003385 if (ProfileUseArg) {
3386 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003387 CmdArgs.push_back(Args.MakeArgString(
3388 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003389 else if ((ProfileUseArg->getOption().matches(
3390 options::OPT_fprofile_use_EQ) ||
3391 ProfileUseArg->getOption().matches(
3392 options::OPT_fprofile_instr_use))) {
3393 SmallString<128> Path(
3394 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3395 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3396 llvm::sys::path::append(Path, "default.profdata");
3397 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003398 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003399 }
Diego Novilloa0545962015-07-10 18:00:07 +00003400 }
3401
3402 if (Args.hasArg(options::OPT_ftest_coverage) ||
3403 Args.hasArg(options::OPT_coverage))
3404 CmdArgs.push_back("-femit-coverage-notes");
3405 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3406 false) ||
3407 Args.hasArg(options::OPT_coverage))
3408 CmdArgs.push_back("-femit-coverage-data");
3409
Diego Novilloc4b94da2015-08-05 23:27:40 +00003410 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3411 options::OPT_fno_coverage_mapping, false) &&
3412 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003413 D.Diag(diag::err_drv_argument_only_allowed_with)
3414 << "-fcoverage-mapping"
3415 << "-fprofile-instr-generate";
3416
Diego Novilloc4b94da2015-08-05 23:27:40 +00003417 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3418 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003419 CmdArgs.push_back("-fcoverage-mapping");
3420
3421 if (C.getArgs().hasArg(options::OPT_c) ||
3422 C.getArgs().hasArg(options::OPT_S)) {
3423 if (Output.isFilename()) {
3424 CmdArgs.push_back("-coverage-file");
3425 SmallString<128> CoverageFilename;
3426 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3427 CoverageFilename = FinalOutput->getValue();
3428 } else {
3429 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3430 }
3431 if (llvm::sys::path::is_relative(CoverageFilename)) {
3432 SmallString<128> Pwd;
3433 if (!llvm::sys::fs::current_path(Pwd)) {
3434 llvm::sys::path::append(Pwd, CoverageFilename);
3435 CoverageFilename.swap(Pwd);
3436 }
3437 }
3438 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3439 }
3440 }
3441}
3442
Paul Robinsond083b9a2015-12-16 17:25:27 +00003443static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3444 ArgStringList &CmdArgs) {
3445 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3446 false) ||
3447 Args.hasFlag(options::OPT_fprofile_generate,
3448 options::OPT_fno_profile_instr_generate, false) ||
3449 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3450 options::OPT_fno_profile_instr_generate, false) ||
3451 Args.hasFlag(options::OPT_fprofile_instr_generate,
3452 options::OPT_fno_profile_instr_generate, false) ||
3453 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3454 options::OPT_fno_profile_instr_generate, false) ||
3455 Args.hasArg(options::OPT_fcreate_profile) ||
3456 Args.hasArg(options::OPT_coverage)))
3457 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3458}
3459
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003460/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3461/// smooshes them together with platform defaults, to decide whether
3462/// this compile should be using PIC mode or not. Returns a tuple of
3463/// (RelocationModel, PICLevel, IsPIE).
3464static std::tuple<llvm::Reloc::Model, unsigned, bool>
3465ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3466 const ArgList &Args) {
3467 // FIXME: why does this code...and so much everywhere else, use both
3468 // ToolChain.getTriple() and Triple?
3469 bool PIE = ToolChain.isPIEDefault();
3470 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003471 // The Darwin/MachO default to use PIC does not apply when using -static.
3472 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3473 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003474 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003475 bool IsPICLevelTwo = PIC;
3476
3477 bool KernelOrKext =
3478 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3479
3480 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003481 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003482 switch (ToolChain.getArch()) {
3483 case llvm::Triple::arm:
3484 case llvm::Triple::armeb:
3485 case llvm::Triple::thumb:
3486 case llvm::Triple::thumbeb:
3487 case llvm::Triple::aarch64:
3488 case llvm::Triple::mips:
3489 case llvm::Triple::mipsel:
3490 case llvm::Triple::mips64:
3491 case llvm::Triple::mips64el:
3492 PIC = true; // "-fpic"
3493 break;
3494
3495 case llvm::Triple::x86:
3496 case llvm::Triple::x86_64:
3497 PIC = true; // "-fPIC"
3498 IsPICLevelTwo = true;
3499 break;
3500
3501 default:
3502 break;
3503 }
3504 }
3505
3506 // OpenBSD-specific defaults for PIE
3507 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3508 switch (ToolChain.getArch()) {
3509 case llvm::Triple::mips64:
3510 case llvm::Triple::mips64el:
3511 case llvm::Triple::sparcel:
3512 case llvm::Triple::x86:
3513 case llvm::Triple::x86_64:
3514 IsPICLevelTwo = false; // "-fpie"
3515 break;
3516
3517 case llvm::Triple::ppc:
3518 case llvm::Triple::sparc:
3519 case llvm::Triple::sparcv9:
3520 IsPICLevelTwo = true; // "-fPIE"
3521 break;
3522
3523 default:
3524 break;
3525 }
3526 }
3527
3528 // The last argument relating to either PIC or PIE wins, and no
3529 // other argument is used. If the last argument is any flavor of the
3530 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3531 // option implicitly enables PIC at the same level.
3532 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3533 options::OPT_fpic, options::OPT_fno_pic,
3534 options::OPT_fPIE, options::OPT_fno_PIE,
3535 options::OPT_fpie, options::OPT_fno_pie);
3536 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3537 // is forced, then neither PIC nor PIE flags will have no effect.
3538 if (!ToolChain.isPICDefaultForced()) {
3539 if (LastPICArg) {
3540 Option O = LastPICArg->getOption();
3541 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3542 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3543 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3544 PIC =
3545 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3546 IsPICLevelTwo =
3547 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3548 } else {
3549 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003550 if (Triple.isPS4CPU()) {
3551 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3552 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3553 if (Model != "kernel") {
3554 PIC = true;
3555 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3556 << LastPICArg->getSpelling();
3557 }
3558 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003559 }
3560 }
3561 }
3562
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003563 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3564 // PIC level would've been set to level 1, force it back to level 2 PIC
3565 // instead.
3566 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003567 IsPICLevelTwo |= ToolChain.isPICDefault();
3568
James Y Knightc4015d32015-08-21 04:14:55 +00003569 // This kernel flags are a trump-card: they will disable PIC/PIE
3570 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003571 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3572 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003573 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003574
3575 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3576 // This is a very special mode. It trumps the other modes, almost no one
3577 // uses it, and it isn't even valid on any OS but Darwin.
3578 if (!ToolChain.getTriple().isOSDarwin())
3579 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3580 << A->getSpelling() << ToolChain.getTriple().str();
3581
3582 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3583
3584 // Only a forced PIC mode can cause the actual compile to have PIC defines
3585 // etc., no flags are sufficient. This behavior was selected to closely
3586 // match that of llvm-gcc and Apple GCC before that.
3587 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3588
3589 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3590 }
3591
3592 if (PIC)
3593 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3594
3595 return std::make_tuple(llvm::Reloc::Static, 0, false);
3596}
3597
3598static const char *RelocationModelName(llvm::Reloc::Model Model) {
3599 switch (Model) {
3600 case llvm::Reloc::Default:
3601 return nullptr;
3602 case llvm::Reloc::Static:
3603 return "static";
3604 case llvm::Reloc::PIC_:
3605 return "pic";
3606 case llvm::Reloc::DynamicNoPIC:
3607 return "dynamic-no-pic";
3608 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003609 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003610}
3611
3612static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3613 ArgStringList &CmdArgs) {
3614 llvm::Reloc::Model RelocationModel;
3615 unsigned PICLevel;
3616 bool IsPIE;
3617 std::tie(RelocationModel, PICLevel, IsPIE) =
3618 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3619
3620 if (RelocationModel != llvm::Reloc::Static)
3621 CmdArgs.push_back("-KPIC");
3622}
3623
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003624void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003625 const InputInfo &Output, const InputInfoList &Inputs,
3626 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003627 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3628 const llvm::Triple Triple(TripleStr);
3629
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003630 bool KernelOrKext =
3631 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003632 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003633 ArgStringList CmdArgs;
3634
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003635 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003636 bool IsWindowsCygnus =
3637 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003638 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003639 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003640
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003641 // Check number of inputs for sanity. We need at least one input.
3642 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003643 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003644 // CUDA compilation may have multiple inputs (source file + results of
3645 // device-side compilations). All other jobs are expected to have exactly one
3646 // input.
3647 bool IsCuda = types::isCuda(Input.getType());
3648 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003649
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003650 // Invoke ourselves in -cc1 mode.
3651 //
3652 // FIXME: Implement custom jobs for internal actions.
3653 CmdArgs.push_back("-cc1");
3654
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003655 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003656 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003657 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003658
Artem Belevichfa11ab52015-11-17 22:28:46 +00003659 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003660 if (IsCuda) {
3661 // FIXME: We need a (better) way to pass information about
3662 // particular compilation pass we're constructing here. For now we
3663 // can check which toolchain we're using and pick the other one to
3664 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003665 if (&getToolChain() == C.getCudaDeviceToolChain())
3666 AuxToolChain = C.getCudaHostToolChain();
3667 else if (&getToolChain() == C.getCudaHostToolChain())
3668 AuxToolChain = C.getCudaDeviceToolChain();
3669 else
3670 llvm_unreachable("Can't figure out CUDA compilation mode.");
3671 assert(AuxToolChain != nullptr && "No aux toolchain.");
3672 CmdArgs.push_back("-aux-triple");
3673 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3674 }
3675
James Y Knight2db38f32015-08-15 03:45:25 +00003676 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3677 Triple.getArch() == llvm::Triple::thumb)) {
3678 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003679 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003680 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003681 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003682 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003683 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003684 }
3685
Tim Northover336f1892014-03-29 13:16:12 +00003686 // Push all default warning arguments that are specific to
3687 // the given target. These come before user provided warning options
3688 // are provided.
3689 getToolChain().addClangWarningOptions(CmdArgs);
3690
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003691 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003692 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003693
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003694 if (isa<AnalyzeJobAction>(JA)) {
3695 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3696 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003697 } else if (isa<MigrateJobAction>(JA)) {
3698 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003699 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003700 if (Output.getType() == types::TY_Dependencies)
3701 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003702 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003703 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003704 if (Args.hasArg(options::OPT_rewrite_objc) &&
3705 !Args.hasArg(options::OPT_g_Group))
3706 CmdArgs.push_back("-P");
3707 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003708 } else if (isa<AssembleJobAction>(JA)) {
3709 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003710
David Blaikie9260ed62013-07-25 21:19:01 +00003711 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003712
3713 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003714 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003715 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003716 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003717 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003718
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003719 if (JA.getType() == types::TY_Nothing)
3720 CmdArgs.push_back("-fsyntax-only");
3721 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003722 CmdArgs.push_back("-emit-pch");
3723 else
3724 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003725 } else if (isa<VerifyPCHJobAction>(JA)) {
3726 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003727 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003728 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3729 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003730 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003731 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003732 } else if (JA.getType() == types::TY_LLVM_IR ||
3733 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003734 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003735 } else if (JA.getType() == types::TY_LLVM_BC ||
3736 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003737 CmdArgs.push_back("-emit-llvm-bc");
3738 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003739 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003740 } else if (JA.getType() == types::TY_AST) {
3741 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003742 } else if (JA.getType() == types::TY_ModuleFile) {
3743 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003744 } else if (JA.getType() == types::TY_RewrittenObjC) {
3745 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003746 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003747 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3748 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003749 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003750 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003751 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003752 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003753
3754 // Preserve use-list order by default when emitting bitcode, so that
3755 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3756 // same result as running passes here. For LTO, we don't need to preserve
3757 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003758 if (JA.getType() == types::TY_LLVM_BC)
3759 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003760
3761 if (D.isUsingLTO())
3762 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003763 }
3764
Teresa Johnsonaff22322015-12-07 19:21:34 +00003765 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3766 if (!types::isLLVMIR(Input.getType()))
3767 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3768 << "-x ir";
3769 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3770 }
3771
Steven Wu574b0f22016-03-01 01:07:58 +00003772 // Embed-bitcode option.
3773 if (C.getDriver().embedBitcodeEnabled() &&
3774 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3775 // Add flags implied by -fembed-bitcode.
Steven Wu27fb5222016-05-11 16:26:03 +00003776 Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ);
Steven Wu574b0f22016-03-01 01:07:58 +00003777 // Disable all llvm IR level optimizations.
3778 CmdArgs.push_back("-disable-llvm-optzns");
3779 }
3780 if (C.getDriver().embedBitcodeMarkerOnly())
Steven Wu27fb5222016-05-11 16:26:03 +00003781 CmdArgs.push_back("-fembed-bitcode=marker");
Steven Wu574b0f22016-03-01 01:07:58 +00003782
Justin Bognera88f0122014-06-20 22:59:50 +00003783 // We normally speed up the clang process a bit by skipping destructors at
3784 // exit, but when we're generating diagnostics we can rely on some of the
3785 // cleanup.
3786 if (!C.isForDiagnostics())
3787 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003788
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003789// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003790#ifdef NDEBUG
3791 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003792 // Discard LLVM value names in -asserts builds.
3793 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003794#endif
3795
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003796 // Set the main file name, so that debug info works even with
3797 // -save-temps.
3798 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003799 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003800
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003801 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003802 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003803 if (Args.hasArg(options::OPT_static))
3804 CmdArgs.push_back("-static-define");
3805
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003806 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003807 // Enable region store model by default.
3808 CmdArgs.push_back("-analyzer-store=region");
3809
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003810 // Treat blocks as analysis entry points.
3811 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3812
Ted Kremenek49c79792011-03-24 00:28:47 +00003813 CmdArgs.push_back("-analyzer-eagerly-assume");
3814
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003815 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003816 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003817 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003818
Devin Coughlin65c77082016-01-21 20:09:49 +00003819 if (!IsWindowsMSVC) {
3820 CmdArgs.push_back("-analyzer-checker=unix");
3821 } else {
3822 // Enable "unix" checkers that also work on Windows.
3823 CmdArgs.push_back("-analyzer-checker=unix.API");
3824 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3825 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3826 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3827 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3828 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3829 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003830
Sean Evesonb38c32b2016-01-06 10:03:58 +00003831 // Disable some unix checkers for PS4.
3832 if (IsPS4CPU) {
3833 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3834 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3835 }
3836
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003837 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003838 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003840 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003841
Artem Belevichba558952015-05-06 18:20:23 +00003842 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003843 CmdArgs.push_back("-analyzer-checker=cplusplus");
3844
Sean Evesonb38c32b2016-01-06 10:03:58 +00003845 if (!IsPS4CPU) {
3846 CmdArgs.push_back(
3847 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3848 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3849 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3850 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3851 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3852 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3853 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003854
3855 // Default nullability checks.
3856 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3857 CmdArgs.push_back(
3858 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003859 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003860
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003861 // Set the output format. The default is plist, for (lame) historical
3862 // reasons.
3863 CmdArgs.push_back("-analyzer-output");
3864 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003865 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003866 else
3867 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003868
Ted Kremenekfe449a22010-03-22 22:32:05 +00003869 // Disable the presentation of standard compiler warnings when
3870 // using --analyze. We only want to show static analyzer diagnostics
3871 // or frontend errors.
3872 CmdArgs.push_back("-w");
3873
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003874 // Add -Xanalyzer arguments when running as analyzer.
3875 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003876 }
3877
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003878 CheckCodeGenerationOptions(D, Args);
3879
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003880 llvm::Reloc::Model RelocationModel;
3881 unsigned PICLevel;
3882 bool IsPIE;
3883 std::tie(RelocationModel, PICLevel, IsPIE) =
3884 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003885
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003886 const char *RMName = RelocationModelName(RelocationModel);
3887 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003888 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003889 CmdArgs.push_back(RMName);
3890 }
3891 if (PICLevel > 0) {
3892 CmdArgs.push_back("-pic-level");
3893 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3894 if (IsPIE) {
3895 CmdArgs.push_back("-pie-level");
3896 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003897 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003898 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003899
Renato Golin4854d802015-11-09 12:40:41 +00003900 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3901 CmdArgs.push_back("-meabi");
3902 CmdArgs.push_back(A->getValue());
3903 }
3904
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003905 CmdArgs.push_back("-mthread-model");
3906 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3907 CmdArgs.push_back(A->getValue());
3908 else
3909 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3910
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003911 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3912
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003913 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3914 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003915 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003916
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003917 // LLVM Code Generator Options.
3918
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003919 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3920 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003921 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3922 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003923 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003924 CmdArgs.push_back(A->getValue());
3925 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003926 }
3927 }
3928
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003929 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3930 StringRef v = A->getValue();
3931 CmdArgs.push_back("-mllvm");
3932 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3933 A->claim();
3934 }
3935
Nirav Daved2f44d82016-04-05 17:50:43 +00003936 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3937 true))
3938 CmdArgs.push_back("-fno-jump-tables");
3939
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003940 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3941 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003942 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003943 }
3944
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003945 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3946 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003947 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003948 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003949 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003950 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3951 CmdArgs.push_back("-fpcc-struct-return");
3952 } else {
3953 assert(A->getOption().matches(options::OPT_freg_struct_return));
3954 CmdArgs.push_back("-freg-struct-return");
3955 }
3956 }
3957
Roman Divacky65b88cd2011-03-01 17:40:53 +00003958 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3959 CmdArgs.push_back("-mrtd");
3960
Rafael Espindola224dd632011-12-14 21:02:23 +00003961 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003962 CmdArgs.push_back("-mdisable-fp-elim");
3963 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3964 options::OPT_fno_zero_initialized_in_bss))
3965 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003966
3967 bool OFastEnabled = isOptimizationLevelFast(Args);
3968 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3969 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003970 OptSpecifier StrictAliasingAliasOption =
3971 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003972 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3973 // doesn't do any TBAA.
3974 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003975 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003976 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003977 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003978 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3979 options::OPT_fno_struct_path_tbaa))
3980 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003981 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3982 false))
3983 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003984 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3985 options::OPT_fno_strict_vtable_pointers,
3986 false))
3987 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003988 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3989 options::OPT_fno_optimize_sibling_calls))
3990 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003991
Eric Christopher006208c2013-04-04 06:29:47 +00003992 // Handle segmented stacks.
3993 if (Args.hasArg(options::OPT_fsplit_stack))
3994 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003995
3996 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3997 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003998 OptSpecifier FastMathAliasOption =
3999 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
4000
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004001 // Handle various floating point optimization flags, mapping them to the
4002 // appropriate LLVM code generation flags. The pattern for all of these is to
4003 // default off the codegen optimizations, and if any flag enables them and no
4004 // flag disables them after the flag enabling them, enable the codegen
4005 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004006 if (Arg *A = Args.getLastArg(
4007 options::OPT_ffast_math, FastMathAliasOption,
4008 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4009 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4010 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004011 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4012 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004013 A->getOption().getID() != options::OPT_fhonor_infinities)
4014 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004015 if (Arg *A = Args.getLastArg(
4016 options::OPT_ffast_math, FastMathAliasOption,
4017 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4018 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4019 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004020 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4021 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004022 A->getOption().getID() != options::OPT_fhonor_nans)
4023 CmdArgs.push_back("-menable-no-nans");
4024
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004025 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4026 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004027 if (Arg *A =
4028 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4029 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4030 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004031 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4032 // However, turning *off* -ffast_math merely restores the toolchain default
4033 // (which may be false).
4034 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4035 A->getOption().getID() == options::OPT_ffast_math ||
4036 A->getOption().getID() == options::OPT_Ofast)
4037 MathErrno = false;
4038 else if (A->getOption().getID() == options::OPT_fmath_errno)
4039 MathErrno = true;
4040 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004041 if (MathErrno)
4042 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004043
4044 // There are several flags which require disabling very specific
4045 // optimizations. Any of these being disabled forces us to turn off the
4046 // entire set of LLVM optimizations, so collect them through all the flag
4047 // madness.
4048 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004049 if (Arg *A = Args.getLastArg(
4050 options::OPT_ffast_math, FastMathAliasOption,
4051 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4052 options::OPT_fno_unsafe_math_optimizations,
4053 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004054 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4055 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004056 A->getOption().getID() != options::OPT_fno_associative_math)
4057 AssociativeMath = true;
4058 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004059 if (Arg *A = Args.getLastArg(
4060 options::OPT_ffast_math, FastMathAliasOption,
4061 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4062 options::OPT_fno_unsafe_math_optimizations,
4063 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004064 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4065 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004066 A->getOption().getID() != options::OPT_fno_reciprocal_math)
4067 ReciprocalMath = true;
4068 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004069 if (Arg *A = Args.getLastArg(
4070 options::OPT_ffast_math, FastMathAliasOption,
4071 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4072 options::OPT_fno_unsafe_math_optimizations,
4073 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004074 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4075 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004076 A->getOption().getID() != options::OPT_fsigned_zeros)
4077 SignedZeros = false;
4078 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004079 if (Arg *A = Args.getLastArg(
4080 options::OPT_ffast_math, FastMathAliasOption,
4081 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4082 options::OPT_fno_unsafe_math_optimizations,
4083 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004084 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4085 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004086 A->getOption().getID() != options::OPT_ftrapping_math)
4087 TrappingMath = false;
4088 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4089 !TrappingMath)
4090 CmdArgs.push_back("-menable-unsafe-fp-math");
4091
Sanjay Patel76c9e092015-01-23 16:40:50 +00004092 if (!SignedZeros)
4093 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004094
Sanjay Patel359b1052015-04-09 15:03:23 +00004095 if (ReciprocalMath)
4096 CmdArgs.push_back("-freciprocal-math");
4097
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004098 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004099 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004100 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004101 options::OPT_ffp_contract)) {
4102 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004103 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004104 if (Val == "fast" || Val == "on" || Val == "off") {
4105 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4106 } else {
4107 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004108 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004109 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004110 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4111 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004112 // If fast-math is set then set the fp-contract mode to fast.
4113 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4114 }
4115 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004116
Sanjay Patel2987c292015-06-11 14:53:41 +00004117 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004118
Bob Wilson6a039162012-07-19 03:52:53 +00004119 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4120 // and if we find them, tell the frontend to provide the appropriate
4121 // preprocessor macros. This is distinct from enabling any optimizations as
4122 // these options induce language changes which must survive serialization
4123 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004124 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4125 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004126 if (!A->getOption().matches(options::OPT_fno_fast_math))
4127 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004128 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4129 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004130 if (A->getOption().matches(options::OPT_ffinite_math_only))
4131 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004132
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004133 // Decide whether to use verbose asm. Verbose assembly is the default on
4134 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004135 bool IsIntegratedAssemblerDefault =
4136 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004137 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004138 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004139 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004140 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004141
Rafael Espindolab8a12932015-05-22 20:44:03 +00004142 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4143 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004144 CmdArgs.push_back("-no-integrated-as");
4145
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004146 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4147 CmdArgs.push_back("-mdebug-pass");
4148 CmdArgs.push_back("Structure");
4149 }
4150 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4151 CmdArgs.push_back("-mdebug-pass");
4152 CmdArgs.push_back("Arguments");
4153 }
4154
Justin Lebar710a35f2016-01-25 22:36:35 +00004155 // Enable -mconstructor-aliases except on darwin, where we have to work around
4156 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4157 // aliases aren't supported.
4158 if (!getToolChain().getTriple().isOSDarwin() &&
4159 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004160 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004161
John McCall7ef5cb32011-03-18 02:56:14 +00004162 // Darwin's kernel doesn't support guard variables; just die if we
4163 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004164 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004165 CmdArgs.push_back("-fforbid-guard-variables");
4166
Akira Hatanaka02028482015-11-12 17:21:22 +00004167 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4168 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004169 CmdArgs.push_back("-mms-bitfields");
4170 }
John McCall8517abc2010-02-19 02:45:38 +00004171
Daniel Dunbar306945d2009-09-16 06:17:29 +00004172 // This is a coarse approximation of what llvm-gcc actually does, both
4173 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4174 // complicated ways.
4175 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004176 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4177 options::OPT_fno_asynchronous_unwind_tables,
4178 (getToolChain().IsUnwindTablesDefault() ||
4179 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4180 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004181 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4182 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004183 CmdArgs.push_back("-munwind-tables");
4184
Chandler Carruth05fb5852012-11-21 23:40:23 +00004185 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004186
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004187 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4188 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004189 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004190 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004191
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004192 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004193 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004194
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004195 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004196 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004197 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004198 }
4199
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004200 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004201 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004202 if (!CPU.empty()) {
4203 CmdArgs.push_back("-target-cpu");
4204 CmdArgs.push_back(Args.MakeArgString(CPU));
4205 }
4206
Rafael Espindolaeb265472013-08-21 21:59:03 +00004207 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4208 CmdArgs.push_back("-mfpmath");
4209 CmdArgs.push_back(A->getValue());
4210 }
4211
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004212 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004213 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004214
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004215 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004216 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004217 default:
4218 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004219
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004220 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004221 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004222 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004223 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004224 // Use the effective triple, which takes into account the deployment target.
4225 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004226 break;
4227
Tim Northover573cbee2014-05-24 12:52:07 +00004228 case llvm::Triple::aarch64:
4229 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004230 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004231 break;
4232
Eric Christopher0b26a612010-03-02 02:41:08 +00004233 case llvm::Triple::mips:
4234 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004235 case llvm::Triple::mips64:
4236 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004237 AddMIPSTargetArgs(Args, CmdArgs);
4238 break;
4239
Ulrich Weigand8afad612014-07-28 13:17:52 +00004240 case llvm::Triple::ppc:
4241 case llvm::Triple::ppc64:
4242 case llvm::Triple::ppc64le:
4243 AddPPCTargetArgs(Args, CmdArgs);
4244 break;
4245
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004246 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004247 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004248 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004249 AddSparcTargetArgs(Args, CmdArgs);
4250 break;
4251
Marcin Koscielnickib31ee6d2016-05-04 23:37:40 +00004252 case llvm::Triple::systemz:
4253 AddSystemZTargetArgs(Args, CmdArgs);
4254 break;
4255
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004256 case llvm::Triple::x86:
4257 case llvm::Triple::x86_64:
4258 AddX86TargetArgs(Args, CmdArgs);
4259 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004260
Jacques Pienaard964cc22016-03-28 21:02:54 +00004261 case llvm::Triple::lanai:
4262 AddLanaiTargetArgs(Args, CmdArgs);
4263 break;
4264
Tony Linthicum76329bf2011-12-12 21:14:55 +00004265 case llvm::Triple::hexagon:
4266 AddHexagonTargetArgs(Args, CmdArgs);
4267 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004268
4269 case llvm::Triple::wasm32:
4270 case llvm::Triple::wasm64:
4271 AddWebAssemblyTargetArgs(Args, CmdArgs);
4272 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004273 }
4274
Douglas Katzman3459ce22015-10-08 04:24:12 +00004275 // The 'g' groups options involve a somewhat intricate sequence of decisions
4276 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004277 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004278 // * what level of debug info to generate
4279 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004280 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004281 // This avoids having to monkey around further in cc1 other than to disable
4282 // codeview if not running in a Windows environment. Perhaps even that
4283 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004284 unsigned DwarfVersion = 0;
4285 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4286 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004287 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004288 bool EmitCodeView = false;
4289
Hans Wennborg75958c42013-08-08 00:17:41 +00004290 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004291 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004292 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004293 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004294
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004295 // Pass the linker version in use.
4296 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4297 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004298 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004299 }
4300
Eric Christopherb7d97e92013-04-03 01:58:53 +00004301 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004302 CmdArgs.push_back("-momit-leaf-frame-pointer");
4303
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004304 // Explicitly error on some things we know we don't support and can't just
4305 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004306 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4307 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004308 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004309 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004310 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4311 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004312 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004313 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004314 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004315 }
4316
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004317 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004318 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004319 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004320 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004321 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4322 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004323 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004324 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004325 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004326
Chad Rosierbe10f982011-08-02 17:58:04 +00004327 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004328 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004329 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4330 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004331 }
4332
Rafael Espindola08a692a2010-03-07 04:46:18 +00004333 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004334 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004335 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004336 // If the last option explicitly specified a debug-info level, use it.
4337 if (A->getOption().matches(options::OPT_gN_Group)) {
4338 DebugInfoKind = DebugLevelToInfoKind(*A);
4339 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4340 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4341 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004342 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004343 A->getIndex() > SplitDwarfArg->getIndex())
4344 SplitDwarfArg = nullptr;
4345 } else
4346 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004347 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004348 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004349
Paul Robinson0334a042015-12-19 19:41:48 +00004350 // If a debugger tuning argument appeared, remember it.
4351 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4352 options::OPT_ggdbN_Group)) {
4353 if (A->getOption().matches(options::OPT_glldb))
4354 DebuggerTuning = llvm::DebuggerKind::LLDB;
4355 else if (A->getOption().matches(options::OPT_gsce))
4356 DebuggerTuning = llvm::DebuggerKind::SCE;
4357 else
4358 DebuggerTuning = llvm::DebuggerKind::GDB;
4359 }
4360
4361 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004362 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004363 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004364 DwarfVersion = DwarfVersionNum(A->getSpelling());
4365
Reid Kleckner124955a2015-08-05 18:51:13 +00004366 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004367 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4368 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4369 // DwarfVersion remains at 0 if no explicit choice was made.
4370 CmdArgs.push_back("-gcodeview");
4371 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004372 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004373 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4374 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004375
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004376 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4377 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004378
4379 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004380 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004381 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004382 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004383
Eric Christopher138c32b2013-09-13 22:37:55 +00004384 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004385 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004386 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004387 CmdArgs.push_back("-dwarf-ext-refs");
4388 CmdArgs.push_back("-fmodule-format=obj");
4389 }
4390
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004391 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4392 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004393 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004394 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004395 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004396 CmdArgs.push_back("-backend-option");
4397 CmdArgs.push_back("-split-dwarf=Enable");
4398 }
4399
Douglas Katzman3459ce22015-10-08 04:24:12 +00004400 // After we've dealt with all combinations of things that could
4401 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4402 // figure out if we need to "upgrade" it to standalone debug info.
4403 // We parse these two '-f' options whether or not they will be used,
4404 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4405 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4406 options::OPT_fno_standalone_debug,
4407 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004408 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4409 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004410 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4411 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004412
Eric Christopher138c32b2013-09-13 22:37:55 +00004413 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4414 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4415 CmdArgs.push_back("-backend-option");
4416 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4417 }
Eric Christophereec89c22013-06-18 00:03:50 +00004418
Eric Christopher0d403d22014-02-14 01:27:03 +00004419 // -gdwarf-aranges turns on the emission of the aranges section in the
4420 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004421 // Always enabled on the PS4.
4422 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004423 CmdArgs.push_back("-backend-option");
4424 CmdArgs.push_back("-generate-arange-section");
4425 }
4426
David Blaikief36d9ba2014-01-27 18:52:43 +00004427 if (Args.hasFlag(options::OPT_fdebug_types_section,
4428 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004429 CmdArgs.push_back("-backend-option");
4430 CmdArgs.push_back("-generate-type-units");
4431 }
Eric Christophereec89c22013-06-18 00:03:50 +00004432
Dan Gohmana5b804b2016-01-07 00:50:27 +00004433 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4434 // default.
4435 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4436 Triple.getArch() == llvm::Triple::wasm32 ||
4437 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004438
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004439 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004440 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004441 CmdArgs.push_back("-ffunction-sections");
4442 }
4443
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004444 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4445 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004446 CmdArgs.push_back("-fdata-sections");
4447 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004448
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004449 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004450 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004451 CmdArgs.push_back("-fno-unique-section-names");
4452
Chris Lattner3c77a352010-06-22 00:03:40 +00004453 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4454
Diego Novilloa0545962015-07-10 18:00:07 +00004455 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004456
Paul Robinsond083b9a2015-12-16 17:25:27 +00004457 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4458 if (getToolChain().getTriple().isPS4CPU())
4459 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4460
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004461 // Pass options for controlling the default header search paths.
4462 if (Args.hasArg(options::OPT_nostdinc)) {
4463 CmdArgs.push_back("-nostdsysteminc");
4464 CmdArgs.push_back("-nobuiltininc");
4465 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004466 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004467 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004468 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4469 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4470 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004471
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004472 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004473 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004474 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004475
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004476 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4477
Ted Kremenekf7639e12012-03-06 20:06:33 +00004478 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004479 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004480 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004481 options::OPT_ccc_arcmt_modify,
4482 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004483 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004484 switch (A->getOption().getID()) {
4485 default:
4486 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004487 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004488 CmdArgs.push_back("-arcmt-check");
4489 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004490 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004491 CmdArgs.push_back("-arcmt-modify");
4492 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004493 case options::OPT_ccc_arcmt_migrate:
4494 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004495 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004496 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004497
4498 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4499 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004500 break;
John McCalld70fb982011-06-15 23:25:17 +00004501 }
4502 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004503 } else {
4504 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4505 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4506 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004507 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004508
Ted Kremenekf7639e12012-03-06 20:06:33 +00004509 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4510 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004511 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4512 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004513 }
4514 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004515 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004516
4517 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004518 options::OPT_objcmt_migrate_subscripting,
4519 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004520 // None specified, means enable them all.
4521 CmdArgs.push_back("-objcmt-migrate-literals");
4522 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004523 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004524 } else {
4525 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4526 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004527 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004528 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004529 } else {
4530 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4531 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4532 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4533 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4534 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4535 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004536 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4540 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4541 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004546 }
4547
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004548 // Add preprocessing options like -I, -D, etc. if we are using the
4549 // preprocessor.
4550 //
4551 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004552 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004553 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4554 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004555
Rafael Espindolaa7431922011-07-21 23:40:37 +00004556 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4557 // that "The compiler can only warn and ignore the option if not recognized".
4558 // When building with ccache, it will pass -D options to clang even on
4559 // preprocessed inputs and configure concludes that -fPIC is not supported.
4560 Args.ClaimAllArgs(options::OPT_D);
4561
Alp Toker7874bdc2013-11-15 20:40:58 +00004562 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004563 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4564 if (A->getOption().matches(options::OPT_O4)) {
4565 CmdArgs.push_back("-O3");
4566 D.Diag(diag::warn_O4_is_O3);
4567 } else {
4568 A->render(Args, CmdArgs);
4569 }
4570 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004571
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004572 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004573 for (const Arg *A :
4574 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4575 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004576 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004577 }
4578
Rafael Espindola577637a2015-01-03 00:06:04 +00004579 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004580
Richard Smith3be1cb22014-08-07 00:24:21 +00004581 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004582 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004583 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4584 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004585 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004586 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004587
4588 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004589 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004590 //
4591 // If a std is supplied, only add -trigraphs if it follows the
4592 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004593 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004594 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4595 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004596 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004597 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004598 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004599 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004600 else
4601 Std->render(Args, CmdArgs);
4602
Nico Weber00721502014-12-23 22:32:37 +00004603 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004604 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004605 options::OPT_ftrigraphs,
4606 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004607 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004608 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004609 } else {
4610 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004611 //
4612 // FIXME: Clang doesn't correctly handle -std= when the input language
4613 // doesn't match. For the time being just ignore this for C++ inputs;
4614 // eventually we want to do all the standard defaulting here instead of
4615 // splitting it between the driver and clang -cc1.
4616 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004617 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4618 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004619 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004620 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004621
Nico Weber00721502014-12-23 22:32:37 +00004622 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4623 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004624 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004625
Richard Smith282b4492013-09-04 22:50:31 +00004626 // GCC's behavior for -Wwrite-strings is a bit strange:
4627 // * In C, this "warning flag" changes the types of string literals from
4628 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4629 // for the discarded qualifier.
4630 // * In C++, this is just a normal warning flag.
4631 //
4632 // Implementing this warning correctly in C is hard, so we follow GCC's
4633 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4634 // a non-const char* in C, rather than using this crude hack.
4635 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004636 // FIXME: This should behave just like a warning flag, and thus should also
4637 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4638 Arg *WriteStrings =
4639 Args.getLastArg(options::OPT_Wwrite_strings,
4640 options::OPT_Wno_write_strings, options::OPT_w);
4641 if (WriteStrings &&
4642 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004643 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004644 }
4645
Chandler Carruth61fbf622011-04-23 09:27:53 +00004646 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004647 // during C++ compilation, which it is by default. GCC keeps this define even
4648 // in the presence of '-w', match this behavior bug-for-bug.
4649 if (types::isCXX(InputType) &&
4650 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4651 true)) {
4652 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004653 }
4654
Chandler Carruthe0391482010-05-22 02:21:53 +00004655 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4656 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4657 if (Asm->getOption().matches(options::OPT_fasm))
4658 CmdArgs.push_back("-fgnu-keywords");
4659 else
4660 CmdArgs.push_back("-fno-gnu-keywords");
4661 }
4662
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004663 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4664 CmdArgs.push_back("-fno-dwarf-directory-asm");
4665
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004666 if (ShouldDisableAutolink(Args, getToolChain()))
4667 CmdArgs.push_back("-fno-autolink");
4668
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004669 // Add in -fdebug-compilation-dir if necessary.
4670 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004671
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004672 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4673 StringRef Map = A->getValue();
4674 if (Map.find('=') == StringRef::npos)
4675 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4676 else
4677 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4678 A->claim();
4679 }
4680
Richard Smith9a568822011-11-21 19:36:32 +00004681 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4682 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004683 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004684 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004685 }
4686
Richard Smith79c927b2013-11-06 19:31:51 +00004687 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4688 CmdArgs.push_back("-foperator-arrow-depth");
4689 CmdArgs.push_back(A->getValue());
4690 }
4691
Richard Smith9a568822011-11-21 19:36:32 +00004692 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4693 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004694 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004695 }
4696
Richard Smitha3d3bd22013-05-08 02:12:03 +00004697 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4698 CmdArgs.push_back("-fconstexpr-steps");
4699 CmdArgs.push_back(A->getValue());
4700 }
4701
Richard Smithb3a14522013-02-22 01:59:51 +00004702 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4703 CmdArgs.push_back("-fbracket-depth");
4704 CmdArgs.push_back(A->getValue());
4705 }
4706
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004707 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4708 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004709 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004710 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004711 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4712 } else
4713 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004714 }
4715
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004716 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004717 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004718
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004719 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4720 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004721 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004722 }
David Chisnall5778fce2009-08-31 16:41:57 +00004723
Chris Lattnere23003d2010-01-09 21:54:33 +00004724 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4725 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004726 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004727 }
4728
Chris Lattnerb35583d2010-04-07 20:49:23 +00004729 CmdArgs.push_back("-ferror-limit");
4730 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004731 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004732 else
4733 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004734
Chandler Carrutha77a7272010-05-06 04:55:18 +00004735 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4736 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004737 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004738 }
4739
4740 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4741 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004742 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004743 }
4744
Richard Smithf6f003a2011-12-16 19:06:07 +00004745 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4746 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004747 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004748 }
4749
Nick Lewycky24653262014-12-16 21:39:02 +00004750 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4751 CmdArgs.push_back("-fspell-checking-limit");
4752 CmdArgs.push_back(A->getValue());
4753 }
4754
Daniel Dunbar2c978472009-11-04 06:24:47 +00004755 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004756 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004757 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004758 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004759 } else {
4760 // If -fmessage-length=N was not specified, determine whether this is a
4761 // terminal and, if so, implicitly define -fmessage-length appropriately.
4762 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004763 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004764 }
4765
John McCallb4a99d32013-02-19 01:57:35 +00004766 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4767 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4768 options::OPT_fvisibility_ms_compat)) {
4769 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4770 CmdArgs.push_back("-fvisibility");
4771 CmdArgs.push_back(A->getValue());
4772 } else {
4773 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4774 CmdArgs.push_back("-fvisibility");
4775 CmdArgs.push_back("hidden");
4776 CmdArgs.push_back("-ftype-visibility");
4777 CmdArgs.push_back("default");
4778 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004779 }
4780
Douglas Gregor08329632010-06-15 17:05:35 +00004781 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004782
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004783 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4784
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004785 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004786 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4787 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004788 CmdArgs.push_back("-ffreestanding");
4789
Daniel Dunbare357d562009-12-03 18:42:11 +00004790 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004791 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004792 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004793 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004794 // Emulated TLS is enabled by default on Android, and can be enabled manually
4795 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004796 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004797 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4798 EmulatedTLSDefault))
4799 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004800 // AltiVec-like language extensions aren't relevant for assembling.
4801 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004802 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004803 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4804 }
Richard Trieu91844232012-06-26 18:18:47 +00004805 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4806 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004807
Alexey Bataevdb390212015-05-20 04:24:19 +00004808 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004809 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4810 options::OPT_fno_openmp, false))
4811 switch (getOpenMPRuntime(getToolChain(), Args)) {
4812 case OMPRT_OMP:
4813 case OMPRT_IOMP5:
4814 // Clang can generate useful OpenMP code for these two runtime libraries.
4815 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004816
4817 // If no option regarding the use of TLS in OpenMP codegeneration is
4818 // given, decide a default based on the target. Otherwise rely on the
4819 // options and pass the right information to the frontend.
4820 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004821 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004822 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004823 break;
4824 default:
4825 // By default, if Clang doesn't know how to generate useful OpenMP code
4826 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4827 // down to the actual compilation.
4828 // FIXME: It would be better to have a mode which *only* omits IR
4829 // generation based on the OpenMP support so that we get consistent
4830 // semantic analysis, etc.
4831 break;
4832 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004833
Peter Collingbourne32701642013-11-01 18:16:25 +00004834 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004835 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004836
Eric Christopher459d2712013-02-19 06:16:53 +00004837 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004838 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4839 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4840 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4841 Arch == llvm::Triple::ppc64le))
4842 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4843 << "ppc/ppc64/ppc64le";
4844 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004845
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004846 // -fzvector is incompatible with -faltivec.
4847 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4848 if (Args.hasArg(options::OPT_faltivec))
4849 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4850 << "-faltivec";
4851
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004852 if (getToolChain().SupportsProfiling())
4853 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004854
4855 // -flax-vector-conversions is default.
4856 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4857 options::OPT_fno_lax_vector_conversions))
4858 CmdArgs.push_back("-fno-lax-vector-conversions");
4859
John Brawna7b4ec02015-08-10 11:11:28 +00004860 if (Args.getLastArg(options::OPT_fapple_kext) ||
4861 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004862 CmdArgs.push_back("-fapple-kext");
4863
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004864 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004865 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004866 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004867 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4868 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004869
4870 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4871 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004872 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004873 }
4874
Bob Wilson14adb362012-02-03 06:27:22 +00004875 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004876
Chandler Carruth6e501032011-03-27 00:04:55 +00004877 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4878 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004879 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004880 if (A->getOption().matches(options::OPT_fwrapv))
4881 CmdArgs.push_back("-fwrapv");
4882 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4883 options::OPT_fno_strict_overflow)) {
4884 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4885 CmdArgs.push_back("-fwrapv");
4886 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004887
4888 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4889 options::OPT_fno_reroll_loops))
4890 if (A->getOption().matches(options::OPT_freroll_loops))
4891 CmdArgs.push_back("-freroll-loops");
4892
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004893 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004894 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4895 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004896
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004897 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4898
Daniel Dunbar4930e332009-11-17 08:07:36 +00004899 // -stack-protector=0 is default.
4900 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004901 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4902 options::OPT_fstack_protector_all,
4903 options::OPT_fstack_protector_strong,
4904 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004905 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004906 StackProtectorLevel = std::max<unsigned>(
4907 LangOptions::SSPOn,
4908 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004909 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004910 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004911 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004912 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004913 } else {
4914 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004915 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004916 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004917 if (StackProtectorLevel) {
4918 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004919 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004920 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004921
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004922 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004923 for (const Arg *A : Args.filtered(options::OPT__param)) {
4924 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004925 if (Str.startswith("ssp-buffer-size=")) {
4926 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004927 CmdArgs.push_back("-stack-protector-buffer-size");
4928 // FIXME: Verify the argument is a valid integer.
4929 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004930 }
Sean Silva14facf32015-06-09 01:57:17 +00004931 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004932 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004933 }
4934
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004935 // Translate -mstackrealign
4936 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004937 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004938 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004939
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004940 if (Args.hasArg(options::OPT_mstack_alignment)) {
4941 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4942 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004943 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004944
Hans Wennborg77dc2362015-01-20 19:45:50 +00004945 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4946 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4947
4948 if (!Size.empty())
4949 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4950 else
4951 CmdArgs.push_back("-mstack-probe-size=0");
4952 }
4953
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004954 switch (getToolChain().getArch()) {
4955 case llvm::Triple::aarch64:
4956 case llvm::Triple::aarch64_be:
4957 case llvm::Triple::arm:
4958 case llvm::Triple::armeb:
4959 case llvm::Triple::thumb:
4960 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004961 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004962 break;
4963
4964 default:
4965 break;
4966 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004967
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004968 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4969 options::OPT_mno_restrict_it)) {
4970 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4971 CmdArgs.push_back("-backend-option");
4972 CmdArgs.push_back("-arm-restrict-it");
4973 } else {
4974 CmdArgs.push_back("-backend-option");
4975 CmdArgs.push_back("-arm-no-restrict-it");
4976 }
James Y Knight2db38f32015-08-15 03:45:25 +00004977 } else if (Triple.isOSWindows() &&
4978 (Triple.getArch() == llvm::Triple::arm ||
4979 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004980 // Windows on ARM expects restricted IT blocks
4981 CmdArgs.push_back("-backend-option");
4982 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004983 }
4984
Daniel Dunbard18049a2009-04-07 21:16:11 +00004985 // Forward -f options with positive and negative forms; we translate
4986 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004987 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4988 StringRef fname = A->getValue();
4989 if (!llvm::sys::fs::exists(fname))
4990 D.Diag(diag::err_drv_no_such_file) << fname;
4991 else
4992 A->render(Args, CmdArgs);
4993 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004994
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004995 // -fbuiltin is default unless -mkernel is used.
4996 bool UseBuiltins =
4997 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4998 !Args.hasArg(options::OPT_mkernel));
4999 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005000 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005001
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005002 // -ffreestanding implies -fno-builtin.
5003 if (Args.hasArg(options::OPT_ffreestanding))
5004 UseBuiltins = false;
5005
5006 // Process the -fno-builtin-* options.
5007 for (const auto &Arg : Args) {
5008 const Option &O = Arg->getOption();
5009 if (!O.matches(options::OPT_fno_builtin_))
5010 continue;
5011
5012 Arg->claim();
5013 // If -fno-builtin is specified, then there's no need to pass the option to
5014 // the frontend.
5015 if (!UseBuiltins)
5016 continue;
5017
5018 StringRef FuncName = Arg->getValue();
5019 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5020 }
5021
Nuno Lopes13c88c72009-12-16 16:59:22 +00005022 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5023 options::OPT_fno_assume_sane_operator_new))
5024 CmdArgs.push_back("-fno-assume-sane-operator-new");
5025
Daniel Dunbar4930e332009-11-17 08:07:36 +00005026 // -fblocks=0 is default.
5027 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005028 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005029 (Args.hasArg(options::OPT_fgnu_runtime) &&
5030 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5031 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005032 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005034 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005035 !getToolChain().hasBlocksRuntime())
5036 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005037 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005038
Richard Smith47972af2015-06-16 00:08:24 +00005039 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005040 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005041 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005042 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005043 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005044 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5045 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005046 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005047 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005048 HaveModules = true;
5049 }
5050 }
5051
Richard Smith47972af2015-06-16 00:08:24 +00005052 // -fmodule-maps enables implicit reading of module map files. By default,
5053 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005054 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5055 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005056 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005057 }
5058
Daniel Jasperac42b752013-10-21 06:34:34 +00005059 // -fmodules-decluse checks that modules used are declared so (off by
5060 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005061 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005062 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005063 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005064 }
5065
Daniel Jasper962b38e2014-04-11 11:47:45 +00005066 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5067 // all #included headers are part of modules.
5068 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005069 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005070 CmdArgs.push_back("-fmodules-strict-decluse");
5071 }
5072
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005073 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5074 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5075 options::OPT_fno_implicit_modules)) {
5076 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005077 } else if (HaveModules) {
5078 // -fmodule-cache-path specifies where our implicitly-built module files
5079 // should be written.
5080 SmallString<128> Path;
5081 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5082 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005083 if (C.isForDiagnostics()) {
5084 // When generating crash reports, we want to emit the modules along with
5085 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005086 Path = Output.getFilename();
5087 llvm::sys::path::replace_extension(Path, ".cache");
5088 llvm::sys::path::append(Path, "modules");
5089 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005090 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005091 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005092 llvm::sys::path::append(Path, "org.llvm.clang.");
5093 appendUserToPath(Path);
5094 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005095 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005096 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005097 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5098 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005099 }
5100
Richard Smith8d83d6d2016-03-21 19:06:06 +00005101 // -fmodule-name specifies the module that is currently being built (or
5102 // used for header checking by -fmodule-maps).
5103 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5104
5105 // -fmodule-map-file can be used to specify files containing module
5106 // definitions.
5107 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5108
5109 // -fmodule-file can be used to specify files containing precompiled modules.
5110 if (HaveModules)
5111 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5112 else
5113 Args.ClaimAllArgs(options::OPT_fmodule_file);
5114
Justin Bognera88f0122014-06-20 22:59:50 +00005115 // When building modules and generating crashdumps, we need to dump a module
5116 // dependency VFS alongside the output.
5117 if (HaveModules && C.isForDiagnostics()) {
5118 SmallString<128> VFSDir(Output.getFilename());
5119 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005120 // Add the cache directory as a temp so the crash diagnostics pick it up.
5121 C.addTempFile(Args.MakeArgString(VFSDir));
5122
Justin Bognera88f0122014-06-20 22:59:50 +00005123 llvm::sys::path::append(VFSDir, "vfs");
5124 CmdArgs.push_back("-module-dependency-dir");
5125 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005126 }
5127
Richard Smith9887d792014-10-17 01:42:53 +00005128 if (HaveModules)
5129 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005130
Douglas Gregor35b04d62013-02-07 19:01:24 +00005131 // Pass through all -fmodules-ignore-macro arguments.
5132 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005133 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5134 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005135
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005136 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5137
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005138 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5139 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5140 D.Diag(diag::err_drv_argument_not_allowed_with)
5141 << A->getAsString(Args) << "-fbuild-session-timestamp";
5142
5143 llvm::sys::fs::file_status Status;
5144 if (llvm::sys::fs::status(A->getValue(), Status))
5145 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005146 CmdArgs.push_back(Args.MakeArgString(
5147 "-fbuild-session-timestamp=" +
5148 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005149 }
5150
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005151 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005152 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5153 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005154 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5155
5156 Args.AddLastArg(CmdArgs,
5157 options::OPT_fmodules_validate_once_per_build_session);
5158 }
5159
Ben Langmuirdcf73862014-03-12 00:06:17 +00005160 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5161
John McCalldfea9982010-04-09 19:12:06 +00005162 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005163 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005164 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005165 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005166
Anders Carlssond470fef2010-11-21 00:09:52 +00005167 // -felide-constructors is the default.
5168 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005169 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005170 CmdArgs.push_back("-fno-elide-constructors");
5171
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005172 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005173
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005174 if (KernelOrKext || (types::isCXX(InputType) &&
5175 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5176 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005177 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005178
Tony Linthicum76329bf2011-12-12 21:14:55 +00005179 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005180 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5181 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005182 CmdArgs.push_back("-fshort-enums");
5183
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005184 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005185 if (Arg *A = Args.getLastArg(
5186 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5187 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5188 if (A->getOption().matches(options::OPT_funsigned_char) ||
5189 A->getOption().matches(options::OPT_fno_signed_char)) {
5190 CmdArgs.push_back("-fno-signed-char");
5191 }
5192 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005193 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005194 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005195
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005196 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005197 if (!Args.hasFlag(
5198 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5199 !IsWindowsCygnus && !IsWindowsGNU &&
5200 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5201 getToolChain().getArch() != llvm::Triple::hexagon &&
5202 getToolChain().getArch() != llvm::Triple::xcore &&
5203 ((getToolChain().getTriple().getVendor() !=
5204 llvm::Triple::MipsTechnologies) ||
5205 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005206 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005207 CmdArgs.push_back("-fno-use-cxa-atexit");
5208
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005209 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005210 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005211 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005212 CmdArgs.push_back("-fms-extensions");
5213
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005214 // -fno-use-line-directives is default.
5215 if (Args.hasFlag(options::OPT_fuse_line_directives,
5216 options::OPT_fno_use_line_directives, false))
5217 CmdArgs.push_back("-fuse-line-directives");
5218
Francois Pichet1b4f1632011-09-17 04:32:15 +00005219 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005220 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005221 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005222 (IsWindowsMSVC &&
5223 Args.hasFlag(options::OPT_fms_extensions,
5224 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005225 CmdArgs.push_back("-fms-compatibility");
5226
David Majnemerc371ff02015-03-22 08:39:22 +00005227 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005228 VersionTuple MSVT = visualstudio::getMSVCVersion(
5229 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5230 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005231 CmdArgs.push_back(
5232 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005233
David Majnemer8db91762015-05-18 04:49:30 +00005234 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5235 if (ImplyVCPPCXXVer) {
5236 if (IsMSVC2015Compatible)
5237 CmdArgs.push_back("-std=c++14");
5238 else
5239 CmdArgs.push_back("-std=c++11");
5240 }
5241
Eric Christopher5ecce122013-02-18 00:38:31 +00005242 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005243 if (Args.hasFlag(options::OPT_fborland_extensions,
5244 options::OPT_fno_borland_extensions, false))
5245 CmdArgs.push_back("-fborland-extensions");
5246
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005247 // -fno-declspec is default, except for PS4.
5248 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5249 getToolChain().getTriple().isPS4()))
5250 CmdArgs.push_back("-fdeclspec");
5251 else if (Args.hasArg(options::OPT_fno_declspec))
5252 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5253
David Majnemerc371ff02015-03-22 08:39:22 +00005254 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5255 // than 19.
5256 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5257 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005258 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005259 CmdArgs.push_back("-fno-threadsafe-statics");
5260
Francois Pichet02744872011-09-01 16:38:08 +00005261 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5262 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005263 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005264 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005265 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005266
Chandler Carruthe03aa552010-04-17 20:17:31 +00005267 // -fgnu-keywords default varies depending on language; only pass if
5268 // specified.
5269 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005270 options::OPT_fno_gnu_keywords))
5271 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005273 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005274 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005275 CmdArgs.push_back("-fgnu89-inline");
5276
Chad Rosier9c76d242012-03-15 22:31:42 +00005277 if (Args.hasArg(options::OPT_fno_inline))
5278 CmdArgs.push_back("-fno-inline");
5279
Chad Rosier64d6be92012-03-06 21:17:19 +00005280 if (Args.hasArg(options::OPT_fno_inline_functions))
5281 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005282
John McCall5fb5df92012-06-20 06:18:46 +00005283 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005284
John McCall5fb5df92012-06-20 06:18:46 +00005285 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005286 // legacy is the default. Except for deployment taget of 10.5,
5287 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5288 // gets ignored silently.
5289 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005290 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5291 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005292 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005293 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005294 if (getToolChain().UseObjCMixedDispatch())
5295 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5296 else
5297 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5298 }
5299 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005300
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005301 // When ObjectiveC legacy runtime is in effect on MacOSX,
5302 // turn on the option to do Array/Dictionary subscripting
5303 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005304 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005305 getToolChain().getTriple().isMacOSX() &&
5306 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5307 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005308 objcRuntime.isNeXTFamily())
5309 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005310
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005311 // -fencode-extended-block-signature=1 is default.
5312 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5313 CmdArgs.push_back("-fencode-extended-block-signature");
5314 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005315
John McCall24fc0de2011-07-06 00:26:06 +00005316 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5317 // NOTE: This logic is duplicated in ToolChains.cpp.
5318 bool ARC = isObjCAutoRefCount(Args);
5319 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005320 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005321
John McCall24fc0de2011-07-06 00:26:06 +00005322 CmdArgs.push_back("-fobjc-arc");
5323
Chandler Carruth491db322011-11-04 07:34:47 +00005324 // FIXME: It seems like this entire block, and several around it should be
5325 // wrapped in isObjC, but for now we just use it here as this is where it
5326 // was being used previously.
5327 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5328 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5329 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5330 else
5331 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5332 }
5333
John McCall24fc0de2011-07-06 00:26:06 +00005334 // Allow the user to enable full exceptions code emission.
5335 // We define off for Objective-CC, on for Objective-C++.
5336 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5337 options::OPT_fno_objc_arc_exceptions,
5338 /*default*/ types::isCXX(InputType)))
5339 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005340
John McCall24fc0de2011-07-06 00:26:06 +00005341 }
5342
5343 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5344 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005345 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005346 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005347
John McCall24fc0de2011-07-06 00:26:06 +00005348 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5349 // takes precedence.
5350 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5351 if (!GCArg)
5352 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5353 if (GCArg) {
5354 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005355 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005356 } else if (getToolChain().SupportsObjCGC()) {
5357 GCArg->render(Args, CmdArgs);
5358 } else {
5359 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005360 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005361 }
5362 }
5363
John McCallfbe5ed72015-11-05 19:19:56 +00005364 // Pass down -fobjc-weak or -fno-objc-weak if present.
5365 if (types::isObjC(InputType)) {
5366 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5367 options::OPT_fno_objc_weak);
5368 if (!WeakArg) {
5369 // nothing to do
5370 } else if (GCArg) {
5371 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5372 D.Diag(diag::err_objc_weak_with_gc);
5373 } else if (!objcRuntime.allowsWeak()) {
5374 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5375 D.Diag(diag::err_objc_weak_unsupported);
5376 } else {
5377 WeakArg->render(Args, CmdArgs);
5378 }
5379 }
5380
Bob Wilsonb111ec92015-03-02 19:01:14 +00005381 if (Args.hasFlag(options::OPT_fapplication_extension,
5382 options::OPT_fno_application_extension, false))
5383 CmdArgs.push_back("-fapplication-extension");
5384
Reid Klecknerc542d372014-06-27 17:02:02 +00005385 // Handle GCC-style exception args.
5386 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005387 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5388 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005389
Tim Northovere931f9f2015-10-30 16:30:41 +00005390 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005391 CmdArgs.push_back("-fsjlj-exceptions");
5392
5393 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005394 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5395 options::OPT_fno_assume_sane_operator_new))
5396 CmdArgs.push_back("-fno-assume-sane-operator-new");
5397
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005398 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5399 // most platforms.
5400 if (Args.hasFlag(options::OPT_fsized_deallocation,
5401 options::OPT_fno_sized_deallocation, false))
5402 CmdArgs.push_back("-fsized-deallocation");
5403
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005404 // -fconstant-cfstrings is default, and may be subject to argument translation
5405 // on Darwin.
5406 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5407 options::OPT_fno_constant_cfstrings) ||
5408 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5409 options::OPT_mno_constant_cfstrings))
5410 CmdArgs.push_back("-fno-constant-cfstrings");
5411
John Thompsoned4e2952009-11-05 20:14:16 +00005412 // -fshort-wchar default varies depending on platform; only
5413 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005414 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5415 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005416 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005417
Hans Wennborg28c96312013-07-31 23:39:13 +00005418 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005419 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005420 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005421 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005422
Daniel Dunbar096ed292011-10-05 21:04:55 +00005423 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5424 // -fno-pack-struct doesn't apply to -fpack-struct=.
5425 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005426 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005427 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005428 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005429 } else if (Args.hasFlag(options::OPT_fpack_struct,
5430 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005431 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005432 }
5433
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005434 // Handle -fmax-type-align=N and -fno-type-align
5435 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5436 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5437 if (!SkipMaxTypeAlign) {
5438 std::string MaxTypeAlignStr = "-fmax-type-align=";
5439 MaxTypeAlignStr += A->getValue();
5440 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5441 }
5442 } else if (getToolChain().getTriple().isOSDarwin()) {
5443 if (!SkipMaxTypeAlign) {
5444 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5445 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5446 }
5447 }
5448
John Brawna7b4ec02015-08-10 11:11:28 +00005449 // -fcommon is the default unless compiling kernel code or the target says so
5450 bool NoCommonDefault =
5451 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5452 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5453 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005454 CmdArgs.push_back("-fno-common");
5455
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005456 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005457 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005458 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005459 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005460 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005461 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005462
Daniel Dunbar6358d682010-10-15 22:30:42 +00005463 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005464 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005465 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005466 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005467
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005468 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005469 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5470 StringRef value = inputCharset->getValue();
5471 if (value != "UTF-8")
5472 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5473 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005474 }
5475
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005476 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005477 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5478 StringRef value = execCharset->getValue();
5479 if (value != "UTF-8")
5480 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5481 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005482 }
5483
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005484 // -fcaret-diagnostics is default.
5485 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5486 options::OPT_fno_caret_diagnostics, true))
5487 CmdArgs.push_back("-fno-caret-diagnostics");
5488
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005489 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005490 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005491 options::OPT_fno_diagnostics_fixit_info))
5492 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005493
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005494 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005495 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005496 options::OPT_fno_diagnostics_show_option))
5497 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005498
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005499 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005500 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005501 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005502 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005503 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005504
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005505 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005506 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005507 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005508 }
5509
Chandler Carruthb6766f02011-03-27 01:50:55 +00005510 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005511 options::OPT_fdiagnostics_show_note_include_stack,
5512 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005513 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005514 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005515 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5516 else
5517 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5518 }
5519
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005520 // Color diagnostics are the default, unless the terminal doesn't support
5521 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005522 // Support both clang's -f[no-]color-diagnostics and gcc's
5523 // -f[no-]diagnostics-colors[=never|always|auto].
5524 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005525 for (const auto &Arg : Args) {
5526 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005527 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5528 !O.matches(options::OPT_fdiagnostics_color) &&
5529 !O.matches(options::OPT_fno_color_diagnostics) &&
5530 !O.matches(options::OPT_fno_diagnostics_color) &&
5531 !O.matches(options::OPT_fdiagnostics_color_EQ))
5532 continue;
5533
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005534 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005535 if (O.matches(options::OPT_fcolor_diagnostics) ||
5536 O.matches(options::OPT_fdiagnostics_color)) {
5537 ShowColors = Colors_On;
5538 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5539 O.matches(options::OPT_fno_diagnostics_color)) {
5540 ShowColors = Colors_Off;
5541 } else {
5542 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005543 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005544 if (value == "always")
5545 ShowColors = Colors_On;
5546 else if (value == "never")
5547 ShowColors = Colors_Off;
5548 else if (value == "auto")
5549 ShowColors = Colors_Auto;
5550 else
5551 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005552 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005553 }
5554 }
5555 if (ShowColors == Colors_On ||
5556 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005557 CmdArgs.push_back("-fcolor-diagnostics");
5558
Nico Rieck7857d462013-09-11 00:38:02 +00005559 if (Args.hasArg(options::OPT_fansi_escape_codes))
5560 CmdArgs.push_back("-fansi-escape-codes");
5561
Daniel Dunbardb097022009-06-08 21:13:54 +00005562 if (!Args.hasFlag(options::OPT_fshow_source_location,
5563 options::OPT_fno_show_source_location))
5564 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005565
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005566 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005567 true))
5568 CmdArgs.push_back("-fno-show-column");
5569
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005570 if (!Args.hasFlag(options::OPT_fspell_checking,
5571 options::OPT_fno_spell_checking))
5572 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005573
Chad Rosierc8e56e82012-12-05 21:08:21 +00005574 // -fno-asm-blocks is default.
5575 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5576 false))
5577 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005578
Steven Wucb0d13f2015-01-16 23:05:28 +00005579 // -fgnu-inline-asm is default.
5580 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5581 options::OPT_fno_gnu_inline_asm, true))
5582 CmdArgs.push_back("-fno-gnu-inline-asm");
5583
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005584 // Enable vectorization per default according to the optimization level
5585 // selected. For optimization levels that want vectorization we use the alias
5586 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005587 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005588 OptSpecifier VectorizeAliasOption =
5589 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005590 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005591 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005592 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005593
Chad Rosier136d67d2014-04-28 19:30:57 +00005594 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005595 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005596 OptSpecifier SLPVectAliasOption =
5597 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005598 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005599 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005600 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005601
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005602 // -fno-slp-vectorize-aggressive is default.
5603 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005604 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005605 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005606
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005607 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5608 A->render(Args, CmdArgs);
5609
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005610 // -fdollars-in-identifiers default varies depending on platform and
5611 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005612 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005613 options::OPT_fno_dollars_in_identifiers)) {
5614 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005615 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005616 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005617 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005618 }
5619
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005620 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5621 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005622 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005623 options::OPT_fno_unit_at_a_time)) {
5624 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005625 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005626 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005627
Eli Friedman055c9702011-11-02 01:53:16 +00005628 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5629 options::OPT_fno_apple_pragma_pack, false))
5630 CmdArgs.push_back("-fapple-pragma-pack");
5631
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005632 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005633 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5634 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005635 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005636 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005637 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005638
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005639// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5640//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005641// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005642#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005643 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005644 (getToolChain().getArch() == llvm::Triple::arm ||
5645 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005646 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5647 CmdArgs.push_back("-fno-builtin-strcat");
5648 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5649 CmdArgs.push_back("-fno-builtin-strcpy");
5650 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005651#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005652
Justin Bognera88f0122014-06-20 22:59:50 +00005653 // Enable rewrite includes if the user's asked for it or if we're generating
5654 // diagnostics.
5655 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5656 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005657 if (Args.hasFlag(options::OPT_frewrite_includes,
5658 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005659 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005660 CmdArgs.push_back("-frewrite-includes");
5661
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005662 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005663 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005664 options::OPT_traditional_cpp)) {
5665 if (isa<PreprocessJobAction>(JA))
5666 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005667 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005669 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005670
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005671 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005672 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005673
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005674 // Handle serialized diagnostics.
5675 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5676 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005677 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005678 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005679
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005680 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5681 CmdArgs.push_back("-fretain-comments-from-system-headers");
5682
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005683 // Forward -fcomment-block-commands to -cc1.
5684 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005685 // Forward -fparse-all-comments to -cc1.
5686 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005687
John Brawnad31ace2015-09-23 13:55:40 +00005688 // Turn -fplugin=name.so into -load name.so
5689 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5690 CmdArgs.push_back("-load");
5691 CmdArgs.push_back(A->getValue());
5692 A->claim();
5693 }
5694
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005695 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5696 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005697 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005698 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5699 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005700
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005701 // We translate this by hand to the -cc1 argument, since nightly test uses
5702 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005703 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005704 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005705 } else
Sean Silva14facf32015-06-09 01:57:17 +00005706 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005707 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005708
Bob Wilson23a55f12014-12-21 07:00:00 +00005709 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005710 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5711 // by the frontend.
Steven Wu27fb5222016-05-11 16:26:03 +00005712 // When -fembed-bitcode is enabled, optimized bitcode is emitted because it
5713 // has slightly different breakdown between stages.
5714 // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of
5715 // pristine IR generated by the frontend. Ideally, a new compile action should
5716 // be added so both IR can be captured.
5717 if (C.getDriver().isSaveTempsEnabled() &&
5718 !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA))
Steven Wu546a1962015-07-17 20:09:56 +00005719 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005720
Daniel Dunbard67a3222009-03-30 06:36:42 +00005721 if (Output.getType() == types::TY_Dependencies) {
5722 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005723 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005724 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005725 CmdArgs.push_back(Output.getFilename());
5726 } else {
5727 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005728 }
5729
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005730 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005731
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005732 if (Input.isFilename())
5733 CmdArgs.push_back(Input.getFilename());
5734 else
5735 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005736
Chris Lattnere9d7d782009-11-03 19:50:27 +00005737 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5738
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005739 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005740
5741 // Optionally embed the -cc1 level arguments into the debug info, for build
5742 // analysis.
5743 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005744 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005745 for (const auto &Arg : Args)
5746 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005747
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005748 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005749 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005750 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005751 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005752 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005753 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005754 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005755 }
5756 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005757 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005758 }
5759
Eric Christopherd3804002013-02-22 20:12:52 +00005760 // Add the split debug info name to the command lines here so we
5761 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005762 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005763 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5764 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005765 const char *SplitDwarfOut;
5766 if (SplitDwarf) {
5767 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005768 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005769 CmdArgs.push_back(SplitDwarfOut);
5770 }
5771
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005772 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5773 // Include them with -fcuda-include-gpubinary.
5774 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005775 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005776 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005777 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005778 }
5779
Peter Collingbourne3afb2662016-04-28 17:09:37 +00005780 bool WholeProgramVTables =
5781 Args.hasFlag(options::OPT_fwhole_program_vtables,
5782 options::OPT_fno_whole_program_vtables, false);
5783 if (WholeProgramVTables) {
5784 if (!D.isUsingLTO())
5785 D.Diag(diag::err_drv_argument_only_allowed_with)
5786 << "-fwhole-program-vtables"
5787 << "-flto";
5788 CmdArgs.push_back("-fwhole-program-vtables");
5789 }
5790
Eric Christopherd3804002013-02-22 20:12:52 +00005791 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005792 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005793 Output.getType() == types::TY_Object &&
5794 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005795 auto CLCommand =
5796 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005797 C.addCommand(llvm::make_unique<FallbackCommand>(
5798 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005799 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5800 isa<PrecompileJobAction>(JA)) {
5801 // In /fallback builds, run the main compilation even if the pch generation
5802 // fails, so that the main compilation's fallback to cl.exe runs.
5803 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5804 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005805 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005806 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005807 }
5808
Eric Christopherf1545832013-02-22 23:50:16 +00005809 // Handle the debug info splitting at object creation time if we're
5810 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005811 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005812 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005813 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005814
Roman Divacky178e01602011-02-10 16:52:03 +00005815 if (Arg *A = Args.getLastArg(options::OPT_pg))
5816 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005817 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5818 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005819
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005820 // Claim some arguments which clang supports automatically.
5821
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005822 // -fpch-preprocess is used with gcc to add a special marker in the output to
5823 // include the PCH file. Clang's PTH solution is completely transparent, so we
5824 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005825 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005826
Daniel Dunbar17731772009-03-23 19:03:36 +00005827 // Claim some arguments which clang doesn't support, but we don't
5828 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005829 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5830 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005831
Rafael Espindolab0092d72013-09-04 19:37:35 +00005832 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005833 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005834}
5835
John McCall5fb5df92012-06-20 06:18:46 +00005836/// Add options related to the Objective-C runtime/ABI.
5837///
5838/// Returns true if the runtime is non-fragile.
5839ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5840 ArgStringList &cmdArgs,
5841 RewriteKind rewriteKind) const {
5842 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005843 Arg *runtimeArg =
5844 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5845 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005846
5847 // Just forward -fobjc-runtime= to the frontend. This supercedes
5848 // options about fragility.
5849 if (runtimeArg &&
5850 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5851 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005852 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005853 if (runtime.tryParse(value)) {
5854 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005855 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005856 }
5857
5858 runtimeArg->render(args, cmdArgs);
5859 return runtime;
5860 }
5861
5862 // Otherwise, we'll need the ABI "version". Version numbers are
5863 // slightly confusing for historical reasons:
5864 // 1 - Traditional "fragile" ABI
5865 // 2 - Non-fragile ABI, version 1
5866 // 3 - Non-fragile ABI, version 2
5867 unsigned objcABIVersion = 1;
5868 // If -fobjc-abi-version= is present, use that to set the version.
5869 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005870 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005871 if (value == "1")
5872 objcABIVersion = 1;
5873 else if (value == "2")
5874 objcABIVersion = 2;
5875 else if (value == "3")
5876 objcABIVersion = 3;
5877 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005878 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005879 } else {
5880 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005881 bool nonFragileABIIsDefault =
5882 (rewriteKind == RK_NonFragile ||
5883 (rewriteKind == RK_None &&
5884 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005885 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5886 options::OPT_fno_objc_nonfragile_abi,
5887 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005888// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005889#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5890 unsigned nonFragileABIVersion = 1;
5891#else
5892 unsigned nonFragileABIVersion = 2;
5893#endif
5894
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005895 if (Arg *abiArg =
5896 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005897 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005898 if (value == "1")
5899 nonFragileABIVersion = 1;
5900 else if (value == "2")
5901 nonFragileABIVersion = 2;
5902 else
5903 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005904 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005905 }
5906
5907 objcABIVersion = 1 + nonFragileABIVersion;
5908 } else {
5909 objcABIVersion = 1;
5910 }
5911 }
5912
5913 // We don't actually care about the ABI version other than whether
5914 // it's non-fragile.
5915 bool isNonFragile = objcABIVersion != 1;
5916
5917 // If we have no runtime argument, ask the toolchain for its default runtime.
5918 // However, the rewriter only really supports the Mac runtime, so assume that.
5919 ObjCRuntime runtime;
5920 if (!runtimeArg) {
5921 switch (rewriteKind) {
5922 case RK_None:
5923 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5924 break;
5925 case RK_Fragile:
5926 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5927 break;
5928 case RK_NonFragile:
5929 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5930 break;
5931 }
5932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005933 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005934 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5935 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005936 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005937 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005939 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005940 } else {
5941 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5942 }
5943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005944 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005945 } else {
5946 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005947 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005948 // non-fragile mode or the GCC runtime in fragile mode.
5949 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005950 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005951 else
5952 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005953 }
5954
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005955 cmdArgs.push_back(
5956 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005957 return runtime;
5958}
5959
Reid Klecknerc542d372014-06-27 17:02:02 +00005960static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5961 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5962 I += HaveDash;
5963 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005964}
Reid Klecknerc542d372014-06-27 17:02:02 +00005965
Benjamin Kramere003ca22015-10-28 13:54:16 +00005966namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005967struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005968 bool Synch = false;
5969 bool Asynch = false;
5970 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005971};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005972} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005973
5974/// /EH controls whether to run destructor cleanups when exceptions are
5975/// thrown. There are three modifiers:
5976/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5977/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5978/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005979/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005980/// The default is /EHs-c-, meaning cleanups are disabled.
5981static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5982 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005984 std::vector<std::string> EHArgs =
5985 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005986 for (auto EHVal : EHArgs) {
5987 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5988 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005989 case 'a':
5990 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005991 if (EH.Asynch)
5992 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005993 continue;
5994 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005995 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005996 continue;
5997 case 's':
5998 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005999 if (EH.Synch)
6000 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006001 continue;
6002 default:
6003 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00006004 }
6005 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6006 break;
6007 }
6008 }
David Majnemerb8809092016-02-20 09:23:44 +00006009 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006010 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006011 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006012 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6013 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006014 EH.Synch = true;
6015 EH.NoUnwindC = true;
6016 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006017
Reid Klecknerc542d372014-06-27 17:02:02 +00006018 return EH;
6019}
6020
David Majnemercd5855e2016-02-29 01:40:36 +00006021void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6022 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006023 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006024 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006025 unsigned RTOptionID = options::OPT__SLASH_MT;
6026
Hans Wennborgf1a74252013-09-10 20:18:04 +00006027 if (Args.hasArg(options::OPT__SLASH_LDd))
6028 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6029 // but defining _DEBUG is sticky.
6030 RTOptionID = options::OPT__SLASH_MTd;
6031
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006032 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006033 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006034
David Majnemere2afb472015-07-24 06:49:13 +00006035 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006036 switch (RTOptionID) {
6037 case options::OPT__SLASH_MD:
6038 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006039 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006040 CmdArgs.push_back("-D_MT");
6041 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006042 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006043 break;
6044 case options::OPT__SLASH_MDd:
6045 CmdArgs.push_back("-D_DEBUG");
6046 CmdArgs.push_back("-D_MT");
6047 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006048 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006049 break;
6050 case options::OPT__SLASH_MT:
6051 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006052 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006053 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006054 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006055 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006056 break;
6057 case options::OPT__SLASH_MTd:
6058 CmdArgs.push_back("-D_DEBUG");
6059 CmdArgs.push_back("-D_MT");
Peter Collingbourne3afb2662016-04-28 17:09:37 +00006060 CmdArgs.push_back("-flto-visibility-public-std");
David Majnemere2afb472015-07-24 06:49:13 +00006061 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006062 break;
6063 default:
6064 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006065 }
6066
David Majnemere2afb472015-07-24 06:49:13 +00006067 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6068 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6069 } else {
6070 CmdArgs.push_back(FlagForCRT.data());
6071
6072 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6073 // users want. The /Za flag to cl.exe turns this off, but it's not
6074 // implemented in clang.
6075 CmdArgs.push_back("--dependent-lib=oldnames");
6076 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006077
Hans Wennborg8858a032014-07-21 23:42:07 +00006078 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6079 // would produce interleaved output, so ignore /showIncludes in such cases.
6080 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6081 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6082 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006083
David Majnemerf6072342014-07-01 22:24:56 +00006084 // This controls whether or not we emit RTTI data for polymorphic types.
6085 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6086 /*default=*/false))
6087 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006088
Reid Kleckner124955a2015-08-05 18:51:13 +00006089 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006090 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006091 if (*EmitCodeView)
6092 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006093 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006094 CmdArgs.push_back("-gcodeview");
6095
Reid Klecknerc542d372014-06-27 17:02:02 +00006096 const Driver &D = getToolChain().getDriver();
6097 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006098 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006099 if (types::isCXX(InputType))
6100 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006101 CmdArgs.push_back("-fexceptions");
6102 }
David Majnemercd5855e2016-02-29 01:40:36 +00006103 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6104 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006105
Hans Wennborge50cec32014-06-13 20:59:54 +00006106 // /EP should expand to -E -P.
6107 if (Args.hasArg(options::OPT__SLASH_EP)) {
6108 CmdArgs.push_back("-E");
6109 CmdArgs.push_back("-P");
6110 }
6111
David Majnemera5b195a2015-02-14 01:35:12 +00006112 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006113 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6114 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006115 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6116 else
6117 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6118
6119 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6120 VolatileOptionID = A->getOption().getID();
6121
6122 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6123 CmdArgs.push_back("-fms-volatile");
6124
David Majnemer86c318f2014-02-11 21:05:00 +00006125 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6126 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6127 if (MostGeneralArg && BestCaseArg)
6128 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6129 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6130
6131 if (MostGeneralArg) {
6132 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6133 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6134 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6135
6136 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6137 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6138 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6139 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6140 << FirstConflict->getAsString(Args)
6141 << SecondConflict->getAsString(Args);
6142
6143 if (SingleArg)
6144 CmdArgs.push_back("-fms-memptr-rep=single");
6145 else if (MultipleArg)
6146 CmdArgs.push_back("-fms-memptr-rep=multiple");
6147 else
6148 CmdArgs.push_back("-fms-memptr-rep=virtual");
6149 }
6150
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006151 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6152 A->render(Args, CmdArgs);
6153
Hans Wennborg81f74482013-09-10 01:07:07 +00006154 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6155 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006156 if (Args.hasArg(options::OPT__SLASH_fallback))
6157 CmdArgs.push_back("msvc-fallback");
6158 else
6159 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006160 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006161}
6162
Douglas Katzman95354292015-06-23 20:42:09 +00006163visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006164 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006165 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006166 return CLFallback.get();
6167}
6168
Daniel Sanders7f933f42015-01-30 17:35:23 +00006169void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6170 ArgStringList &CmdArgs) const {
6171 StringRef CPUName;
6172 StringRef ABIName;
6173 const llvm::Triple &Triple = getToolChain().getTriple();
6174 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6175
6176 CmdArgs.push_back("-target-abi");
6177 CmdArgs.push_back(ABIName.data());
6178}
6179
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006180void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006181 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006182 const ArgList &Args,
6183 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006184 ArgStringList CmdArgs;
6185
6186 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6187 const InputInfo &Input = Inputs[0];
6188
James Y Knight2db38f32015-08-15 03:45:25 +00006189 std::string TripleStr =
6190 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6191 const llvm::Triple Triple(TripleStr);
6192
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006193 // Don't warn about "clang -w -c foo.s"
6194 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006195 // and "clang -emit-llvm -c foo.s"
6196 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006197
Rafael Espindola577637a2015-01-03 00:06:04 +00006198 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006199
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006200 // Invoke ourselves in -cc1as mode.
6201 //
6202 // FIXME: Implement custom jobs for internal actions.
6203 CmdArgs.push_back("-cc1as");
6204
6205 // Add the "effective" target triple.
6206 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006207 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6208
6209 // Set the output mode, we currently only expect to be used as a real
6210 // assembler.
6211 CmdArgs.push_back("-filetype");
6212 CmdArgs.push_back("obj");
6213
Eric Christopher45f2e712012-12-18 00:31:10 +00006214 // Set the main file name, so that debug info works even with
6215 // -save-temps or preprocessed assembly.
6216 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006217 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006218
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006219 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006220 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006221 if (!CPU.empty()) {
6222 CmdArgs.push_back("-target-cpu");
6223 CmdArgs.push_back(Args.MakeArgString(CPU));
6224 }
6225
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006226 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006227 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006228
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006229 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006230 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006231
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006232 // Pass along any -I options so we get proper .include search paths.
6233 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6234
Eric Christopherfc3ee562012-01-10 00:38:01 +00006235 // Determine the original source input.
6236 const Action *SourceAction = &JA;
6237 while (SourceAction->getKind() != Action::InputClass) {
6238 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6239 SourceAction = SourceAction->getInputs()[0];
6240 }
6241
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006242 // Forward -g and handle debug info related flags, assuming we are dealing
6243 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006244 bool WantDebug = false;
6245 unsigned DwarfVersion = 0;
6246 Args.ClaimAllArgs(options::OPT_g_Group);
6247 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6248 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6249 !A->getOption().matches(options::OPT_ggdb0);
6250 if (WantDebug)
6251 DwarfVersion = DwarfVersionNum(A->getSpelling());
6252 }
6253 if (DwarfVersion == 0)
6254 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6255
6256 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6257
Eric Christopherfc3ee562012-01-10 00:38:01 +00006258 if (SourceAction->getType() == types::TY_Asm ||
6259 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006260 // You might think that it would be ok to set DebugInfoKind outside of
6261 // the guard for source type, however there is a test which asserts
6262 // that some assembler invocation receives no -debug-info-kind,
6263 // and it's not clear whether that test is just overly restrictive.
6264 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6265 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006266 // Add the -fdebug-compilation-dir flag if needed.
6267 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006268
6269 // Set the AT_producer to the clang version when using the integrated
6270 // assembler on assembly source files.
6271 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopes34c549e2016-05-02 20:20:49 +00006272 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006273
6274 // And pass along -I options
6275 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006276 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006277 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6278 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006279
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006280 // Handle -fPIC et al -- the relocation-model affects the assembler
6281 // for some targets.
6282 llvm::Reloc::Model RelocationModel;
6283 unsigned PICLevel;
6284 bool IsPIE;
6285 std::tie(RelocationModel, PICLevel, IsPIE) =
6286 ParsePICArgs(getToolChain(), Triple, Args);
6287
6288 const char *RMName = RelocationModelName(RelocationModel);
6289 if (RMName) {
6290 CmdArgs.push_back("-mrelocation-model");
6291 CmdArgs.push_back(RMName);
6292 }
6293
Kevin Enderby292dc082011-12-22 19:31:58 +00006294 // Optionally embed the -cc1as level arguments into the debug info, for build
6295 // analysis.
6296 if (getToolChain().UseDwarfDebugFlags()) {
6297 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006298 for (const auto &Arg : Args)
6299 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006300
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006301 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006302 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6303 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006304 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006305 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006306 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006307 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006308 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006309 }
6310 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006311 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006312 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006313
6314 // FIXME: Add -static support, once we have it.
6315
Daniel Sanders7f933f42015-01-30 17:35:23 +00006316 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006317 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006318 default:
6319 break;
6320
6321 case llvm::Triple::mips:
6322 case llvm::Triple::mipsel:
6323 case llvm::Triple::mips64:
6324 case llvm::Triple::mips64el:
6325 AddMIPSTargetArgs(Args, CmdArgs);
6326 break;
6327 }
6328
David Blaikie372d9502014-01-17 03:17:40 +00006329 // Consume all the warning flags. Usually this would be handled more
6330 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6331 // doesn't handle that so rather than warning about unused flags that are
6332 // actually used, we'll lie by omission instead.
6333 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006334 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006335
David Blaikie9260ed62013-07-25 21:19:01 +00006336 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6337 getToolChain().getDriver());
6338
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006339 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006340
6341 assert(Output.isFilename() && "Unexpected lipo output.");
6342 CmdArgs.push_back("-o");
6343 CmdArgs.push_back(Output.getFilename());
6344
Daniel Dunbarb440f562010-08-02 02:38:21 +00006345 assert(Input.isFilename() && "Invalid input.");
6346 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006347
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006348 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006349 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006350
6351 // Handle the debug info splitting at object creation time if we're
6352 // creating an object.
6353 // TODO: Currently only works on linux with newer objcopy.
6354 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006355 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006356 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006357 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006358}
6359
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006360void GnuTool::anchor() {}
6361
Daniel Dunbara3246a02009-03-18 08:07:30 +00006362void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006363 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006364 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006365 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006366 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006367 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006368
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006369 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006370 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006371 // It is unfortunate that we have to claim here, as this means
6372 // we will basically never report anything interesting for
6373 // platforms using a generic gcc, even if we are just using gcc
6374 // to get to the assembler.
6375 A->claim();
6376
Daniel Dunbar939c1212010-08-03 16:14:14 +00006377 // Don't forward any -g arguments to assembly steps.
6378 if (isa<AssembleJobAction>(JA) &&
6379 A->getOption().matches(options::OPT_g_Group))
6380 continue;
6381
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006382 // Don't forward any -W arguments to assembly and link steps.
6383 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6384 A->getOption().matches(options::OPT_W_Group))
6385 continue;
6386
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006387 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006388 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006389 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006390
Daniel Dunbar4e295052010-01-25 22:35:08 +00006391 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006392
6393 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006394 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006395 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006396 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006397 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006398 }
6399
Daniel Dunbar5716d872009-05-02 21:41:52 +00006400 // Try to force gcc to match the tool chain we want, if we recognize
6401 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006402 //
6403 // FIXME: The triple class should directly provide the information we want
6404 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006405 switch (getToolChain().getArch()) {
6406 default:
6407 break;
6408 case llvm::Triple::x86:
6409 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006410 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006411 break;
6412 case llvm::Triple::x86_64:
6413 case llvm::Triple::ppc64:
6414 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006415 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006416 break;
6417 case llvm::Triple::sparcel:
6418 CmdArgs.push_back("-EL");
6419 break;
6420 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006421
Daniel Dunbarb440f562010-08-02 02:38:21 +00006422 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006423 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006424 CmdArgs.push_back(Output.getFilename());
6425 } else {
6426 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006427 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006428 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006429
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006430 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006431
6432 // Only pass -x if gcc will understand it; otherwise hope gcc
6433 // understands the suffix correctly. The main use case this would go
6434 // wrong in is for linker inputs if they happened to have an odd
6435 // suffix; really the only way to get this to happen is a command
6436 // like '-x foobar a.c' which will treat a.c like a linker input.
6437 //
6438 // FIXME: For the linker case specifically, can we safely convert
6439 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006440 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006441 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006442 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006443 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006444 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006445 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006446 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006447 else if (II.getType() == types::TY_ModuleFile)
6448 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006449 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006450
Daniel Dunbara3246a02009-03-18 08:07:30 +00006451 if (types::canTypeBeUserSpecified(II.getType())) {
6452 CmdArgs.push_back("-x");
6453 CmdArgs.push_back(types::getTypeName(II.getType()));
6454 }
6455
Daniel Dunbarb440f562010-08-02 02:38:21 +00006456 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006457 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006458 else {
6459 const Arg &A = II.getInputArg();
6460
6461 // Reverse translate some rewritten options.
6462 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6463 CmdArgs.push_back("-lstdc++");
6464 continue;
6465 }
6466
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006467 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006468 A.render(Args, CmdArgs);
6469 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006470 }
6471
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006472 const std::string customGCCName = D.getCCCGenericGCCName();
6473 const char *GCCName;
6474 if (!customGCCName.empty())
6475 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006476 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006477 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006478 } else
6479 GCCName = "gcc";
6480
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006481 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006482 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006483}
6484
Douglas Katzman95354292015-06-23 20:42:09 +00006485void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6486 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006487 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006488}
6489
Douglas Katzman95354292015-06-23 20:42:09 +00006490void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6491 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006492 const Driver &D = getToolChain().getDriver();
6493
Eric Christophercc7ff502015-01-29 00:56:17 +00006494 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006495 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006496 case types::TY_LLVM_IR:
6497 case types::TY_LTO_IR:
6498 case types::TY_LLVM_BC:
6499 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006500 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006501 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006502 // We assume we've got an "integrated" assembler in that gcc will produce an
6503 // object file itself.
6504 case types::TY_Object:
6505 CmdArgs.push_back("-c");
6506 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006507 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006508 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006509 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006510 case types::TY_Nothing:
6511 CmdArgs.push_back("-fsyntax-only");
6512 break;
6513 default:
6514 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006515 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006516}
6517
Douglas Katzman95354292015-06-23 20:42:09 +00006518void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6519 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006520 // The types are (hopefully) good enough.
6521}
6522
Tony Linthicum76329bf2011-12-12 21:14:55 +00006523// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006524void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 ArgStringList &CmdArgs) const {
6526}
6527
Douglas Katzman95354292015-06-23 20:42:09 +00006528void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6529 const InputInfo &Output,
6530 const InputInfoList &Inputs,
6531 const ArgList &Args,
6532 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006533 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006534
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006535 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6536 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006537 ArgStringList CmdArgs;
6538
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006539 std::string MArchString = "-march=hexagon";
6540 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006541
6542 RenderExtraToolArgs(JA, CmdArgs);
6543
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544 std::string AsName = "hexagon-llvm-mc";
6545 std::string MCpuString = "-mcpu=hexagon" +
6546 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6547 CmdArgs.push_back("-filetype=obj");
6548 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6549
Tony Linthicum76329bf2011-12-12 21:14:55 +00006550 if (Output.isFilename()) {
6551 CmdArgs.push_back("-o");
6552 CmdArgs.push_back(Output.getFilename());
6553 } else {
6554 assert(Output.isNothing() && "Unexpected output");
6555 CmdArgs.push_back("-fsyntax-only");
6556 }
6557
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6559 std::string N = llvm::utostr(G.getValue());
6560 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6561 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006562
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006563 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006564
Tony Linthicum76329bf2011-12-12 21:14:55 +00006565 // Only pass -x if gcc will understand it; otherwise hope gcc
6566 // understands the suffix correctly. The main use case this would go
6567 // wrong in is for linker inputs if they happened to have an odd
6568 // suffix; really the only way to get this to happen is a command
6569 // like '-x foobar a.c' which will treat a.c like a linker input.
6570 //
6571 // FIXME: For the linker case specifically, can we safely convert
6572 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006573 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006574 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006575 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006576 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006578 else if (II.getType() == types::TY_AST)
6579 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006580 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006581 else if (II.getType() == types::TY_ModuleFile)
6582 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006583 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006584
6585 if (II.isFilename())
6586 CmdArgs.push_back(II.getFilename());
6587 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006588 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006589 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006590 II.getInputArg().render(Args, CmdArgs);
6591 }
6592
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006593 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006594 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006595}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006596
Douglas Katzman95354292015-06-23 20:42:09 +00006597void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6598 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006599}
6600
Douglas Katzman54366072015-07-27 16:53:08 +00006601static void
6602constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006603 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006604 const InputInfo &Output, const InputInfoList &Inputs,
6605 const ArgList &Args, ArgStringList &CmdArgs,
6606 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006607
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006608 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006609
Matthew Curtise689b052012-12-06 15:46:07 +00006610 //----------------------------------------------------------------------------
6611 //
6612 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006613 bool IsStatic = Args.hasArg(options::OPT_static);
6614 bool IsShared = Args.hasArg(options::OPT_shared);
6615 bool IsPIE = Args.hasArg(options::OPT_pie);
6616 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6617 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6618 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6619 bool UseG0 = false;
6620 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006621
Matthew Curtise689b052012-12-06 15:46:07 +00006622 //----------------------------------------------------------------------------
6623 // Silence warnings for various options
6624 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006625 Args.ClaimAllArgs(options::OPT_g_Group);
6626 Args.ClaimAllArgs(options::OPT_emit_llvm);
6627 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6628 // handled somewhere else.
6629 Args.ClaimAllArgs(options::OPT_static_libgcc);
6630
6631 //----------------------------------------------------------------------------
6632 //
6633 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634 if (Args.hasArg(options::OPT_s))
6635 CmdArgs.push_back("-s");
6636
6637 if (Args.hasArg(options::OPT_r))
6638 CmdArgs.push_back("-r");
6639
6640 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006641 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006642
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006643 CmdArgs.push_back("-march=hexagon");
6644 std::string CpuVer =
6645 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6646 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6647 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006648
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006649 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006650 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006651 // The following should be the default, but doing as hexagon-gcc does.
6652 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006653 }
6654
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006655 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006656 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006657
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006658 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006659 CmdArgs.push_back("-pie");
6660
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006661 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6662 std::string N = llvm::utostr(G.getValue());
6663 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6664 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006665 }
6666
Matthew Curtise689b052012-12-06 15:46:07 +00006667 //----------------------------------------------------------------------------
6668 //
6669 //----------------------------------------------------------------------------
6670 CmdArgs.push_back("-o");
6671 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006672
Matthew Curtise689b052012-12-06 15:46:07 +00006673 //----------------------------------------------------------------------------
6674 // moslib
6675 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006676 std::vector<std::string> OsLibs;
6677 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006678
Sean Silva14facf32015-06-09 01:57:17 +00006679 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6680 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006681 OsLibs.emplace_back(A->getValue());
6682 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006683 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006684 if (OsLibs.empty()) {
6685 OsLibs.push_back("standalone");
6686 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006687 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006688
Matthew Curtise689b052012-12-06 15:46:07 +00006689 //----------------------------------------------------------------------------
6690 // Start Files
6691 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006692 const std::string MCpuSuffix = "/" + CpuVer;
6693 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6694 const std::string RootDir =
6695 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6696 const std::string StartSubDir =
6697 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006698
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006699 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6700 const char *Name) -> std::string {
6701 std::string RelName = SubDir + Name;
6702 std::string P = HTC.GetFilePath(RelName.c_str());
6703 if (llvm::sys::fs::exists(P))
6704 return P;
6705 return RootDir + RelName;
6706 };
6707
6708 if (IncStdLib && IncStartFiles) {
6709 if (!IsShared) {
6710 if (HasStandalone) {
6711 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6712 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006713 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006714 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6715 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006716 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006717 std::string Init = UseShared
6718 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6719 : Find(RootDir, StartSubDir, "/init.o");
6720 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006721 }
6722
6723 //----------------------------------------------------------------------------
6724 // Library Search Paths
6725 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006726 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6727 for (const auto &LibPath : LibPaths)
6728 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006729
6730 //----------------------------------------------------------------------------
6731 //
6732 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006733 Args.AddAllArgs(CmdArgs,
6734 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6735 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006736
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006737 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006738
6739 //----------------------------------------------------------------------------
6740 // Libraries
6741 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006742 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006743 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006744 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006745 CmdArgs.push_back("-lm");
6746 }
6747
6748 CmdArgs.push_back("--start-group");
6749
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006750 if (!IsShared) {
6751 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006752 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006753 CmdArgs.push_back("-lc");
6754 }
6755 CmdArgs.push_back("-lgcc");
6756
6757 CmdArgs.push_back("--end-group");
6758 }
6759
6760 //----------------------------------------------------------------------------
6761 // End files
6762 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006763 if (IncStdLib && IncStartFiles) {
6764 std::string Fini = UseShared
6765 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6766 : Find(RootDir, StartSubDir, "/fini.o");
6767 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006768 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006769}
6770
Douglas Katzman95354292015-06-23 20:42:09 +00006771void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6772 const InputInfo &Output,
6773 const InputInfoList &Inputs,
6774 const ArgList &Args,
6775 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006776 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006777
6778 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006779 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006780 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006781
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006782 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006783 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006784 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006785}
6786// Hexagon tools end.
6787
Tom Stellard8fa33092015-07-18 01:49:05 +00006788void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6789 const InputInfo &Output,
6790 const InputInfoList &Inputs,
6791 const ArgList &Args,
6792 const char *LinkingOutput) const {
6793
6794 std::string Linker = getToolChain().GetProgramPath(getShortName());
6795 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006796 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellardf6699f52016-05-05 17:03:41 +00006797 CmdArgs.push_back("-shared");
6798 CmdArgs.push_back("-o");
Tom Stellard8fa33092015-07-18 01:49:05 +00006799 CmdArgs.push_back(Output.getFilename());
6800 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6801 CmdArgs, Inputs));
6802}
6803// AMDGPU tools end.
6804
Dan Gohman52816862015-12-16 23:30:41 +00006805wasm::Linker::Linker(const ToolChain &TC)
6806 : GnuTool("wasm::Linker", "lld", TC) {}
6807
6808bool wasm::Linker::isLinkJob() const {
6809 return true;
6810}
6811
6812bool wasm::Linker::hasIntegratedCPP() const {
6813 return false;
6814}
6815
6816void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6817 const InputInfo &Output,
6818 const InputInfoList &Inputs,
6819 const ArgList &Args,
6820 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006821
6822 const ToolChain &ToolChain = getToolChain();
6823 const Driver &D = ToolChain.getDriver();
6824 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006825 ArgStringList CmdArgs;
6826 CmdArgs.push_back("-flavor");
6827 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006828
6829 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006830 // size is of particular importance. This is significantly facilitated by
6831 // the enabling of -ffunction-sections and -fdata-sections in
6832 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006833 if (areOptimizationsEnabled(Args))
6834 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006835
Dan Gohman57b62c52016-02-22 19:26:15 +00006836 if (Args.hasArg(options::OPT_rdynamic))
6837 CmdArgs.push_back("-export-dynamic");
6838 if (Args.hasArg(options::OPT_s))
6839 CmdArgs.push_back("--strip-all");
6840 if (Args.hasArg(options::OPT_shared))
6841 CmdArgs.push_back("-shared");
6842 if (Args.hasArg(options::OPT_static))
6843 CmdArgs.push_back("-Bstatic");
6844
6845 Args.AddAllArgs(CmdArgs, options::OPT_L);
6846 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6847
6848 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6849 if (Args.hasArg(options::OPT_shared))
6850 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6851 else if (Args.hasArg(options::OPT_pie))
6852 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6853 else
6854 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6855
6856 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6857 }
6858
6859 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6860
6861 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6862 if (D.CCCIsCXX())
6863 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6864
6865 if (Args.hasArg(options::OPT_pthread))
6866 CmdArgs.push_back("-lpthread");
6867
6868 CmdArgs.push_back("-lc");
6869 CmdArgs.push_back("-lcompiler_rt");
6870 }
6871
6872 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6873 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6874
Dan Gohman52816862015-12-16 23:30:41 +00006875 CmdArgs.push_back("-o");
6876 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006877
Dan Gohman52816862015-12-16 23:30:41 +00006878 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6879}
6880
Renato Golin7c542b42015-07-27 23:44:45 +00006881const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006882 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006883 if (!Arch.empty())
6884 MArch = Arch;
6885 else
Bernard Ogden31561762013-12-12 13:27:11 +00006886 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006887 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006888
6889 // Handle -march=native.
6890 if (MArch == "native") {
6891 std::string CPU = llvm::sys::getHostCPUName();
6892 if (CPU != "generic") {
6893 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006894 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006895 // If there is no valid architecture suffix for this CPU we don't know how
6896 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006897 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006898 MArch = "";
6899 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006900 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006901 }
6902 }
6903
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006904 return MArch;
6905}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006906
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006907/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006908StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006909 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006910 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6911 // here means an -march=native that we can't handle, so instead return no CPU.
6912 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006913 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006914
John Brawna95c1a82015-05-08 12:52:18 +00006915 // We need to return an empty string here on invalid MArch values as the
6916 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006917 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006918}
6919
6920/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006921std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006922 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006923 // FIXME: Warn on inconsistent use of -mcpu and -march.
6924 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006925 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006926 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006927 // Handle -mcpu=native.
6928 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006929 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006930 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006931 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006932 }
6933
Renato Goline17c5802015-07-27 23:44:42 +00006934 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006935}
6936
6937/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006938/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006939// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006940StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6941 const llvm::Triple &Triple) {
6942 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006943 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006944 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006945 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006946 if (ArchKind == llvm::ARM::AK_INVALID)
6947 // In case of generic Arch, i.e. "arm",
6948 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006949 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006950 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006951 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6952 // armv7k triple if it's actually been specified via "-arch armv7k".
6953 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006954 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006955 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006956 }
Renato Golin3c007252015-05-28 15:05:53 +00006957 if (ArchKind == llvm::ARM::AK_INVALID)
6958 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006959 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006960}
6961
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006962void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006963 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006964 if (Args.hasArg(options::OPT_r))
6965 return;
6966
John Brawn94fd9632015-05-21 12:19:49 +00006967 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6968 // to generate BE-8 executables.
6969 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6970 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006971}
6972
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006973mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006974 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6975 // was first introduced in Release 3. However, other compilers have
6976 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006977 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6978 .Case("mips1", NanLegacy)
6979 .Case("mips2", NanLegacy)
6980 .Case("mips3", NanLegacy)
6981 .Case("mips4", NanLegacy)
6982 .Case("mips5", NanLegacy)
6983 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006984 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006985 .Case("mips32r3", NanLegacy | Nan2008)
6986 .Case("mips32r5", NanLegacy | Nan2008)
6987 .Case("mips32r6", Nan2008)
6988 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006989 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006990 .Case("mips64r3", NanLegacy | Nan2008)
6991 .Case("mips64r5", NanLegacy | Nan2008)
6992 .Case("mips64r6", Nan2008)
6993 .Default(NanLegacy);
6994}
6995
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006996bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6997 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6998 return A && (A->getValue() == StringRef(Value));
6999}
7000
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007001bool mips::isUCLibc(const ArgList &Args) {
7002 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00007003 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00007004}
7005
Daniel Sanders2bf13662014-07-10 14:40:57 +00007006bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007007 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7008 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007009 .Case("2008", true)
7010 .Case("legacy", false)
7011 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007012
7013 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007014 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007015 .Cases("mips32r6", "mips64r6", true)
7016 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007017
7018 return false;
7019}
7020
Daniel Sanders379d44b2014-07-16 11:52:23 +00007021bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007022 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007023 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00007024 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00007025 return false;
7026
7027 if (ABIName != "32")
7028 return false;
7029
Toma Tabacu94ea6862015-06-16 13:54:13 +00007030 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7031 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007032 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007033 return false;
7034
Daniel Sanders379d44b2014-07-16 11:52:23 +00007035 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007036 .Cases("mips2", "mips3", "mips4", "mips5", true)
7037 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7038 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7039 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007040}
7041
Toma Tabacu94ea6862015-06-16 13:54:13 +00007042bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7043 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007044 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007045 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7046
7047 // FPXX shouldn't be used if -msingle-float is present.
7048 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7049 options::OPT_mdouble_float))
7050 if (A->getOption().matches(options::OPT_msingle_float))
7051 UseFPXX = false;
7052
7053 return UseFPXX;
7054}
7055
Tim Northover157d9112014-01-16 08:48:16 +00007056llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007057 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7058 // archs which Darwin doesn't use.
7059
7060 // The matching this routine does is fairly pointless, since it is neither the
7061 // complete architecture list, nor a reasonable subset. The problem is that
7062 // historically the driver driver accepts this and also ties its -march=
7063 // handling to the architecture name, so we need to be careful before removing
7064 // support for it.
7065
7066 // This code must be kept in sync with Clang's Darwin specific argument
7067 // translation.
7068
7069 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007070 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7071 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7072 .Case("ppc64", llvm::Triple::ppc64)
7073 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7074 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7075 llvm::Triple::x86)
7076 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7077 // This is derived from the driver driver.
7078 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7079 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7080 .Cases("armv7s", "xscale", llvm::Triple::arm)
7081 .Case("arm64", llvm::Triple::aarch64)
7082 .Case("r600", llvm::Triple::r600)
7083 .Case("amdgcn", llvm::Triple::amdgcn)
7084 .Case("nvptx", llvm::Triple::nvptx)
7085 .Case("nvptx64", llvm::Triple::nvptx64)
7086 .Case("amdil", llvm::Triple::amdil)
7087 .Case("spir", llvm::Triple::spir)
7088 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007089}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007090
Tim Northover157d9112014-01-16 08:48:16 +00007091void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007092 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007093 T.setArch(Arch);
7094
7095 if (Str == "x86_64h")
7096 T.setArchName(Str);
7097 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7098 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007099 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007100 }
7101}
7102
Bob Wilsondecc03e2012-11-23 06:14:39 +00007103const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007104 const InputInfo &Input) {
7105 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007106}
7107
Bob Wilsondecc03e2012-11-23 06:14:39 +00007108const char *Clang::getBaseInputStem(const ArgList &Args,
7109 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007110 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007111
Chris Lattner906bb902011-01-16 08:14:11 +00007112 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007113 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007114
7115 return Str;
7116}
7117
Bob Wilsondecc03e2012-11-23 06:14:39 +00007118const char *Clang::getDependencyFileName(const ArgList &Args,
7119 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007120 // FIXME: Think about this more.
7121 std::string Res;
7122
7123 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007124 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007125 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007126 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007127 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007128 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007129 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007130}
7131
Douglas Katzman95354292015-06-23 20:42:09 +00007132void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7133 const InputInfo &Output,
7134 const InputInfoList &Inputs,
7135 const ArgList &Args,
7136 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007137 const ToolChain &ToolChain = getToolChain();
7138 const Driver &D = ToolChain.getDriver();
7139 ArgStringList CmdArgs;
7140
7141 // Silence warning for "clang -g foo.o -o foo"
7142 Args.ClaimAllArgs(options::OPT_g_Group);
7143 // and "clang -emit-llvm foo.o -o foo"
7144 Args.ClaimAllArgs(options::OPT_emit_llvm);
7145 // and for "clang -w foo.o -o foo". Other warning options are already
7146 // handled somewhere else.
7147 Args.ClaimAllArgs(options::OPT_w);
7148
7149 if (!D.SysRoot.empty())
7150 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7151
7152 // CloudABI only supports static linkage.
7153 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007154
7155 // CloudABI uses Position Independent Executables exclusively.
7156 CmdArgs.push_back("-pie");
7157 CmdArgs.push_back("--no-dynamic-linker");
7158 CmdArgs.push_back("-zrelro");
7159
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007160 CmdArgs.push_back("--eh-frame-hdr");
7161 CmdArgs.push_back("--gc-sections");
7162
7163 if (Output.isFilename()) {
7164 CmdArgs.push_back("-o");
7165 CmdArgs.push_back(Output.getFilename());
7166 } else {
7167 assert(Output.isNothing() && "Invalid output.");
7168 }
7169
Douglas Katzman78b37b02015-11-17 20:28:07 +00007170 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007171 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7172 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7173 }
7174
7175 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007176 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007177 Args.AddAllArgs(CmdArgs,
7178 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7179 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007180
Teresa Johnson945bc502015-10-15 20:35:53 +00007181 if (D.isUsingLTO())
7182 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007183
7184 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7185
Douglas Katzman78b37b02015-11-17 20:28:07 +00007186 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007187 if (D.CCCIsCXX())
7188 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7189 CmdArgs.push_back("-lc");
7190 CmdArgs.push_back("-lcompiler_rt");
7191 }
7192
Douglas Katzman78b37b02015-11-17 20:28:07 +00007193 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007194 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7195
7196 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007197 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007198}
7199
Douglas Katzman95354292015-06-23 20:42:09 +00007200void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7201 const InputInfo &Output,
7202 const InputInfoList &Inputs,
7203 const ArgList &Args,
7204 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007205 ArgStringList CmdArgs;
7206
7207 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7208 const InputInfo &Input = Inputs[0];
7209
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007210 // Determine the original source input.
7211 const Action *SourceAction = &JA;
7212 while (SourceAction->getKind() != Action::InputClass) {
7213 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7214 SourceAction = SourceAction->getInputs()[0];
7215 }
7216
Eric Christopherf5a8f492015-12-08 00:10:10 +00007217 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007218 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007219 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7220 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007221 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007222 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007223 const llvm::Triple &T(getToolChain().getTriple());
7224 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007225 CmdArgs.push_back("-Q");
7226 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007227
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007228 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007229 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007230 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007231 if (Args.hasArg(options::OPT_gstabs))
7232 CmdArgs.push_back("--gstabs");
7233 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007234 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007235 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007236
Daniel Dunbarbe220842009-03-20 16:06:39 +00007237 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007238 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007239
Daniel Dunbar6d484762010-07-22 01:47:22 +00007240 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007241 if (getToolChain().getArch() == llvm::Triple::x86 ||
7242 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007243 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7244 CmdArgs.push_back("-force_cpusubtype_ALL");
7245
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007246 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007247 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007248 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007249 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007250 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007251 CmdArgs.push_back("-static");
7252
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007253 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007254
7255 assert(Output.isFilename() && "Unexpected lipo output.");
7256 CmdArgs.push_back("-o");
7257 CmdArgs.push_back(Output.getFilename());
7258
Daniel Dunbarb440f562010-08-02 02:38:21 +00007259 assert(Input.isFilename() && "Invalid input.");
7260 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007261
7262 // asm_final spec is empty.
7263
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007264 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007265 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007266}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007267
Tim Northover157d9112014-01-16 08:48:16 +00007268void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007269
Tim Northover157d9112014-01-16 08:48:16 +00007270void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7271 ArgStringList &CmdArgs) const {
7272 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007273
Daniel Dunbarc1964212009-03-26 16:23:12 +00007274 // Derived from darwin_arch spec.
7275 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007276 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007277
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007278 // FIXME: Is this needed anymore?
7279 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007280 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007281}
7282
Douglas Katzman95354292015-06-23 20:42:09 +00007283bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007284 // We only need to generate a temp path for LTO if we aren't compiling object
7285 // files. When compiling source files, we run 'dsymutil' after linking. We
7286 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007287 for (const auto &Input : Inputs)
7288 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007289 return true;
7290
7291 return false;
7292}
7293
Douglas Katzman95354292015-06-23 20:42:09 +00007294void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7295 ArgStringList &CmdArgs,
7296 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007297 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007298 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007299
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007300 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007301 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007302 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007303 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007304 }
7305
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007306 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007307 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007308 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7309 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007310
Bob Wilson3d27dad2013-08-02 22:25:34 +00007311 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7312 CmdArgs.push_back("-export_dynamic");
7313
Bob Wilsonb111ec92015-03-02 19:01:14 +00007314 // If we are using App Extension restrictions, pass a flag to the linker
7315 // telling it that the compiled code has been audited.
7316 if (Args.hasFlag(options::OPT_fapplication_extension,
7317 options::OPT_fno_application_extension, false))
7318 CmdArgs.push_back("-application_extension");
7319
Teresa Johnson945bc502015-10-15 20:35:53 +00007320 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007321 // If we are using LTO, then automatically create a temporary file path for
7322 // the linker to use, so that it's lifetime will extend past a possible
7323 // dsymutil step.
7324 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7325 const char *TmpPath = C.getArgs().MakeArgString(
7326 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7327 C.addTempFile(TmpPath);
7328 CmdArgs.push_back("-object_path_lto");
7329 CmdArgs.push_back(TmpPath);
7330 }
7331
7332 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7333 // it in clang installed libraries. If not found, the option is not used
7334 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7335 if (Version[0] >= 133) {
7336 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7337 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7338 SmallString<128> LibLTOPath(P);
7339 llvm::sys::path::append(LibLTOPath, "lib");
7340 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7341 if (llvm::sys::fs::exists(LibLTOPath)) {
7342 CmdArgs.push_back("-lto_library");
7343 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7344 } else {
7345 D.Diag(diag::warn_drv_lto_libpath);
7346 }
7347 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007348 }
7349
Daniel Dunbarc1964212009-03-26 16:23:12 +00007350 // Derived from the "link" spec.
7351 Args.AddAllArgs(CmdArgs, options::OPT_static);
7352 if (!Args.hasArg(options::OPT_static))
7353 CmdArgs.push_back("-dynamic");
7354 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7355 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7356 // here. How do we wish to handle such things?
7357 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007358
Daniel Dunbarc1964212009-03-26 16:23:12 +00007359 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007360 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007361 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007362 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007363
7364 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7365 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7366 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7367
7368 Arg *A;
7369 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7370 (A = Args.getLastArg(options::OPT_current__version)) ||
7371 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007372 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7373 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007374
7375 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7376 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7377 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7378 } else {
7379 CmdArgs.push_back("-dylib");
7380
7381 Arg *A;
7382 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7383 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7384 (A = Args.getLastArg(options::OPT_client__name)) ||
7385 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7386 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7387 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007388 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7389 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007390
Daniel Dunbarc1964212009-03-26 16:23:12 +00007391 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7392 "-dylib_compatibility_version");
7393 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7394 "-dylib_current_version");
7395
Tim Northover157d9112014-01-16 08:48:16 +00007396 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007397
7398 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7399 "-dylib_install_name");
7400 }
7401
7402 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7403 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7404 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007405 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007406 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007407 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7408 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7409 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7410 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7411 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7412 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007413 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007414 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7415 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7416 Args.AddAllArgs(CmdArgs, options::OPT_init);
7417
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007418 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007419 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007420
Daniel Dunbarc1964212009-03-26 16:23:12 +00007421 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7422 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7423 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7424 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7425 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007426
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007427 if (const Arg *A =
7428 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7429 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007430 if (A->getOption().matches(options::OPT_fpie) ||
7431 A->getOption().matches(options::OPT_fPIE))
7432 CmdArgs.push_back("-pie");
7433 else
7434 CmdArgs.push_back("-no_pie");
7435 }
Steven Wu574b0f22016-03-01 01:07:58 +00007436 // for embed-bitcode, use -bitcode_bundle in linker command
7437 if (C.getDriver().embedBitcodeEnabled() ||
7438 C.getDriver().embedBitcodeMarkerOnly()) {
7439 // Check if the toolchain supports bitcode build flow.
7440 if (MachOTC.SupportsEmbeddedBitcode())
7441 CmdArgs.push_back("-bitcode_bundle");
7442 else
7443 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7444 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007445
7446 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7447 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7448 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7449 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7450 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7451 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7452 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7453 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7454 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7455 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7456 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7457 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7458 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7459 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7460 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7461 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007462
Daniel Dunbar84384642011-05-02 21:03:47 +00007463 // Give --sysroot= preference, over the Apple specific behavior to also use
7464 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007465 StringRef sysroot = C.getSysRoot();
7466 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007467 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007468 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007469 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7470 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007471 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007472 }
7473
Daniel Dunbarc1964212009-03-26 16:23:12 +00007474 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7475 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7476 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7477 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7478 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007479 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007480 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7481 Args.AddAllArgs(CmdArgs, options::OPT_y);
7482 Args.AddLastArg(CmdArgs, options::OPT_w);
7483 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7484 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7485 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7486 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7487 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7488 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7489 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7490 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7491 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7492 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7493 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7494 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7495}
7496
Douglas Katzman95354292015-06-23 20:42:09 +00007497void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7498 const InputInfo &Output,
7499 const InputInfoList &Inputs,
7500 const ArgList &Args,
7501 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007502 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007503
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007504 // If the number of arguments surpasses the system limits, we will encode the
7505 // input files in a separate file, shortening the command line. To this end,
7506 // build a list of input file names that can be passed via a file with the
7507 // -filelist linker option.
7508 llvm::opt::ArgStringList InputFileList;
7509
Daniel Dunbarc1964212009-03-26 16:23:12 +00007510 // The logic here is derived from gcc's behavior; most of which
7511 // comes from specs (starting with link_command). Consult gcc for
7512 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007513 ArgStringList CmdArgs;
7514
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007515 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7516 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7517 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007518 for (const auto &Arg : Args)
7519 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007520 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007521 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007522 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007523 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007524 return;
7525 }
7526
Daniel Dunbarc1964212009-03-26 16:23:12 +00007527 // I'm not sure why this particular decomposition exists in gcc, but
7528 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007529 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007530
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007531 // It seems that the 'e' option is completely ignored for dynamic executables
7532 // (the default), and with static executables, the last one wins, as expected.
7533 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7534 options::OPT_Z_Flag, options::OPT_u_Group,
7535 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007536
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007537 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7538 // members of static archive libraries which implement Objective-C classes or
7539 // categories.
7540 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7541 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007542
Daniel Dunbarc1964212009-03-26 16:23:12 +00007543 CmdArgs.push_back("-o");
7544 CmdArgs.push_back(Output.getFilename());
7545
Douglas Katzman78b37b02015-11-17 20:28:07 +00007546 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007547 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007548
Peter Collingbournec4122c12015-06-15 21:08:13 +00007549 // SafeStack requires its own runtime libraries
7550 // These libraries should be linked first, to make sure the
7551 // __safestack_init constructor executes before everything else
7552 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7553 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7554 "libclang_rt.safestack_osx.a",
7555 /*AlwaysLink=*/true);
7556 }
7557
Daniel Dunbarc1964212009-03-26 16:23:12 +00007558 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007559
Douglas Gregor9295df02012-05-15 21:00:27 +00007560 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007561 // Build the input file for -filelist (list of linker input files) in case we
7562 // need it later
7563 for (const auto &II : Inputs) {
7564 if (!II.isFilename()) {
7565 // This is a linker input argument.
7566 // We cannot mix input arguments and file names in a -filelist input, thus
7567 // we prematurely stop our list (remaining files shall be passed as
7568 // arguments).
7569 if (InputFileList.size() > 0)
7570 break;
7571
7572 continue;
7573 }
7574
7575 InputFileList.push_back(II.getFilename());
7576 }
7577
Douglas Katzman78b37b02015-11-17 20:28:07 +00007578 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007579 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7580
Douglas Katzman78b37b02015-11-17 20:28:07 +00007581 if (isObjCRuntimeLinked(Args) &&
7582 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007583 // We use arclite library for both ARC and subscripting support.
7584 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7585
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007586 CmdArgs.push_back("-framework");
7587 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007588 // Link libobj.
7589 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007590 }
John McCall31168b02011-06-15 23:02:42 +00007591
Daniel Dunbarc1964212009-03-26 16:23:12 +00007592 if (LinkingOutput) {
7593 CmdArgs.push_back("-arch_multiple");
7594 CmdArgs.push_back("-final_output");
7595 CmdArgs.push_back(LinkingOutput);
7596 }
7597
Daniel Dunbarc1964212009-03-26 16:23:12 +00007598 if (Args.hasArg(options::OPT_fnested_functions))
7599 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007600
Justin Bognerc7701242015-05-12 05:44:36 +00007601 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7602
Douglas Katzman78b37b02015-11-17 20:28:07 +00007603 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007604 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007605 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007606
Daniel Dunbarc1964212009-03-26 16:23:12 +00007607 // link_ssp spec is empty.
7608
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007609 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007610 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007611 }
7612
Douglas Katzman78b37b02015-11-17 20:28:07 +00007613 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007614 // endfile_spec is empty.
7615 }
7616
7617 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7618 Args.AddAllArgs(CmdArgs, options::OPT_F);
7619
Steven Wu3ffb61b2015-02-06 18:08:29 +00007620 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007621 for (const Arg *A : Args.filtered(options::OPT_iframework))
7622 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007623
Douglas Katzman78b37b02015-11-17 20:28:07 +00007624 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007625 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7626 if (A->getValue() == StringRef("Accelerate")) {
7627 CmdArgs.push_back("-framework");
7628 CmdArgs.push_back("Accelerate");
7629 }
7630 }
7631 }
7632
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007633 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007634 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007635 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007636 Cmd->setInputFileList(std::move(InputFileList));
7637 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007638}
7639
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007640void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007641 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007642 const InputInfoList &Inputs,
7643 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007644 const char *LinkingOutput) const {
7645 ArgStringList CmdArgs;
7646
7647 CmdArgs.push_back("-create");
7648 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007649
7650 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007651 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007652
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007653 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007654 assert(II.isFilename() && "Unexpected lipo input.");
7655 CmdArgs.push_back(II.getFilename());
7656 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007657
7658 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007659 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007660}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007661
Daniel Dunbar88299622010-06-04 18:28:36 +00007662void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007663 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007664 const InputInfoList &Inputs,
7665 const ArgList &Args,
7666 const char *LinkingOutput) const {
7667 ArgStringList CmdArgs;
7668
Daniel Dunbareb86b042011-05-09 17:23:16 +00007669 CmdArgs.push_back("-o");
7670 CmdArgs.push_back(Output.getFilename());
7671
Daniel Dunbar88299622010-06-04 18:28:36 +00007672 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7673 const InputInfo &Input = Inputs[0];
7674 assert(Input.isFilename() && "Unexpected dsymutil input.");
7675 CmdArgs.push_back(Input.getFilename());
7676
Daniel Dunbar88299622010-06-04 18:28:36 +00007677 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007678 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007679 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007680}
7681
Eric Christopher551ef452011-08-23 17:56:55 +00007682void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007683 const InputInfo &Output,
7684 const InputInfoList &Inputs,
7685 const ArgList &Args,
7686 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007687 ArgStringList CmdArgs;
7688 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007689 CmdArgs.push_back("--debug-info");
7690 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007691 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007692
7693 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7694 const InputInfo &Input = Inputs[0];
7695 assert(Input.isFilename() && "Unexpected verify input");
7696
7697 // Grabbing the output of the earlier dsymutil run.
7698 CmdArgs.push_back(Input.getFilename());
7699
7700 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007701 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007702 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007703}
7704
Douglas Katzman95354292015-06-23 20:42:09 +00007705void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007706 const InputInfo &Output,
7707 const InputInfoList &Inputs,
7708 const ArgList &Args,
7709 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007710 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007711 ArgStringList CmdArgs;
7712
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007713 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007714
7715 CmdArgs.push_back("-o");
7716 CmdArgs.push_back(Output.getFilename());
7717
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007718 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007719 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007720
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007721 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007722 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007723}
7724
Douglas Katzman95354292015-06-23 20:42:09 +00007725void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7726 const InputInfo &Output,
7727 const InputInfoList &Inputs,
7728 const ArgList &Args,
7729 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007730 ArgStringList CmdArgs;
7731
David Chisnall272a0712012-02-29 15:06:12 +00007732 // Demangle C++ names in errors
7733 CmdArgs.push_back("-C");
7734
Douglas Katzman78b37b02015-11-17 20:28:07 +00007735 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007736 CmdArgs.push_back("-e");
7737 CmdArgs.push_back("_start");
7738 }
7739
7740 if (Args.hasArg(options::OPT_static)) {
7741 CmdArgs.push_back("-Bstatic");
7742 CmdArgs.push_back("-dn");
7743 } else {
7744 CmdArgs.push_back("-Bdynamic");
7745 if (Args.hasArg(options::OPT_shared)) {
7746 CmdArgs.push_back("-shared");
7747 } else {
7748 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007749 CmdArgs.push_back(
7750 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007751 }
7752 }
7753
7754 if (Output.isFilename()) {
7755 CmdArgs.push_back("-o");
7756 CmdArgs.push_back(Output.getFilename());
7757 } else {
7758 assert(Output.isNothing() && "Invalid output.");
7759 }
7760
Douglas Katzman78b37b02015-11-17 20:28:07 +00007761 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007762 if (!Args.hasArg(options::OPT_shared))
7763 CmdArgs.push_back(
7764 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7765
7766 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7767 CmdArgs.push_back(
7768 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7769 CmdArgs.push_back(
7770 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007771 }
7772
Douglas Katzman6059ef92015-11-17 17:41:23 +00007773 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007774
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007775 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7776 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007777
7778 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7779
Douglas Katzman78b37b02015-11-17 20:28:07 +00007780 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007781 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007782 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007783 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007784 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007785 if (!Args.hasArg(options::OPT_shared)) {
7786 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007787 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007788 }
David Chisnallf571cde2012-02-15 13:39:01 +00007789 }
7790
Douglas Katzman78b37b02015-11-17 20:28:07 +00007791 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007792 CmdArgs.push_back(
7793 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007794 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007795 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007796
Xinliang David Li69306c02015-10-22 06:15:31 +00007797 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007798
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007799 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007800 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007801}
7802
Douglas Katzman95354292015-06-23 20:42:09 +00007803void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7804 const InputInfo &Output,
7805 const InputInfoList &Inputs,
7806 const ArgList &Args,
7807 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007808 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007809 ArgStringList CmdArgs;
7810
Rafael Espindolacc126272014-02-28 01:55:21 +00007811 switch (getToolChain().getArch()) {
7812 case llvm::Triple::x86:
7813 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7814 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007815 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007816 break;
7817
7818 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007819 CmdArgs.push_back("-mppc");
7820 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007821 break;
7822
7823 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007824 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007825 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007826 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7827 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7828 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007829 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007830 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007831
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007832 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007833 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007834 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7835 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7836 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007837 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007838 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007839
7840 case llvm::Triple::mips64:
7841 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007842 StringRef CPUName;
7843 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007844 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007845
7846 CmdArgs.push_back("-mabi");
7847 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7848
7849 if (getToolChain().getArch() == llvm::Triple::mips64)
7850 CmdArgs.push_back("-EB");
7851 else
7852 CmdArgs.push_back("-EL");
7853
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007854 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007855 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007856 }
7857
Rafael Espindolacc126272014-02-28 01:55:21 +00007858 default:
7859 break;
7860 }
7861
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007862 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007863
7864 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007865 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007866
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007867 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007868 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007869
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007870 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007871 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007872}
7873
Douglas Katzman95354292015-06-23 20:42:09 +00007874void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7875 const InputInfo &Output,
7876 const InputInfoList &Inputs,
7877 const ArgList &Args,
7878 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007879 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007880 ArgStringList CmdArgs;
7881
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007882 // Silence warning for "clang -g foo.o -o foo"
7883 Args.ClaimAllArgs(options::OPT_g_Group);
7884 // and "clang -emit-llvm foo.o -o foo"
7885 Args.ClaimAllArgs(options::OPT_emit_llvm);
7886 // and for "clang -w foo.o -o foo". Other warning options are already
7887 // handled somewhere else.
7888 Args.ClaimAllArgs(options::OPT_w);
7889
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007890 if (getToolChain().getArch() == llvm::Triple::mips64)
7891 CmdArgs.push_back("-EB");
7892 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7893 CmdArgs.push_back("-EL");
7894
Douglas Katzman78b37b02015-11-17 20:28:07 +00007895 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007896 CmdArgs.push_back("-e");
7897 CmdArgs.push_back("__start");
7898 }
7899
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007900 if (Args.hasArg(options::OPT_static)) {
7901 CmdArgs.push_back("-Bstatic");
7902 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007903 if (Args.hasArg(options::OPT_rdynamic))
7904 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007905 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007906 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007907 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007908 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007909 } else {
7910 CmdArgs.push_back("-dynamic-linker");
7911 CmdArgs.push_back("/usr/libexec/ld.so");
7912 }
7913 }
7914
Rafael Espindola044f7832013-06-05 04:28:55 +00007915 if (Args.hasArg(options::OPT_nopie))
7916 CmdArgs.push_back("-nopie");
7917
Daniel Dunbarb440f562010-08-02 02:38:21 +00007918 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007919 CmdArgs.push_back("-o");
7920 CmdArgs.push_back(Output.getFilename());
7921 } else {
7922 assert(Output.isNothing() && "Invalid output.");
7923 }
7924
Douglas Katzman78b37b02015-11-17 20:28:07 +00007925 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007926 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007927 if (Args.hasArg(options::OPT_pg))
7928 CmdArgs.push_back(
7929 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007930 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007931 CmdArgs.push_back(
7932 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7933 CmdArgs.push_back(
7934 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007935 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007936 CmdArgs.push_back(
7937 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007938 }
7939 }
7940
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007941 std::string Triple = getToolChain().getTripleString();
7942 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007943 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007944 CmdArgs.push_back(
7945 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007946
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007947 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7948 options::OPT_e, options::OPT_s, options::OPT_t,
7949 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007950
Daniel Dunbar54423b22010-09-17 00:24:54 +00007951 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007952
Douglas Katzman78b37b02015-11-17 20:28:07 +00007953 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007954 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007955 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007956 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007957 CmdArgs.push_back("-lm_p");
7958 else
7959 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007960 }
7961
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007962 // FIXME: For some reason GCC passes -lgcc before adding
7963 // the default system libraries. Just mimic this for now.
7964 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007965
Eric Christopher17674ec2012-09-13 06:32:34 +00007966 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007967 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7968 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007969 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007970 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007971 }
7972
Chandler Carruth45661652011-12-17 22:32:42 +00007973 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007974 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007975 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007976 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007977 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007978 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007979
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007980 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007981 }
7982
Douglas Katzman78b37b02015-11-17 20:28:07 +00007983 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007984 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007985 CmdArgs.push_back(
7986 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007987 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007988 CmdArgs.push_back(
7989 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007990 }
7991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007992 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007993 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007994}
Ed Schoutene33194b2009-04-02 19:13:12 +00007995
Douglas Katzman95354292015-06-23 20:42:09 +00007996void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7997 const InputInfo &Output,
7998 const InputInfoList &Inputs,
7999 const ArgList &Args,
8000 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008001 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00008002 ArgStringList CmdArgs;
8003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008004 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00008005
8006 CmdArgs.push_back("-o");
8007 CmdArgs.push_back(Output.getFilename());
8008
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008009 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008010 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008011
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008012 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008013 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008014}
8015
Douglas Katzman95354292015-06-23 20:42:09 +00008016void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8017 const InputInfo &Output,
8018 const InputInfoList &Inputs,
8019 const ArgList &Args,
8020 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008021 const Driver &D = getToolChain().getDriver();
8022 ArgStringList CmdArgs;
8023
Douglas Katzman78b37b02015-11-17 20:28:07 +00008024 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008025 CmdArgs.push_back("-e");
8026 CmdArgs.push_back("__start");
8027 }
8028
8029 if (Args.hasArg(options::OPT_static)) {
8030 CmdArgs.push_back("-Bstatic");
8031 } else {
8032 if (Args.hasArg(options::OPT_rdynamic))
8033 CmdArgs.push_back("-export-dynamic");
8034 CmdArgs.push_back("--eh-frame-hdr");
8035 CmdArgs.push_back("-Bdynamic");
8036 if (Args.hasArg(options::OPT_shared)) {
8037 CmdArgs.push_back("-shared");
8038 } else {
8039 CmdArgs.push_back("-dynamic-linker");
8040 CmdArgs.push_back("/usr/libexec/ld.so");
8041 }
8042 }
8043
8044 if (Output.isFilename()) {
8045 CmdArgs.push_back("-o");
8046 CmdArgs.push_back(Output.getFilename());
8047 } else {
8048 assert(Output.isNothing() && "Invalid output.");
8049 }
8050
Douglas Katzman78b37b02015-11-17 20:28:07 +00008051 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008052 if (!Args.hasArg(options::OPT_shared)) {
8053 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008054 CmdArgs.push_back(
8055 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008056 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008057 CmdArgs.push_back(
8058 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8059 CmdArgs.push_back(
8060 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008061 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008062 CmdArgs.push_back(
8063 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008064 }
8065 }
8066
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008067 Args.AddAllArgs(CmdArgs,
8068 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008069
8070 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8071
Douglas Katzman78b37b02015-11-17 20:28:07 +00008072 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008073 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008074 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8075 if (Args.hasArg(options::OPT_pg))
8076 CmdArgs.push_back("-lm_p");
8077 else
8078 CmdArgs.push_back("-lm");
8079 }
8080
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008081 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008082 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008083 CmdArgs.push_back("-lpthread_p");
8084 else
8085 CmdArgs.push_back("-lpthread");
8086 }
8087
Eli Friedman9fa28852012-08-08 23:57:20 +00008088 if (!Args.hasArg(options::OPT_shared)) {
8089 if (Args.hasArg(options::OPT_pg))
8090 CmdArgs.push_back("-lc_p");
8091 else
8092 CmdArgs.push_back("-lc");
8093 }
8094
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008095 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008096 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008097 case llvm::Triple::arm:
8098 MyArch = "arm";
8099 break;
8100 case llvm::Triple::x86:
8101 MyArch = "i386";
8102 break;
8103 case llvm::Triple::x86_64:
8104 MyArch = "amd64";
8105 break;
8106 default:
8107 llvm_unreachable("Unsupported architecture");
8108 }
8109 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008110 }
8111
Douglas Katzman78b37b02015-11-17 20:28:07 +00008112 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008113 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008114 CmdArgs.push_back(
8115 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008116 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008117 CmdArgs.push_back(
8118 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008119 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008120
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008121 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008122 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008123}
8124
Douglas Katzman95354292015-06-23 20:42:09 +00008125void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8126 const InputInfo &Output,
8127 const InputInfoList &Inputs,
8128 const ArgList &Args,
8129 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008130 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008131 ArgStringList CmdArgs;
8132
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008133 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8134 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008135 switch (getToolChain().getArch()) {
8136 default:
8137 break;
8138 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008139 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008140 break;
8141 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008142 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008143 break;
8144 case llvm::Triple::mips:
8145 case llvm::Triple::mipsel:
8146 case llvm::Triple::mips64:
8147 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008148 StringRef CPUName;
8149 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008150 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008151
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008152 CmdArgs.push_back("-march");
8153 CmdArgs.push_back(CPUName.data());
8154
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008155 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008156 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008157
8158 if (getToolChain().getArch() == llvm::Triple::mips ||
8159 getToolChain().getArch() == llvm::Triple::mips64)
8160 CmdArgs.push_back("-EB");
8161 else
8162 CmdArgs.push_back("-EL");
8163
Dimitry Andric46f338c2015-12-27 10:36:44 +00008164 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8165 StringRef v = A->getValue();
8166 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8167 A->claim();
8168 }
8169
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008170 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008171 break;
8172 }
8173 case llvm::Triple::arm:
8174 case llvm::Triple::armeb:
8175 case llvm::Triple::thumb:
8176 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008177 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008178
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008179 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008180 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008181 else
Renato Golinf4421f72014-02-19 10:44:07 +00008182 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008183
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008184 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008185 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008186 case llvm::Triple::GNUEABI:
8187 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008188 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008189 break;
8190
8191 default:
8192 CmdArgs.push_back("-matpcs");
8193 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008194 break;
8195 }
8196 case llvm::Triple::sparc:
8197 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008198 case llvm::Triple::sparcv9: {
8199 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8200 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008201 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008202 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008203 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008204 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008206 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008207
8208 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008209 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008210
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008211 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008212 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008213
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008214 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008215 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008216}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008217
Douglas Katzman95354292015-06-23 20:42:09 +00008218void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8219 const InputInfo &Output,
8220 const InputInfoList &Inputs,
8221 const ArgList &Args,
8222 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008223 const toolchains::FreeBSD &ToolChain =
8224 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008225 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008226 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008227 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008228 !Args.hasArg(options::OPT_shared) &&
8229 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008230 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008231
8232 // Silence warning for "clang -g foo.o -o foo"
8233 Args.ClaimAllArgs(options::OPT_g_Group);
8234 // and "clang -emit-llvm foo.o -o foo"
8235 Args.ClaimAllArgs(options::OPT_emit_llvm);
8236 // and for "clang -w foo.o -o foo". Other warning options are already
8237 // handled somewhere else.
8238 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008239
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008240 if (!D.SysRoot.empty())
8241 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8242
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008243 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008244 CmdArgs.push_back("-pie");
8245
Ed Maste1bc232d2016-04-12 21:11:46 +00008246 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008247 if (Args.hasArg(options::OPT_static)) {
8248 CmdArgs.push_back("-Bstatic");
8249 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008250 if (Args.hasArg(options::OPT_rdynamic))
8251 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008252 if (Args.hasArg(options::OPT_shared)) {
8253 CmdArgs.push_back("-Bshareable");
8254 } else {
8255 CmdArgs.push_back("-dynamic-linker");
8256 CmdArgs.push_back("/libexec/ld-elf.so.1");
8257 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008258 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008259 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8260 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8261 CmdArgs.push_back("--hash-style=both");
8262 }
8263 }
8264 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008265 }
8266
8267 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8268 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008269 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008270 CmdArgs.push_back("-m");
8271 CmdArgs.push_back("elf_i386_fbsd");
8272 }
8273
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008274 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008275 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008276 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008277 }
8278
Dimitry Andric904895f2015-12-27 06:47:09 +00008279 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8280 if (ToolChain.getArch() == llvm::Triple::mips ||
8281 ToolChain.getArch() == llvm::Triple::mipsel ||
8282 ToolChain.getArch() == llvm::Triple::mips64 ||
8283 ToolChain.getArch() == llvm::Triple::mips64el) {
8284 StringRef v = A->getValue();
8285 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8286 A->claim();
8287 }
8288 }
8289
Daniel Dunbarb440f562010-08-02 02:38:21 +00008290 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008291 CmdArgs.push_back("-o");
8292 CmdArgs.push_back(Output.getFilename());
8293 } else {
8294 assert(Output.isNothing() && "Invalid output.");
8295 }
8296
Douglas Katzman78b37b02015-11-17 20:28:07 +00008297 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008298 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008299 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008300 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008301 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008302 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008303 crt1 = "Scrt1.o";
8304 else
8305 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008306 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008307 if (crt1)
8308 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8309
8310 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8311
Craig Topper92fc2df2014-05-17 16:56:41 +00008312 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008313 if (Args.hasArg(options::OPT_static))
8314 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008315 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008316 crtbegin = "crtbeginS.o";
8317 else
8318 crtbegin = "crtbegin.o";
8319
8320 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008321 }
8322
8323 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008324 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008325 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8326 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008327 Args.AddAllArgs(CmdArgs, options::OPT_s);
8328 Args.AddAllArgs(CmdArgs, options::OPT_t);
8329 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8330 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008331
Teresa Johnson945bc502015-10-15 20:35:53 +00008332 if (D.isUsingLTO())
8333 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008334
Alexey Samsonov52550342014-09-15 19:58:40 +00008335 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008336 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008337
Douglas Katzman78b37b02015-11-17 20:28:07 +00008338 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008339 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008340 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008341 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008342 if (Args.hasArg(options::OPT_pg))
8343 CmdArgs.push_back("-lm_p");
8344 else
8345 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008346 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008347 if (NeedsSanitizerDeps)
8348 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008349 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8350 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008351 if (Args.hasArg(options::OPT_pg))
8352 CmdArgs.push_back("-lgcc_p");
8353 else
8354 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008355 if (Args.hasArg(options::OPT_static)) {
8356 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008357 } else if (Args.hasArg(options::OPT_pg)) {
8358 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008359 } else {
8360 CmdArgs.push_back("--as-needed");
8361 CmdArgs.push_back("-lgcc_s");
8362 CmdArgs.push_back("--no-as-needed");
8363 }
8364
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008365 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008366 if (Args.hasArg(options::OPT_pg))
8367 CmdArgs.push_back("-lpthread_p");
8368 else
8369 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008370 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008371
Roman Divacky66f22762011-02-10 16:59:40 +00008372 if (Args.hasArg(options::OPT_pg)) {
8373 if (Args.hasArg(options::OPT_shared))
8374 CmdArgs.push_back("-lc");
8375 else
8376 CmdArgs.push_back("-lc_p");
8377 CmdArgs.push_back("-lgcc_p");
8378 } else {
8379 CmdArgs.push_back("-lc");
8380 CmdArgs.push_back("-lgcc");
8381 }
8382
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008383 if (Args.hasArg(options::OPT_static)) {
8384 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008385 } else if (Args.hasArg(options::OPT_pg)) {
8386 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008387 } else {
8388 CmdArgs.push_back("--as-needed");
8389 CmdArgs.push_back("-lgcc_s");
8390 CmdArgs.push_back("--no-as-needed");
8391 }
8392 }
8393
Douglas Katzman78b37b02015-11-17 20:28:07 +00008394 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008395 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008396 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008397 else
8398 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008399 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008400 }
8401
Xinliang David Li69306c02015-10-22 06:15:31 +00008402 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008403
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008404 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008405 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008406}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008407
Douglas Katzman95354292015-06-23 20:42:09 +00008408void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008409 const InputInfo &Output,
8410 const InputInfoList &Inputs,
8411 const ArgList &Args,
8412 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008413 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008414 ArgStringList CmdArgs;
8415
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008416 // GNU as needs different flags for creating the correct output format
8417 // on architectures with different ABIs or optional feature sets.
8418 switch (getToolChain().getArch()) {
8419 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008420 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008421 break;
8422 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008423 case llvm::Triple::armeb:
8424 case llvm::Triple::thumb:
8425 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008426 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008427 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8428 std::string Arch =
8429 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008430 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008431 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008432 }
8433
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008434 case llvm::Triple::mips:
8435 case llvm::Triple::mipsel:
8436 case llvm::Triple::mips64:
8437 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008438 StringRef CPUName;
8439 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008440 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008441
8442 CmdArgs.push_back("-march");
8443 CmdArgs.push_back(CPUName.data());
8444
8445 CmdArgs.push_back("-mabi");
8446 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8447
8448 if (getToolChain().getArch() == llvm::Triple::mips ||
8449 getToolChain().getArch() == llvm::Triple::mips64)
8450 CmdArgs.push_back("-EB");
8451 else
8452 CmdArgs.push_back("-EL");
8453
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008454 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008455 break;
8456 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008457
8458 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008459 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008460 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008461 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8462 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008463 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008464 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008465 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008466
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008467 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008468 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008469 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8470 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008471 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008472 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008473 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008474
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008475 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008476 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008477 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008478
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008479 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008480
8481 CmdArgs.push_back("-o");
8482 CmdArgs.push_back(Output.getFilename());
8483
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008484 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008485 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008486
David Chisnallddbd68f2011-09-27 22:03:18 +00008487 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008488 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008489}
8490
Douglas Katzman95354292015-06-23 20:42:09 +00008491void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8492 const InputInfo &Output,
8493 const InputInfoList &Inputs,
8494 const ArgList &Args,
8495 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008496 const Driver &D = getToolChain().getDriver();
8497 ArgStringList CmdArgs;
8498
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008499 if (!D.SysRoot.empty())
8500 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8501
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008502 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008503 if (Args.hasArg(options::OPT_static)) {
8504 CmdArgs.push_back("-Bstatic");
8505 } else {
8506 if (Args.hasArg(options::OPT_rdynamic))
8507 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008508 if (Args.hasArg(options::OPT_shared)) {
8509 CmdArgs.push_back("-Bshareable");
8510 } else {
8511 CmdArgs.push_back("-dynamic-linker");
8512 CmdArgs.push_back("/libexec/ld.elf_so");
8513 }
8514 }
8515
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008516 // Many NetBSD architectures support more than one ABI.
8517 // Determine the correct emulation for ld.
8518 switch (getToolChain().getArch()) {
8519 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008520 CmdArgs.push_back("-m");
8521 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008522 break;
8523 case llvm::Triple::arm:
8524 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008525 CmdArgs.push_back("-m");
8526 switch (getToolChain().getTriple().getEnvironment()) {
8527 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008528 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008529 CmdArgs.push_back("armelf_nbsd_eabi");
8530 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008531 case llvm::Triple::EABIHF:
8532 case llvm::Triple::GNUEABIHF:
8533 CmdArgs.push_back("armelf_nbsd_eabihf");
8534 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008535 default:
8536 CmdArgs.push_back("armelf_nbsd");
8537 break;
8538 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008539 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008540 case llvm::Triple::armeb:
8541 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008542 arm::appendEBLinkFlags(
8543 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008544 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008545 CmdArgs.push_back("-m");
8546 switch (getToolChain().getTriple().getEnvironment()) {
8547 case llvm::Triple::EABI:
8548 case llvm::Triple::GNUEABI:
8549 CmdArgs.push_back("armelfb_nbsd_eabi");
8550 break;
8551 case llvm::Triple::EABIHF:
8552 case llvm::Triple::GNUEABIHF:
8553 CmdArgs.push_back("armelfb_nbsd_eabihf");
8554 break;
8555 default:
8556 CmdArgs.push_back("armelfb_nbsd");
8557 break;
8558 }
8559 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008560 case llvm::Triple::mips64:
8561 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008562 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008563 CmdArgs.push_back("-m");
8564 if (getToolChain().getArch() == llvm::Triple::mips64)
8565 CmdArgs.push_back("elf32btsmip");
8566 else
8567 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008568 } else if (mips::hasMipsAbiArg(Args, "64")) {
8569 CmdArgs.push_back("-m");
8570 if (getToolChain().getArch() == llvm::Triple::mips64)
8571 CmdArgs.push_back("elf64btsmip");
8572 else
8573 CmdArgs.push_back("elf64ltsmip");
8574 }
8575 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008576 case llvm::Triple::ppc:
8577 CmdArgs.push_back("-m");
8578 CmdArgs.push_back("elf32ppc_nbsd");
8579 break;
8580
8581 case llvm::Triple::ppc64:
8582 case llvm::Triple::ppc64le:
8583 CmdArgs.push_back("-m");
8584 CmdArgs.push_back("elf64ppc");
8585 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008586
8587 case llvm::Triple::sparc:
8588 CmdArgs.push_back("-m");
8589 CmdArgs.push_back("elf32_sparc");
8590 break;
8591
8592 case llvm::Triple::sparcv9:
8593 CmdArgs.push_back("-m");
8594 CmdArgs.push_back("elf64_sparc");
8595 break;
8596
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008597 default:
8598 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008599 }
8600
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008601 if (Output.isFilename()) {
8602 CmdArgs.push_back("-o");
8603 CmdArgs.push_back(Output.getFilename());
8604 } else {
8605 assert(Output.isNothing() && "Invalid output.");
8606 }
8607
Douglas Katzman78b37b02015-11-17 20:28:07 +00008608 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008609 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008610 CmdArgs.push_back(
8611 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8612 CmdArgs.push_back(
8613 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8614 CmdArgs.push_back(
8615 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.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("crti.o")));
8619 CmdArgs.push_back(
8620 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008621 }
8622 }
8623
8624 Args.AddAllArgs(CmdArgs, options::OPT_L);
8625 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8626 Args.AddAllArgs(CmdArgs, options::OPT_e);
8627 Args.AddAllArgs(CmdArgs, options::OPT_s);
8628 Args.AddAllArgs(CmdArgs, options::OPT_t);
8629 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8630 Args.AddAllArgs(CmdArgs, options::OPT_r);
8631
8632 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8633
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008634 unsigned Major, Minor, Micro;
8635 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8636 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008637 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008638 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008639 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008640 case llvm::Triple::arm:
8641 case llvm::Triple::armeb:
8642 case llvm::Triple::thumb:
8643 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008644 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008645 case llvm::Triple::ppc64:
8646 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008647 case llvm::Triple::sparc:
8648 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008649 case llvm::Triple::x86:
8650 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008651 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008652 break;
8653 default:
8654 break;
8655 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008656 }
8657
Douglas Katzman78b37b02015-11-17 20:28:07 +00008658 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008659 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008660 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008661 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8662 CmdArgs.push_back("-lm");
8663 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008664 if (Args.hasArg(options::OPT_pthread))
8665 CmdArgs.push_back("-lpthread");
8666 CmdArgs.push_back("-lc");
8667
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008668 if (useLibgcc) {
8669 if (Args.hasArg(options::OPT_static)) {
8670 // libgcc_eh depends on libc, so resolve as much as possible,
8671 // pull in any new requirements from libc and then get the rest
8672 // of libgcc.
8673 CmdArgs.push_back("-lgcc_eh");
8674 CmdArgs.push_back("-lc");
8675 CmdArgs.push_back("-lgcc");
8676 } else {
8677 CmdArgs.push_back("-lgcc");
8678 CmdArgs.push_back("--as-needed");
8679 CmdArgs.push_back("-lgcc_s");
8680 CmdArgs.push_back("--no-as-needed");
8681 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008682 }
8683 }
8684
Douglas Katzman78b37b02015-11-17 20:28:07 +00008685 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008686 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008687 CmdArgs.push_back(
8688 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008689 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008690 CmdArgs.push_back(
8691 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8692 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008693 }
8694
Xinliang David Li69306c02015-10-22 06:15:31 +00008695 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008696
Logan Chieneb9162f2014-06-26 14:23:45 +00008697 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008698 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008699}
8700
Douglas Katzman95354292015-06-23 20:42:09 +00008701void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8702 const InputInfo &Output,
8703 const InputInfoList &Inputs,
8704 const ArgList &Args,
8705 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008706 claimNoWarnArgs(Args);
8707
James Y Knight2db38f32015-08-15 03:45:25 +00008708 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8709 llvm::Triple Triple = llvm::Triple(TripleStr);
8710
Rafael Espindola92b00932010-08-10 00:25:48 +00008711 ArgStringList CmdArgs;
8712
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008713 llvm::Reloc::Model RelocationModel;
8714 unsigned PICLevel;
8715 bool IsPIE;
8716 std::tie(RelocationModel, PICLevel, IsPIE) =
8717 ParsePICArgs(getToolChain(), Triple, Args);
8718
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008719 switch (getToolChain().getArch()) {
8720 default:
8721 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008722 // Add --32/--64 to make sure we get the format we want.
8723 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008724 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008725 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008726 break;
8727 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008728 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8729 CmdArgs.push_back("--x32");
8730 else
8731 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008732 break;
8733 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008734 CmdArgs.push_back("-a32");
8735 CmdArgs.push_back("-mppc");
8736 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008737 break;
8738 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008739 CmdArgs.push_back("-a64");
8740 CmdArgs.push_back("-mppc64");
8741 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008742 break;
8743 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008744 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008745 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008746 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008747 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008748 break;
8749 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008750 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008751 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008752 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8753 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8754 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008755 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008756 }
8757 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008758 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008759 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8760 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8761 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008762 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008763 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008764 case llvm::Triple::arm:
8765 case llvm::Triple::armeb:
8766 case llvm::Triple::thumb:
8767 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008768 const llvm::Triple &Triple2 = getToolChain().getTriple();
8769 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008770 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008771 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008772 break;
8773 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008774 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008775 break;
8776 default:
8777 break;
8778 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008779
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008780 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008781 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8782 case arm::FloatABI::Soft:
8783 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8784 break;
8785 case arm::FloatABI::SoftFP:
8786 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8787 break;
8788 case arm::FloatABI::Hard:
8789 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8790 break;
8791 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008792
8793 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008794
8795 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008796 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008797 // march from being picked in the absence of a cpu flag.
8798 Arg *A;
8799 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008800 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008801 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008802 else
8803 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008804 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008805 break;
8806 }
8807 case llvm::Triple::mips:
8808 case llvm::Triple::mipsel:
8809 case llvm::Triple::mips64:
8810 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008811 StringRef CPUName;
8812 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008813 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008814 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008815
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008816 CmdArgs.push_back("-march");
8817 CmdArgs.push_back(CPUName.data());
8818
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008819 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008820 CmdArgs.push_back(ABIName.data());
8821
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008822 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8823 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008824 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008825 CmdArgs.push_back("-mno-shared");
8826
Daniel Sanders379d44b2014-07-16 11:52:23 +00008827 // LLVM doesn't support -mplt yet and acts as if it is always given.
8828 // However, -mplt has no effect with the N64 ABI.
8829 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008830
8831 if (getToolChain().getArch() == llvm::Triple::mips ||
8832 getToolChain().getArch() == llvm::Triple::mips64)
8833 CmdArgs.push_back("-EB");
8834 else
8835 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008836
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008837 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8838 if (StringRef(A->getValue()) == "2008")
8839 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8840 }
8841
Daniel Sanders379d44b2014-07-16 11:52:23 +00008842 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8843 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8844 options::OPT_mfp64)) {
8845 A->claim();
8846 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008847 } else if (mips::shouldUseFPXX(
8848 Args, getToolChain().getTriple(), CPUName, ABIName,
8849 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008850 CmdArgs.push_back("-mfpxx");
8851
8852 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8853 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008854 if (Arg *A =
8855 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008856 if (A->getOption().matches(options::OPT_mips16)) {
8857 A->claim();
8858 A->render(Args, CmdArgs);
8859 } else {
8860 A->claim();
8861 CmdArgs.push_back("-no-mips16");
8862 }
8863 }
8864
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008865 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8866 options::OPT_mno_micromips);
8867 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8868 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8869
Simon Atanasyanbd986632013-11-26 11:58:04 +00008870 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8871 // Do not use AddLastArg because not all versions of MIPS assembler
8872 // support -mmsa / -mno-msa options.
8873 if (A->getOption().matches(options::OPT_mmsa))
8874 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8875 }
8876
Daniel Sanders379d44b2014-07-16 11:52:23 +00008877 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8878 options::OPT_msoft_float);
8879
Toma Tabacub36d6102015-06-11 12:13:18 +00008880 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8881 options::OPT_msingle_float);
8882
Daniel Sanders379d44b2014-07-16 11:52:23 +00008883 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8884 options::OPT_mno_odd_spreg);
8885
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008886 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008887 break;
8888 }
8889 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008890 // Always pass an -march option, since our default of z10 is later
8891 // than the GNU assembler's default.
8892 StringRef CPUName = getSystemZTargetCPU(Args);
8893 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008894 break;
8895 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008896 }
8897
Renato Golina74bbc72015-07-22 15:32:36 +00008898 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008899 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008900
8901 CmdArgs.push_back("-o");
8902 CmdArgs.push_back(Output.getFilename());
8903
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008904 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008905 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008906
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008907 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008908 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008909
8910 // Handle the debug info splitting at object creation time if we're
8911 // creating an object.
8912 // TODO: Currently only works on linux with newer objcopy.
8913 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008914 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008915 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008916 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008917}
8918
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008919static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008920 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008921 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008922 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008923 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8924 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008925 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008926 CmdArgs.push_back("-lgcc");
8927
Logan Chien3d3373c2012-11-19 12:04:11 +00008928 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008929 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008930 CmdArgs.push_back("-lgcc");
8931 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008932 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008933 CmdArgs.push_back("--as-needed");
8934 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008935 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008936 CmdArgs.push_back("--no-as-needed");
8937 }
8938
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008939 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008940 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008941 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008942 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008943
8944 // According to Android ABI, we have to link with libdl if we are
8945 // linking with non-static libgcc.
8946 //
8947 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8948 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8949 if (isAndroid && !StaticLibgcc)
8950 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008951}
8952
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008953static std::string getLinuxDynamicLinker(const ArgList &Args,
8954 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008955 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8956
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008957 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008958 if (ToolChain.getTriple().isArch64Bit())
8959 return "/system/bin/linker64";
8960 else
8961 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008962 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8963 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008964 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008965 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008966 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008967 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008968 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008969 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008970 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008971 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008972 return "/lib/ld-linux-armhf.so.3";
8973 else
8974 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008975 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8976 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008977 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008978 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008979 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008980 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008981 return "/lib/ld-linux.so.3";
8982 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8983 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008984 std::string LibDir =
8985 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008986 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008987 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008988 if (mips::isUCLibc(Args))
8989 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008990 else if (!ToolChain.getTriple().hasEnvironment()) {
8991 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8992 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8993 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8994 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008995 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008996
8997 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008998 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008999 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009000 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00009001 if (ppc::hasPPCAbiArg(Args, "elfv2"))
9002 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00009003 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009004 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00009005 if (ppc::hasPPCAbiArg(Args, "elfv1"))
9006 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00009007 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009008 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00009009 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009010 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00009011 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009012 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00009013 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
9014 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00009015 else
9016 return "/lib64/ld-linux-x86-64.so.2";
9017}
9018
Renato Golinc4b49242014-02-13 10:01:16 +00009019static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009020 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009021 // Make use of compiler-rt if --rtlib option is used
9022 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9023
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009024 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009025 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009026 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009027 default:
9028 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009029 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009030 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009031 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009032 break;
9033 }
Renato Golinc4b49242014-02-13 10:01:16 +00009034 break;
9035 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009036 // Make sure libgcc is not used under MSVC environment by default
9037 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9038 // Issue error diagnostic if libgcc is explicitly specified
9039 // through command line as --rtlib option argument.
9040 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9041 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9042 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9043 }
9044 } else
9045 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009046 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009047 }
9048}
9049
Rafael Espindola1e085772014-08-15 17:14:35 +00009050static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9051 switch (T.getArch()) {
9052 case llvm::Triple::x86:
9053 return "elf_i386";
9054 case llvm::Triple::aarch64:
9055 return "aarch64linux";
9056 case llvm::Triple::aarch64_be:
9057 return "aarch64_be_linux";
9058 case llvm::Triple::arm:
9059 case llvm::Triple::thumb:
9060 return "armelf_linux_eabi";
9061 case llvm::Triple::armeb:
9062 case llvm::Triple::thumbeb:
9063 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9064 case llvm::Triple::ppc:
9065 return "elf32ppclinux";
9066 case llvm::Triple::ppc64:
9067 return "elf64ppc";
9068 case llvm::Triple::ppc64le:
9069 return "elf64lppc";
9070 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009071 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009072 return "elf32_sparc";
9073 case llvm::Triple::sparcv9:
9074 return "elf64_sparc";
9075 case llvm::Triple::mips:
9076 return "elf32btsmip";
9077 case llvm::Triple::mipsel:
9078 return "elf32ltsmip";
9079 case llvm::Triple::mips64:
9080 if (mips::hasMipsAbiArg(Args, "n32"))
9081 return "elf32btsmipn32";
9082 return "elf64btsmip";
9083 case llvm::Triple::mips64el:
9084 if (mips::hasMipsAbiArg(Args, "n32"))
9085 return "elf32ltsmipn32";
9086 return "elf64ltsmip";
9087 case llvm::Triple::systemz:
9088 return "elf64_s390";
9089 case llvm::Triple::x86_64:
9090 if (T.getEnvironment() == llvm::Triple::GNUX32)
9091 return "elf32_x86_64";
9092 return "elf_x86_64";
9093 default:
9094 llvm_unreachable("Unexpected arch");
9095 }
9096}
9097
Douglas Katzman95354292015-06-23 20:42:09 +00009098void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9099 const InputInfo &Output,
9100 const InputInfoList &Inputs,
9101 const ArgList &Args,
9102 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009103 const toolchains::Linux &ToolChain =
9104 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009105 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009106
9107 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9108 llvm::Triple Triple = llvm::Triple(TripleStr);
9109
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009110 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009111 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009112 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009113 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9114 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009115 const bool HasCRTBeginEndFiles =
9116 ToolChain.getTriple().hasEnvironment() ||
9117 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009118
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009119 ArgStringList CmdArgs;
9120
Rafael Espindolad1002f62010-11-15 18:28:16 +00009121 // Silence warning for "clang -g foo.o -o foo"
9122 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009123 // and "clang -emit-llvm foo.o -o foo"
9124 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009125 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009126 // handled somewhere else.
9127 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009128
Peter Collingbourne39719a72015-11-20 20:49:39 +00009129 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9130 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009131 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009132 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009133 CmdArgs.push_back("-target");
9134 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9135 }
9136
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009137 if (!D.SysRoot.empty())
9138 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009139
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009140 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009141 CmdArgs.push_back("-pie");
9142
Rafael Espindola1c76c592010-11-07 22:57:16 +00009143 if (Args.hasArg(options::OPT_rdynamic))
9144 CmdArgs.push_back("-export-dynamic");
9145
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009146 if (Args.hasArg(options::OPT_s))
9147 CmdArgs.push_back("-s");
9148
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009149 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009150 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009151
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009152 for (const auto &Opt : ToolChain.ExtraOpts)
9153 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009154
9155 if (!Args.hasArg(options::OPT_static)) {
9156 CmdArgs.push_back("--eh-frame-hdr");
9157 }
9158
9159 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009160 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009161
9162 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009163 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9164 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009165 CmdArgs.push_back("-Bstatic");
9166 else
9167 CmdArgs.push_back("-static");
9168 } else if (Args.hasArg(options::OPT_shared)) {
9169 CmdArgs.push_back("-shared");
9170 }
9171
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009172 if (!Args.hasArg(options::OPT_static)) {
9173 if (Args.hasArg(options::OPT_rdynamic))
9174 CmdArgs.push_back("-export-dynamic");
9175
9176 if (!Args.hasArg(options::OPT_shared)) {
9177 const std::string Loader =
9178 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9179 CmdArgs.push_back("-dynamic-linker");
9180 CmdArgs.push_back(Args.MakeArgString(Loader));
9181 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009182 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009183
9184 CmdArgs.push_back("-o");
9185 CmdArgs.push_back(Output.getFilename());
9186
Douglas Katzman78b37b02015-11-17 20:28:07 +00009187 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009188 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009189 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009190 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009191 if (Args.hasArg(options::OPT_pg))
9192 crt1 = "gcrt1.o";
9193 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009194 crt1 = "Scrt1.o";
9195 else
9196 crt1 = "crt1.o";
9197 }
9198 if (crt1)
9199 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009200
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009201 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9202 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009203
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009204 const char *crtbegin;
9205 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009206 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009207 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009208 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009209 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009210 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009211 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009212 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009213
9214 if (HasCRTBeginEndFiles)
9215 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009216
9217 // Add crtfastmath.o if available and fast math is enabled.
9218 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009219 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009220
9221 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009222 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009223
Douglas Katzman6059ef92015-11-17 17:41:23 +00009224 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009225
Teresa Johnson945bc502015-10-15 20:35:53 +00009226 if (D.isUsingLTO())
9227 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009228
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009229 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9230 CmdArgs.push_back("--no-demangle");
9231
Alexey Samsonov52550342014-09-15 19:58:40 +00009232 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009233 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009234 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009235 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009236
Douglas Katzman78b37b02015-11-17 20:28:07 +00009237 if (D.CCCIsCXX() &&
9238 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009239 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009240 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009241 if (OnlyLibstdcxxStatic)
9242 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009243 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009244 if (OnlyLibstdcxxStatic)
9245 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009246 CmdArgs.push_back("-lm");
9247 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009248 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9249 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009250
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009251 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009252 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9253 if (Args.hasArg(options::OPT_static))
9254 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009255
Alexey Samsonov52550342014-09-15 19:58:40 +00009256 if (NeedsSanitizerDeps)
9257 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9258
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009259 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9260 Args.hasArg(options::OPT_pthreads);
9261
9262 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9263 options::OPT_fno_openmp, false)) {
9264 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9265 // FIXME: Does this really make sense for all GNU toolchains?
9266 WantPthread = true;
9267
9268 // Also link the particular OpenMP runtimes.
9269 switch (getOpenMPRuntime(ToolChain, Args)) {
9270 case OMPRT_OMP:
9271 CmdArgs.push_back("-lomp");
9272 break;
9273 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009274 CmdArgs.push_back("-lgomp");
9275
9276 // FIXME: Exclude this for platforms with libgomp that don't require
9277 // librt. Most modern Linux platforms require it, but some may not.
9278 CmdArgs.push_back("-lrt");
9279 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009280 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009281 CmdArgs.push_back("-liomp5");
9282 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009283 case OMPRT_Unknown:
9284 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009285 break;
9286 }
Chandler Carruth01538002013-01-17 13:19:29 +00009287 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009288
Renato Golinc4b49242014-02-13 10:01:16 +00009289 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009290
Richard Smith31d1de22015-05-20 22:48:44 +00009291 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009292 CmdArgs.push_back("-lpthread");
9293
Rafael Espindolab17bc532016-01-25 18:29:16 +00009294 if (Args.hasArg(options::OPT_fsplit_stack))
9295 CmdArgs.push_back("--wrap=pthread_create");
9296
Chandler Carruth94a32012012-05-14 18:31:18 +00009297 CmdArgs.push_back("-lc");
9298
9299 if (Args.hasArg(options::OPT_static))
9300 CmdArgs.push_back("--end-group");
9301 else
Renato Golinc4b49242014-02-13 10:01:16 +00009302 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009303 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009304
Rafael Espindola81937ec2010-12-01 01:52:43 +00009305 if (!Args.hasArg(options::OPT_nostartfiles)) {
9306 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009307 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009308 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009309 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009310 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009311 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009312 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009313
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009314 if (HasCRTBeginEndFiles)
9315 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009316 if (!isAndroid)
9317 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009318 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009319 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009320
Peter Collingbourne39719a72015-11-20 20:49:39 +00009321 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009322}
9323
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009324// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9325// for the various SFI requirements like register masking. The assembly tool
9326// inserts the file containing the macros as an input into all the assembly
9327// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009328void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9329 const InputInfo &Output,
9330 const InputInfoList &Inputs,
9331 const ArgList &Args,
9332 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009333 const toolchains::NaClToolChain &ToolChain =
9334 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009335 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009336 "nacl-arm-macros.s");
9337 InputInfoList NewInputs;
9338 NewInputs.push_back(NaClMacros);
9339 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009340 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9341 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009342}
9343
Douglas Katzman750cfc52015-06-29 18:42:16 +00009344// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009345// we use static by default, do not yet support sanitizers or LTO, and a few
9346// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009347// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009348void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9349 const InputInfo &Output,
9350 const InputInfoList &Inputs,
9351 const ArgList &Args,
9352 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009353
Douglas Katzman54366072015-07-27 16:53:08 +00009354 const toolchains::NaClToolChain &ToolChain =
9355 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009356 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009357 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009358 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009359 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009360
9361 ArgStringList CmdArgs;
9362
9363 // Silence warning for "clang -g foo.o -o foo"
9364 Args.ClaimAllArgs(options::OPT_g_Group);
9365 // and "clang -emit-llvm foo.o -o foo"
9366 Args.ClaimAllArgs(options::OPT_emit_llvm);
9367 // and for "clang -w foo.o -o foo". Other warning options are already
9368 // handled somewhere else.
9369 Args.ClaimAllArgs(options::OPT_w);
9370
9371 if (!D.SysRoot.empty())
9372 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9373
9374 if (Args.hasArg(options::OPT_rdynamic))
9375 CmdArgs.push_back("-export-dynamic");
9376
9377 if (Args.hasArg(options::OPT_s))
9378 CmdArgs.push_back("-s");
9379
Douglas Katzman54366072015-07-27 16:53:08 +00009380 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9381 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009382 CmdArgs.push_back("--build-id");
9383
9384 if (!IsStatic)
9385 CmdArgs.push_back("--eh-frame-hdr");
9386
9387 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009388 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009389 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009390 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009391 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009392 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009393 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009394 else if (Arch == llvm::Triple::mipsel)
9395 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009396 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009397 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9398 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009399
9400 if (IsStatic)
9401 CmdArgs.push_back("-static");
9402 else if (Args.hasArg(options::OPT_shared))
9403 CmdArgs.push_back("-shared");
9404
9405 CmdArgs.push_back("-o");
9406 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009407 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009408 if (!Args.hasArg(options::OPT_shared))
9409 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9410 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9411
9412 const char *crtbegin;
9413 if (IsStatic)
9414 crtbegin = "crtbeginT.o";
9415 else if (Args.hasArg(options::OPT_shared))
9416 crtbegin = "crtbeginS.o";
9417 else
9418 crtbegin = "crtbegin.o";
9419 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9420 }
9421
9422 Args.AddAllArgs(CmdArgs, options::OPT_L);
9423 Args.AddAllArgs(CmdArgs, options::OPT_u);
9424
Douglas Katzman6059ef92015-11-17 17:41:23 +00009425 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009426
9427 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9428 CmdArgs.push_back("--no-demangle");
9429
9430 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9431
Douglas Katzman78b37b02015-11-17 20:28:07 +00009432 if (D.CCCIsCXX() &&
9433 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009434 bool OnlyLibstdcxxStatic =
9435 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009436 if (OnlyLibstdcxxStatic)
9437 CmdArgs.push_back("-Bstatic");
9438 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9439 if (OnlyLibstdcxxStatic)
9440 CmdArgs.push_back("-Bdynamic");
9441 CmdArgs.push_back("-lm");
9442 }
9443
9444 if (!Args.hasArg(options::OPT_nostdlib)) {
9445 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9446 // Always use groups, since it has no effect on dynamic libraries.
9447 CmdArgs.push_back("--start-group");
9448 CmdArgs.push_back("-lc");
9449 // NaCl's libc++ currently requires libpthread, so just always include it
9450 // in the group for C++.
9451 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009452 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009453 // Gold, used by Mips, handles nested groups differently than ld, and
9454 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9455 // which is not a desired behaviour here.
9456 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9457 if (getToolChain().getArch() == llvm::Triple::mipsel)
9458 CmdArgs.push_back("-lnacl");
9459
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009460 CmdArgs.push_back("-lpthread");
9461 }
9462
9463 CmdArgs.push_back("-lgcc");
9464 CmdArgs.push_back("--as-needed");
9465 if (IsStatic)
9466 CmdArgs.push_back("-lgcc_eh");
9467 else
9468 CmdArgs.push_back("-lgcc_s");
9469 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009470
9471 // Mips needs to create and use pnacl_legacy library that contains
9472 // definitions from bitcode/pnaclmm.c and definitions for
9473 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9474 if (getToolChain().getArch() == llvm::Triple::mipsel)
9475 CmdArgs.push_back("-lpnacl_legacy");
9476
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009477 CmdArgs.push_back("--end-group");
9478 }
9479
9480 if (!Args.hasArg(options::OPT_nostartfiles)) {
9481 const char *crtend;
9482 if (Args.hasArg(options::OPT_shared))
9483 crtend = "crtendS.o";
9484 else
9485 crtend = "crtend.o";
9486
9487 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9488 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9489 }
9490 }
9491
Peter Collingbourne39719a72015-11-20 20:49:39 +00009492 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9493 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009494}
9495
Douglas Katzman95354292015-06-23 20:42:09 +00009496void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9497 const InputInfo &Output,
9498 const InputInfoList &Inputs,
9499 const ArgList &Args,
9500 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009501 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009502 ArgStringList CmdArgs;
9503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009504 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009505
9506 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009507 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009508
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009509 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009510 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009511
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009512 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009513 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009514}
9515
Douglas Katzman95354292015-06-23 20:42:09 +00009516void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9517 const InputInfo &Output,
9518 const InputInfoList &Inputs,
9519 const ArgList &Args,
9520 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009521 const Driver &D = getToolChain().getDriver();
9522 ArgStringList CmdArgs;
9523
Daniel Dunbarb440f562010-08-02 02:38:21 +00009524 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009525 CmdArgs.push_back("-o");
9526 CmdArgs.push_back(Output.getFilename());
9527 } else {
9528 assert(Output.isNothing() && "Invalid output.");
9529 }
9530
Douglas Katzman78b37b02015-11-17 20:28:07 +00009531 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009532 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9533 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9534 CmdArgs.push_back(
9535 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9536 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009537 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009538
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009539 Args.AddAllArgs(CmdArgs,
9540 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009541
Daniel Dunbar54423b22010-09-17 00:24:54 +00009542 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009543
Xinliang David Li69306c02015-10-22 06:15:31 +00009544 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009545
Douglas Katzman78b37b02015-11-17 20:28:07 +00009546 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009547 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009548 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009549 CmdArgs.push_back("-lm");
9550 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009551 }
9552
Douglas Katzman78b37b02015-11-17 20:28:07 +00009553 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009554 if (Args.hasArg(options::OPT_pthread))
9555 CmdArgs.push_back("-lpthread");
9556 CmdArgs.push_back("-lc");
9557 CmdArgs.push_back("-lCompilerRT-Generic");
9558 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9559 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009560 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009561 }
9562
Logan Chieneb9162f2014-06-26 14:23:45 +00009563 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009564 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009565}
9566
Daniel Dunbarcc912342009-05-02 18:28:39 +00009567/// DragonFly Tools
9568
9569// For now, DragonFly Assemble does just about the same as for
9570// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009571void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9572 const InputInfo &Output,
9573 const InputInfoList &Inputs,
9574 const ArgList &Args,
9575 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009576 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009577 ArgStringList CmdArgs;
9578
9579 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9580 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009581 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009582 CmdArgs.push_back("--32");
9583
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009584 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009585
9586 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009587 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009588
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009589 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009590 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009591
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009592 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009593 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009594}
9595
Douglas Katzman95354292015-06-23 20:42:09 +00009596void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9597 const InputInfo &Output,
9598 const InputInfoList &Inputs,
9599 const ArgList &Args,
9600 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009601 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009602 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009603
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009604 if (!D.SysRoot.empty())
9605 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9606
John McCall65b8da02013-04-11 22:55:55 +00009607 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009608 if (Args.hasArg(options::OPT_static)) {
9609 CmdArgs.push_back("-Bstatic");
9610 } else {
John McCall65b8da02013-04-11 22:55:55 +00009611 if (Args.hasArg(options::OPT_rdynamic))
9612 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009613 if (Args.hasArg(options::OPT_shared))
9614 CmdArgs.push_back("-Bshareable");
9615 else {
9616 CmdArgs.push_back("-dynamic-linker");
9617 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9618 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009619 CmdArgs.push_back("--hash-style=gnu");
9620 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009621 }
9622
9623 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9624 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009625 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009626 CmdArgs.push_back("-m");
9627 CmdArgs.push_back("elf_i386");
9628 }
9629
Daniel Dunbarb440f562010-08-02 02:38:21 +00009630 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009631 CmdArgs.push_back("-o");
9632 CmdArgs.push_back(Output.getFilename());
9633 } else {
9634 assert(Output.isNothing() && "Invalid output.");
9635 }
9636
Douglas Katzman78b37b02015-11-17 20:28:07 +00009637 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009638 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009639 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009640 CmdArgs.push_back(
9641 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009642 else {
9643 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009644 CmdArgs.push_back(
9645 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009646 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009647 CmdArgs.push_back(
9648 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009649 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009650 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009651 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009652 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009653 CmdArgs.push_back(
9654 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009655 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009656 CmdArgs.push_back(
9657 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009658 }
9659
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009660 Args.AddAllArgs(CmdArgs,
9661 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009662
Daniel Dunbar54423b22010-09-17 00:24:54 +00009663 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009664
Douglas Katzman78b37b02015-11-17 20:28:07 +00009665 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009666 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009667
9668 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009669 CmdArgs.push_back("-rpath");
9670 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009671 }
9672
Hans Wennborg70850d82013-07-18 20:29:38 +00009673 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009674 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009675 CmdArgs.push_back("-lm");
9676 }
9677
Daniel Dunbarcc912342009-05-02 18:28:39 +00009678 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009679 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009680
9681 if (!Args.hasArg(options::OPT_nolibc)) {
9682 CmdArgs.push_back("-lc");
9683 }
9684
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009685 if (Args.hasArg(options::OPT_static) ||
9686 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009687 CmdArgs.push_back("-lgcc");
9688 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009689 } else {
9690 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009691 CmdArgs.push_back("-lgcc_pic");
9692 if (!Args.hasArg(options::OPT_shared))
9693 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009694 } else {
John McCall65b8da02013-04-11 22:55:55 +00009695 CmdArgs.push_back("-lgcc");
9696 CmdArgs.push_back("--as-needed");
9697 CmdArgs.push_back("-lgcc_pic");
9698 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009699 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009700 }
9701 }
9702
Douglas Katzman78b37b02015-11-17 20:28:07 +00009703 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009704 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009705 CmdArgs.push_back(
9706 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009707 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009708 CmdArgs.push_back(
9709 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9710 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009711 }
9712
Xinliang David Li69306c02015-10-22 06:15:31 +00009713 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009714
Logan Chieneb9162f2014-06-26 14:23:45 +00009715 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009716 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009717}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009718
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009719// Try to find Exe from a Visual Studio distribution. This first tries to find
9720// an installed copy of Visual Studio and, failing that, looks in the PATH,
9721// making sure that whatever executable that's found is not a same-named exe
9722// from clang itself to prevent clang from falling back to itself.
9723static std::string FindVisualStudioExecutable(const ToolChain &TC,
9724 const char *Exe,
9725 const char *ClangProgramPath) {
9726 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9727 std::string visualStudioBinDir;
9728 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9729 visualStudioBinDir)) {
9730 SmallString<128> FilePath(visualStudioBinDir);
9731 llvm::sys::path::append(FilePath, Exe);
9732 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9733 return FilePath.str();
9734 }
9735
9736 return Exe;
9737}
9738
Douglas Katzman95354292015-06-23 20:42:09 +00009739void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9740 const InputInfo &Output,
9741 const InputInfoList &Inputs,
9742 const ArgList &Args,
9743 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009744 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009745 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009746
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009747 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9748 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009749 CmdArgs.push_back(
9750 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009751
Douglas Katzman78b37b02015-11-17 20:28:07 +00009752 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9753 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009754 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009755
Zachary Turner10d75b22014-10-22 20:40:43 +00009756 if (!llvm::sys::Process::GetEnv("LIB")) {
9757 // If the VC environment hasn't been configured (perhaps because the user
9758 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009759 // the environment variable is set however, assume the user knows what
9760 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009761 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009762 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009763 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9764 SmallString<128> LibDir(VisualStudioDir);
9765 llvm::sys::path::append(LibDir, "VC", "lib");
9766 switch (MSVC.getArch()) {
9767 case llvm::Triple::x86:
9768 // x86 just puts the libraries directly in lib
9769 break;
9770 case llvm::Triple::x86_64:
9771 llvm::sys::path::append(LibDir, "amd64");
9772 break;
9773 case llvm::Triple::arm:
9774 llvm::sys::path::append(LibDir, "arm");
9775 break;
9776 default:
9777 break;
9778 }
9779 CmdArgs.push_back(
9780 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009781
9782 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9783 std::string UniversalCRTLibPath;
9784 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9785 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9786 UniversalCRTLibPath.c_str()));
9787 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009788 }
9789
9790 std::string WindowsSdkLibPath;
9791 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9792 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9793 WindowsSdkLibPath.c_str()));
9794 }
9795
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009796 CmdArgs.push_back("-nologo");
9797
Reid Kleckner124955a2015-08-05 18:51:13 +00009798 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009799 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009800
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009801 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009802 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009803 if (DLL) {
9804 CmdArgs.push_back(Args.MakeArgString("-dll"));
9805
9806 SmallString<128> ImplibName(Output.getFilename());
9807 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009808 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009809 }
9810
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009811 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009812 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009813 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009814 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009815 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9816 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009817 // Make sure the dynamic runtime thunk is not optimized out at link time
9818 // to ensure proper SEH handling.
9819 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009820 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009821 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009822 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009823 for (const auto &Lib : {"asan", "asan_cxx"})
9824 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009825 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009826 }
9827
Hans Wennborg2e274592013-08-13 23:38:57 +00009828 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009829
Alexey Bataevc7e84352015-08-19 04:49:01 +00009830 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9831 options::OPT_fno_openmp, false)) {
9832 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9833 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9834 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9835 TC.getDriver().Dir + "/../lib"));
9836 switch (getOpenMPRuntime(getToolChain(), Args)) {
9837 case OMPRT_OMP:
9838 CmdArgs.push_back("-defaultlib:libomp.lib");
9839 break;
9840 case OMPRT_IOMP5:
9841 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9842 break;
9843 case OMPRT_GOMP:
9844 break;
9845 case OMPRT_Unknown:
9846 // Already diagnosed.
9847 break;
9848 }
9849 }
9850
Andrey Turetskiya4868572016-03-14 11:19:43 +00009851 // Add compiler-rt lib in case if it was explicitly
9852 // specified as an argument for --rtlib option.
9853 if (!Args.hasArg(options::OPT_nostdlib)) {
9854 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9855 }
9856
Reid Kleckner337188f2014-09-16 19:22:00 +00009857 // Add filenames, libraries, and other linker inputs.
9858 for (const auto &Input : Inputs) {
9859 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009860 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009861 continue;
9862 }
9863
9864 const Arg &A = Input.getInputArg();
9865
9866 // Render -l options differently for the MSVC linker.
9867 if (A.getOption().matches(options::OPT_l)) {
9868 StringRef Lib = A.getValue();
9869 const char *LinkLibArg;
9870 if (Lib.endswith(".lib"))
9871 LinkLibArg = Args.MakeArgString(Lib);
9872 else
9873 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9874 CmdArgs.push_back(LinkLibArg);
9875 continue;
9876 }
9877
9878 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9879 // or -L. Render it, even if MSVC doesn't understand it.
9880 A.renderAsInput(Args, CmdArgs);
9881 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009882
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009883 TC.addProfileRTLibs(Args, CmdArgs);
9884
Zachary Turner719f58c2014-12-01 23:06:47 +00009885 // We need to special case some linker paths. In the case of lld, we need to
9886 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9887 // linker, we need to use a special search algorithm.
9888 llvm::SmallString<128> linkPath;
9889 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9890 if (Linker.equals_lower("lld"))
9891 Linker = "lld-link";
9892
9893 if (Linker.equals_lower("link")) {
9894 // If we're using the MSVC linker, it's not sufficient to just use link
9895 // from the program PATH, because other environments like GnuWin32 install
9896 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009897 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009898 C.getDriver().getClangProgramPath());
9899 } else {
9900 linkPath = Linker;
9901 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009902 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009903 }
9904
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009905 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009906 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009907}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009908
Douglas Katzman95354292015-06-23 20:42:09 +00009909void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9910 const InputInfo &Output,
9911 const InputInfoList &Inputs,
9912 const ArgList &Args,
9913 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009914 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9915}
9916
Douglas Katzman95354292015-06-23 20:42:09 +00009917std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009918 Compilation &C, const JobAction &JA, const InputInfo &Output,
9919 const InputInfoList &Inputs, const ArgList &Args,
9920 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009921 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009922 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009923 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009924 CmdArgs.push_back("/W0"); // No warnings.
9925
9926 // The goal is to be able to invoke this tool correctly based on
9927 // any flag accepted by clang-cl.
9928
9929 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009930 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009931
9932 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009933 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9934 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9935 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009936 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9937 if (A->getOption().getID() == options::OPT_O0) {
9938 CmdArgs.push_back("/Od");
9939 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009940 CmdArgs.push_back("/Og");
9941
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009942 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009943 if (OptLevel == "s" || OptLevel == "z")
9944 CmdArgs.push_back("/Os");
9945 else
9946 CmdArgs.push_back("/Ot");
9947
9948 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009949 }
9950 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009951 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9952 options::OPT_fno_omit_frame_pointer))
9953 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9954 ? "/Oy"
9955 : "/Oy-");
9956 if (!Args.hasArg(options::OPT_fwritable_strings))
9957 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009958
Nico Weber3f8dafb2015-03-12 19:37:10 +00009959 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009960 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9961
David Majnemerf6072342014-07-01 22:24:56 +00009962 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9963 /*default=*/false))
9964 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009965 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9966 options::OPT_fno_function_sections))
9967 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9968 ? "/Gy"
9969 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009970 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9971 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009972 CmdArgs.push_back(
9973 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009974 if (Args.hasArg(options::OPT_fsyntax_only))
9975 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009976 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9977 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009978 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009979
Nico Weber3f8dafb2015-03-12 19:37:10 +00009980 std::vector<std::string> Includes =
9981 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009982 for (const auto &Include : Includes)
9983 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009984
Hans Wennborg87cfa712013-09-19 20:32:16 +00009985 // Flags that can simply be passed through.
9986 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9987 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009988 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9989 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009990 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009991 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009992
9993 // The order of these flags is relevant, so pick the last one.
9994 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9995 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9996 A->render(Args, CmdArgs);
9997
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009998 // Pass through all unknown arguments so that the fallback command can see
9999 // them too.
10000 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
10001
Hans Wennborg87cfa712013-09-19 20:32:16 +000010002 // Input filename.
10003 assert(Inputs.size() == 1);
10004 const InputInfo &II = Inputs[0];
10005 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
10006 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
10007 if (II.isFilename())
10008 CmdArgs.push_back(II.getFilename());
10009 else
10010 II.getInputArg().renderAsInput(Args, CmdArgs);
10011
10012 // Output filename.
10013 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010014 const char *Fo =
10015 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010016 CmdArgs.push_back(Fo);
10017
Hans Wennborg188382e2013-09-20 18:16:35 +000010018 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010019 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10020 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010021 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010022 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010023}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010024
Yaron Keren1c0070c2015-07-02 04:45:27 +000010025/// MinGW Tools
10026void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10027 const InputInfo &Output,
10028 const InputInfoList &Inputs,
10029 const ArgList &Args,
10030 const char *LinkingOutput) const {
10031 claimNoWarnArgs(Args);
10032 ArgStringList CmdArgs;
10033
10034 if (getToolChain().getArch() == llvm::Triple::x86) {
10035 CmdArgs.push_back("--32");
10036 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10037 CmdArgs.push_back("--64");
10038 }
10039
10040 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10041
10042 CmdArgs.push_back("-o");
10043 CmdArgs.push_back(Output.getFilename());
10044
10045 for (const auto &II : Inputs)
10046 CmdArgs.push_back(II.getFilename());
10047
10048 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010049 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010050
10051 if (Args.hasArg(options::OPT_gsplit_dwarf))
10052 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10053 SplitDebugName(Args, Inputs[0]));
10054}
10055
10056void MinGW::Linker::AddLibGCC(const ArgList &Args,
10057 ArgStringList &CmdArgs) const {
10058 if (Args.hasArg(options::OPT_mthreads))
10059 CmdArgs.push_back("-lmingwthrd");
10060 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010061
Yaron Kerenaa281332015-08-09 00:24:07 +000010062 // Make use of compiler-rt if --rtlib option is used
10063 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10064 if (RLT == ToolChain::RLT_Libgcc) {
10065 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10066 Args.hasArg(options::OPT_static);
10067 bool Shared = Args.hasArg(options::OPT_shared);
10068 bool CXX = getToolChain().getDriver().CCCIsCXX();
10069
10070 if (Static || (!CXX && !Shared)) {
10071 CmdArgs.push_back("-lgcc");
10072 CmdArgs.push_back("-lgcc_eh");
10073 } else {
10074 CmdArgs.push_back("-lgcc_s");
10075 CmdArgs.push_back("-lgcc");
10076 }
10077 } else {
10078 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10079 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010080
Yaron Keren1c0070c2015-07-02 04:45:27 +000010081 CmdArgs.push_back("-lmoldname");
10082 CmdArgs.push_back("-lmingwex");
10083 CmdArgs.push_back("-lmsvcrt");
10084}
10085
10086void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10087 const InputInfo &Output,
10088 const InputInfoList &Inputs,
10089 const ArgList &Args,
10090 const char *LinkingOutput) const {
10091 const ToolChain &TC = getToolChain();
10092 const Driver &D = TC.getDriver();
10093 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10094
10095 ArgStringList CmdArgs;
10096
10097 // Silence warning for "clang -g foo.o -o foo"
10098 Args.ClaimAllArgs(options::OPT_g_Group);
10099 // and "clang -emit-llvm foo.o -o foo"
10100 Args.ClaimAllArgs(options::OPT_emit_llvm);
10101 // and for "clang -w foo.o -o foo". Other warning options are already
10102 // handled somewhere else.
10103 Args.ClaimAllArgs(options::OPT_w);
10104
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010105 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10106 if (LinkerName.equals_lower("lld")) {
10107 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010108 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010109 } else if (!LinkerName.equals_lower("ld")) {
10110 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010111 }
10112
Yaron Keren1c0070c2015-07-02 04:45:27 +000010113 if (!D.SysRoot.empty())
10114 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10115
10116 if (Args.hasArg(options::OPT_s))
10117 CmdArgs.push_back("-s");
10118
10119 CmdArgs.push_back("-m");
10120 if (TC.getArch() == llvm::Triple::x86)
10121 CmdArgs.push_back("i386pe");
10122 if (TC.getArch() == llvm::Triple::x86_64)
10123 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010124 if (TC.getArch() == llvm::Triple::arm)
10125 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010126
10127 if (Args.hasArg(options::OPT_mwindows)) {
10128 CmdArgs.push_back("--subsystem");
10129 CmdArgs.push_back("windows");
10130 } else if (Args.hasArg(options::OPT_mconsole)) {
10131 CmdArgs.push_back("--subsystem");
10132 CmdArgs.push_back("console");
10133 }
10134
10135 if (Args.hasArg(options::OPT_static))
10136 CmdArgs.push_back("-Bstatic");
10137 else {
10138 if (Args.hasArg(options::OPT_mdll))
10139 CmdArgs.push_back("--dll");
10140 else if (Args.hasArg(options::OPT_shared))
10141 CmdArgs.push_back("--shared");
10142 CmdArgs.push_back("-Bdynamic");
10143 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10144 CmdArgs.push_back("-e");
10145 if (TC.getArch() == llvm::Triple::x86)
10146 CmdArgs.push_back("_DllMainCRTStartup@12");
10147 else
10148 CmdArgs.push_back("DllMainCRTStartup");
10149 CmdArgs.push_back("--enable-auto-image-base");
10150 }
10151 }
10152
10153 CmdArgs.push_back("-o");
10154 CmdArgs.push_back(Output.getFilename());
10155
10156 Args.AddAllArgs(CmdArgs, options::OPT_e);
10157 // FIXME: add -N, -n flags
10158 Args.AddLastArg(CmdArgs, options::OPT_r);
10159 Args.AddLastArg(CmdArgs, options::OPT_s);
10160 Args.AddLastArg(CmdArgs, options::OPT_t);
10161 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10162 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10163
Douglas Katzman78b37b02015-11-17 20:28:07 +000010164 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010165 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10166 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10167 } else {
10168 if (Args.hasArg(options::OPT_municode))
10169 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10170 else
10171 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10172 }
10173 if (Args.hasArg(options::OPT_pg))
10174 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10175 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10176 }
10177
10178 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010179 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010180 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10181
10182 // TODO: Add ASan stuff here
10183
10184 // TODO: Add profile stuff here
10185
Douglas Katzman78b37b02015-11-17 20:28:07 +000010186 if (D.CCCIsCXX() &&
10187 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010188 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10189 !Args.hasArg(options::OPT_static);
10190 if (OnlyLibstdcxxStatic)
10191 CmdArgs.push_back("-Bstatic");
10192 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10193 if (OnlyLibstdcxxStatic)
10194 CmdArgs.push_back("-Bdynamic");
10195 }
10196
10197 if (!Args.hasArg(options::OPT_nostdlib)) {
10198 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10199 if (Args.hasArg(options::OPT_static))
10200 CmdArgs.push_back("--start-group");
10201
10202 if (Args.hasArg(options::OPT_fstack_protector) ||
10203 Args.hasArg(options::OPT_fstack_protector_strong) ||
10204 Args.hasArg(options::OPT_fstack_protector_all)) {
10205 CmdArgs.push_back("-lssp_nonshared");
10206 CmdArgs.push_back("-lssp");
10207 }
10208 if (Args.hasArg(options::OPT_fopenmp))
10209 CmdArgs.push_back("-lgomp");
10210
10211 AddLibGCC(Args, CmdArgs);
10212
10213 if (Args.hasArg(options::OPT_pg))
10214 CmdArgs.push_back("-lgmon");
10215
Yaron Kerenadce68e2015-07-06 18:52:19 +000010216 if (Args.hasArg(options::OPT_pthread))
10217 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010218
10219 // add system libraries
10220 if (Args.hasArg(options::OPT_mwindows)) {
10221 CmdArgs.push_back("-lgdi32");
10222 CmdArgs.push_back("-lcomdlg32");
10223 }
10224 CmdArgs.push_back("-ladvapi32");
10225 CmdArgs.push_back("-lshell32");
10226 CmdArgs.push_back("-luser32");
10227 CmdArgs.push_back("-lkernel32");
10228
10229 if (Args.hasArg(options::OPT_static))
10230 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010231 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010232 AddLibGCC(Args, CmdArgs);
10233 }
10234
10235 if (!Args.hasArg(options::OPT_nostartfiles)) {
10236 // Add crtfastmath.o if available and fast math is enabled.
10237 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10238
10239 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10240 }
10241 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010242 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010243 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010244}
10245
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010246/// XCore Tools
10247// We pass assemble and link construction to the xcc tool.
10248
Douglas Katzman95354292015-06-23 20:42:09 +000010249void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10250 const InputInfo &Output,
10251 const InputInfoList &Inputs,
10252 const ArgList &Args,
10253 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010254 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010255 ArgStringList CmdArgs;
10256
10257 CmdArgs.push_back("-o");
10258 CmdArgs.push_back(Output.getFilename());
10259
10260 CmdArgs.push_back("-c");
10261
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010262 if (Args.hasArg(options::OPT_v))
10263 CmdArgs.push_back("-v");
10264
Robert Lytton894d25c2014-05-02 09:33:25 +000010265 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10266 if (!A->getOption().matches(options::OPT_g0))
10267 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010268
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010269 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10270 false))
10271 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010272
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010273 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010274
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010275 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010276 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010277
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010278 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010279 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010280}
10281
Douglas Katzman95354292015-06-23 20:42:09 +000010282void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10283 const InputInfo &Output,
10284 const InputInfoList &Inputs,
10285 const ArgList &Args,
10286 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010287 ArgStringList CmdArgs;
10288
10289 if (Output.isFilename()) {
10290 CmdArgs.push_back("-o");
10291 CmdArgs.push_back(Output.getFilename());
10292 } else {
10293 assert(Output.isNothing() && "Invalid output.");
10294 }
10295
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010296 if (Args.hasArg(options::OPT_v))
10297 CmdArgs.push_back("-v");
10298
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010299 // Pass -fexceptions through to the linker if it was present.
10300 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10301 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010302 CmdArgs.push_back("-fexceptions");
10303
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010304 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10305
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010306 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010307 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010308}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010309
Douglas Katzman95354292015-06-23 20:42:09 +000010310void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10311 const InputInfo &Output,
10312 const InputInfoList &Inputs,
10313 const ArgList &Args,
10314 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010315 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010316 const auto &TC =
10317 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10318 ArgStringList CmdArgs;
10319 const char *Exec;
10320
10321 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010322 default:
10323 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010324 case llvm::Triple::arm:
10325 case llvm::Triple::thumb:
10326 break;
10327 case llvm::Triple::x86:
10328 CmdArgs.push_back("--32");
10329 break;
10330 case llvm::Triple::x86_64:
10331 CmdArgs.push_back("--64");
10332 break;
10333 }
10334
10335 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10336
10337 CmdArgs.push_back("-o");
10338 CmdArgs.push_back(Output.getFilename());
10339
10340 for (const auto &Input : Inputs)
10341 CmdArgs.push_back(Input.getFilename());
10342
10343 const std::string Assembler = TC.GetProgramPath("as");
10344 Exec = Args.MakeArgString(Assembler);
10345
Justin Bognerd3371d82015-07-17 03:35:54 +000010346 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010347}
10348
Douglas Katzman95354292015-06-23 20:42:09 +000010349void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10350 const InputInfo &Output,
10351 const InputInfoList &Inputs,
10352 const ArgList &Args,
10353 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010354 const auto &TC =
10355 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10356 const llvm::Triple &T = TC.getTriple();
10357 const Driver &D = TC.getDriver();
10358 SmallString<128> EntryPoint;
10359 ArgStringList CmdArgs;
10360 const char *Exec;
10361
10362 // Silence warning for "clang -g foo.o -o foo"
10363 Args.ClaimAllArgs(options::OPT_g_Group);
10364 // and "clang -emit-llvm foo.o -o foo"
10365 Args.ClaimAllArgs(options::OPT_emit_llvm);
10366 // and for "clang -w foo.o -o foo"
10367 Args.ClaimAllArgs(options::OPT_w);
10368 // Other warning options are already handled somewhere else.
10369
10370 if (!D.SysRoot.empty())
10371 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10372
10373 if (Args.hasArg(options::OPT_pie))
10374 CmdArgs.push_back("-pie");
10375 if (Args.hasArg(options::OPT_rdynamic))
10376 CmdArgs.push_back("-export-dynamic");
10377 if (Args.hasArg(options::OPT_s))
10378 CmdArgs.push_back("--strip-all");
10379
10380 CmdArgs.push_back("-m");
10381 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010382 default:
10383 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010384 case llvm::Triple::arm:
10385 case llvm::Triple::thumb:
10386 // FIXME: this is incorrect for WinCE
10387 CmdArgs.push_back("thumb2pe");
10388 break;
10389 case llvm::Triple::x86:
10390 CmdArgs.push_back("i386pe");
10391 EntryPoint.append("_");
10392 break;
10393 case llvm::Triple::x86_64:
10394 CmdArgs.push_back("i386pep");
10395 break;
10396 }
10397
10398 if (Args.hasArg(options::OPT_shared)) {
10399 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010400 default:
10401 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010402 case llvm::Triple::arm:
10403 case llvm::Triple::thumb:
10404 case llvm::Triple::x86_64:
10405 EntryPoint.append("_DllMainCRTStartup");
10406 break;
10407 case llvm::Triple::x86:
10408 EntryPoint.append("_DllMainCRTStartup@12");
10409 break;
10410 }
10411
10412 CmdArgs.push_back("-shared");
10413 CmdArgs.push_back("-Bdynamic");
10414
10415 CmdArgs.push_back("--enable-auto-image-base");
10416
10417 CmdArgs.push_back("--entry");
10418 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10419 } else {
10420 EntryPoint.append("mainCRTStartup");
10421
10422 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10423 : "-Bdynamic");
10424
Douglas Katzman78b37b02015-11-17 20:28:07 +000010425 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010426 CmdArgs.push_back("--entry");
10427 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10428 }
10429
10430 // FIXME: handle subsystem
10431 }
10432
10433 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010434 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010435
10436 CmdArgs.push_back("-o");
10437 CmdArgs.push_back(Output.getFilename());
10438
10439 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10440 SmallString<261> ImpLib(Output.getFilename());
10441 llvm::sys::path::replace_extension(ImpLib, ".lib");
10442
10443 CmdArgs.push_back("--out-implib");
10444 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10445 }
10446
Douglas Katzman78b37b02015-11-17 20:28:07 +000010447 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010448 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10449 const char *CRTBegin;
10450
10451 CRTBegin =
10452 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10453 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10454 }
10455
10456 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010457 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010458 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10459
10460 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10461 !Args.hasArg(options::OPT_nodefaultlibs)) {
10462 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10463 !Args.hasArg(options::OPT_static);
10464 if (StaticCXX)
10465 CmdArgs.push_back("-Bstatic");
10466 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10467 if (StaticCXX)
10468 CmdArgs.push_back("-Bdynamic");
10469 }
10470
10471 if (!Args.hasArg(options::OPT_nostdlib)) {
10472 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10473 // TODO handle /MT[d] /MD[d]
10474 CmdArgs.push_back("-lmsvcrt");
10475 AddRunTimeLibs(TC, D, CmdArgs, Args);
10476 }
10477 }
10478
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010479 if (TC.getSanitizerArgs().needsAsanRt()) {
10480 // TODO handle /MT[d] /MD[d]
10481 if (Args.hasArg(options::OPT_shared)) {
10482 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10483 } else {
10484 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10485 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Marcin Koscielnicki10721432016-05-12 10:27:59 +000010486 // Make sure the dynamic runtime thunk is not optimized out at link time
10487 // to ensure proper SEH handling.
10488 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10489 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10490 ? "___asan_seh_interceptor"
10491 : "__asan_seh_interceptor"));
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010492 }
10493 }
10494
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010495 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010496
Justin Bognerd3371d82015-07-17 03:35:54 +000010497 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010498}
Douglas Katzman84a75642015-06-19 14:55:19 +000010499
Douglas Katzman95354292015-06-23 20:42:09 +000010500void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10501 const InputInfo &Output,
10502 const InputInfoList &Inputs,
10503 const ArgList &Args,
10504 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010505 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010506 assert(Inputs.size() == 1);
10507 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010508 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10509 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010510
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010511 if (JA.getKind() == Action::PreprocessJobClass) {
10512 Args.ClaimAllArgs();
10513 CmdArgs.push_back("-E");
10514 } else {
10515 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10516 CmdArgs.push_back("-S");
10517 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10518 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010519 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010520
Douglas Katzmanf6071112015-08-03 14:34:22 +000010521 // Append all -I, -iquote, -isystem paths, defines/undefines,
10522 // 'f' flags, optimize flags, and warning options.
10523 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010524 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010525 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010526 options::OPT_f_Group, options::OPT_f_clang_Group,
10527 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010528 options::OPT_O_Group, options::OPT_W_Group,
10529 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010530
10531 // If we're producing a dependency file, and assembly is the final action,
10532 // then the name of the target in the dependency file should be the '.o'
10533 // file, not the '.s' file produced by this step. For example, instead of
10534 // /tmp/mumble.s: mumble.c .../someheader.h
10535 // the filename on the lefthand side should be "mumble.o"
10536 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10537 C.getActions().size() == 1 &&
10538 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10539 Arg *A = Args.getLastArg(options::OPT_o);
10540 if (A) {
10541 CmdArgs.push_back("-MT");
10542 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10543 }
10544 }
10545
Douglas Katzman84a75642015-06-19 14:55:19 +000010546 CmdArgs.push_back(II.getFilename());
10547 CmdArgs.push_back("-o");
10548 CmdArgs.push_back(Output.getFilename());
10549
10550 std::string Exec =
10551 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010552 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10553 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010554}
10555
Douglas Katzman95354292015-06-23 20:42:09 +000010556void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10557 const InputInfo &Output,
10558 const InputInfoList &Inputs,
10559 const ArgList &Args,
10560 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010561 ArgStringList CmdArgs;
10562
10563 assert(Inputs.size() == 1);
10564 const InputInfo &II = Inputs[0];
10565 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10566 assert(Output.getType() == types::TY_Object);
10567
10568 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010569 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10570 if (CPUArg)
10571 CmdArgs.push_back(
10572 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010573 CmdArgs.push_back("-noSPrefixing");
10574 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010575 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10576 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10577 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010578 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010579 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010580 }
10581 CmdArgs.push_back("-elf"); // Output format.
10582 CmdArgs.push_back(II.getFilename());
10583 CmdArgs.push_back(
10584 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10585
10586 std::string Exec =
10587 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010588 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10589 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010590}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010591
10592void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10593 const InputInfo &Output,
10594 const InputInfoList &Inputs,
10595 const ArgList &Args,
10596 const char *LinkingOutput) const {
10597 const auto &TC =
10598 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10599 const llvm::Triple &T = TC.getTriple();
10600 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010601 bool UseStartfiles =
10602 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010603 bool UseDefaultLibs =
10604 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010605
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010606 if (T.getArch() == llvm::Triple::sparc)
10607 CmdArgs.push_back("-EB");
10608 else // SHAVE assumes little-endian, and sparcel is expressly so.
10609 CmdArgs.push_back("-EL");
10610
10611 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10612 // but we never pass through a --sysroot option and various other bits.
10613 // For example, there are no sanitizers (yet) nor gold linker.
10614
10615 // Eat some arguments that may be present but have no effect.
10616 Args.ClaimAllArgs(options::OPT_g_Group);
10617 Args.ClaimAllArgs(options::OPT_w);
10618 Args.ClaimAllArgs(options::OPT_static_libgcc);
10619
10620 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10621 CmdArgs.push_back("-s");
10622
10623 CmdArgs.push_back("-o");
10624 CmdArgs.push_back(Output.getFilename());
10625
10626 if (UseStartfiles) {
10627 // If you want startfiles, it means you want the builtin crti and crtbegin,
10628 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010629 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10630 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010631 }
10632
10633 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10634 options::OPT_e, options::OPT_s, options::OPT_t,
10635 options::OPT_Z_Flag, options::OPT_r});
10636
Douglas Katzman674a3122015-11-18 16:24:46 +000010637 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010638
10639 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10640
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010641 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010642 if (C.getDriver().CCCIsCXX())
10643 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010644 if (T.getOS() == llvm::Triple::RTEMS) {
10645 CmdArgs.push_back("--start-group");
10646 CmdArgs.push_back("-lc");
10647 // You must provide your own "-L" option to enable finding these.
10648 CmdArgs.push_back("-lrtemscpu");
10649 CmdArgs.push_back("-lrtemsbsp");
10650 CmdArgs.push_back("--end-group");
10651 } else {
10652 CmdArgs.push_back("-lc");
10653 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010654 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010655 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010656 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010657 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10658 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010659 }
10660
10661 std::string Exec =
10662 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10663 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10664 CmdArgs, Inputs));
10665}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010666
10667void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10668 const InputInfo &Output,
10669 const InputInfoList &Inputs,
10670 const ArgList &Args,
10671 const char *LinkingOutput) const {
10672 claimNoWarnArgs(Args);
10673 ArgStringList CmdArgs;
10674
10675 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10676
10677 CmdArgs.push_back("-o");
10678 CmdArgs.push_back(Output.getFilename());
10679
10680 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10681 const InputInfo &Input = Inputs[0];
10682 assert(Input.isFilename() && "Invalid input.");
10683 CmdArgs.push_back(Input.getFilename());
10684
10685 const char *Exec =
10686 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10687 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10688}
10689
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010690static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10691 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10692 if (SanArgs.needsUbsanRt()) {
10693 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10694 }
10695 if (SanArgs.needsAsanRt()) {
10696 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10697 }
10698}
10699
10700static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10701 const JobAction &JA, const InputInfo &Output,
10702 const InputInfoList &Inputs,
10703 const ArgList &Args,
10704 const char *LinkingOutput) {
10705 const toolchains::FreeBSD &ToolChain =
10706 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10707 const Driver &D = ToolChain.getDriver();
10708 ArgStringList CmdArgs;
10709
10710 // Silence warning for "clang -g foo.o -o foo"
10711 Args.ClaimAllArgs(options::OPT_g_Group);
10712 // and "clang -emit-llvm foo.o -o foo"
10713 Args.ClaimAllArgs(options::OPT_emit_llvm);
10714 // and for "clang -w foo.o -o foo". Other warning options are already
10715 // handled somewhere else.
10716 Args.ClaimAllArgs(options::OPT_w);
10717
10718 if (!D.SysRoot.empty())
10719 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10720
10721 if (Args.hasArg(options::OPT_pie))
10722 CmdArgs.push_back("-pie");
10723
10724 if (Args.hasArg(options::OPT_rdynamic))
10725 CmdArgs.push_back("-export-dynamic");
10726 if (Args.hasArg(options::OPT_shared))
10727 CmdArgs.push_back("--oformat=so");
10728
10729 if (Output.isFilename()) {
10730 CmdArgs.push_back("-o");
10731 CmdArgs.push_back(Output.getFilename());
10732 } else {
10733 assert(Output.isNothing() && "Invalid output.");
10734 }
10735
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010736 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10737
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010738 Args.AddAllArgs(CmdArgs, options::OPT_L);
10739 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10740 Args.AddAllArgs(CmdArgs, options::OPT_e);
10741 Args.AddAllArgs(CmdArgs, options::OPT_s);
10742 Args.AddAllArgs(CmdArgs, options::OPT_t);
10743 Args.AddAllArgs(CmdArgs, options::OPT_r);
10744
10745 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10746 CmdArgs.push_back("--no-demangle");
10747
10748 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10749
10750 if (Args.hasArg(options::OPT_pthread)) {
10751 CmdArgs.push_back("-lpthread");
10752 }
10753
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010754 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10755
10756 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10757}
10758
10759static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10760 const JobAction &JA, const InputInfo &Output,
10761 const InputInfoList &Inputs,
10762 const ArgList &Args,
10763 const char *LinkingOutput) {
10764 const toolchains::FreeBSD &ToolChain =
10765 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10766 const Driver &D = ToolChain.getDriver();
10767 ArgStringList CmdArgs;
10768
10769 // Silence warning for "clang -g foo.o -o foo"
10770 Args.ClaimAllArgs(options::OPT_g_Group);
10771 // and "clang -emit-llvm foo.o -o foo"
10772 Args.ClaimAllArgs(options::OPT_emit_llvm);
10773 // and for "clang -w foo.o -o foo". Other warning options are already
10774 // handled somewhere else.
10775 Args.ClaimAllArgs(options::OPT_w);
10776
10777 if (!D.SysRoot.empty())
10778 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10779
10780 if (Args.hasArg(options::OPT_pie))
10781 CmdArgs.push_back("-pie");
10782
10783 if (Args.hasArg(options::OPT_static)) {
10784 CmdArgs.push_back("-Bstatic");
10785 } else {
10786 if (Args.hasArg(options::OPT_rdynamic))
10787 CmdArgs.push_back("-export-dynamic");
10788 CmdArgs.push_back("--eh-frame-hdr");
10789 if (Args.hasArg(options::OPT_shared)) {
10790 CmdArgs.push_back("-Bshareable");
10791 } else {
10792 CmdArgs.push_back("-dynamic-linker");
10793 CmdArgs.push_back("/libexec/ld-elf.so.1");
10794 }
10795 CmdArgs.push_back("--enable-new-dtags");
10796 }
10797
10798 if (Output.isFilename()) {
10799 CmdArgs.push_back("-o");
10800 CmdArgs.push_back(Output.getFilename());
10801 } else {
10802 assert(Output.isNothing() && "Invalid output.");
10803 }
10804
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010805 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10806
Douglas Katzman78b37b02015-11-17 20:28:07 +000010807 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010808 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010809 if (!Args.hasArg(options::OPT_shared)) {
10810 if (Args.hasArg(options::OPT_pg))
10811 crt1 = "gcrt1.o";
10812 else if (Args.hasArg(options::OPT_pie))
10813 crt1 = "Scrt1.o";
10814 else
10815 crt1 = "crt1.o";
10816 }
10817 if (crt1)
10818 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10819
10820 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10821
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010822 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010823 if (Args.hasArg(options::OPT_static))
10824 crtbegin = "crtbeginT.o";
10825 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10826 crtbegin = "crtbeginS.o";
10827 else
10828 crtbegin = "crtbegin.o";
10829
10830 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10831 }
10832
10833 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010834 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010835 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10836 Args.AddAllArgs(CmdArgs, options::OPT_e);
10837 Args.AddAllArgs(CmdArgs, options::OPT_s);
10838 Args.AddAllArgs(CmdArgs, options::OPT_t);
10839 Args.AddAllArgs(CmdArgs, options::OPT_r);
10840
10841 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10842 CmdArgs.push_back("--no-demangle");
10843
10844 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10845
Douglas Katzman78b37b02015-11-17 20:28:07 +000010846 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010847 // For PS4, we always want to pass libm, libstdc++ and libkernel
10848 // libraries for both C and C++ compilations.
10849 CmdArgs.push_back("-lkernel");
10850 if (D.CCCIsCXX()) {
10851 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10852 if (Args.hasArg(options::OPT_pg))
10853 CmdArgs.push_back("-lm_p");
10854 else
10855 CmdArgs.push_back("-lm");
10856 }
10857 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10858 // the default system libraries. Just mimic this for now.
10859 if (Args.hasArg(options::OPT_pg))
10860 CmdArgs.push_back("-lgcc_p");
10861 else
10862 CmdArgs.push_back("-lcompiler_rt");
10863 if (Args.hasArg(options::OPT_static)) {
10864 CmdArgs.push_back("-lstdc++");
10865 } else if (Args.hasArg(options::OPT_pg)) {
10866 CmdArgs.push_back("-lgcc_eh_p");
10867 } else {
10868 CmdArgs.push_back("--as-needed");
10869 CmdArgs.push_back("-lstdc++");
10870 CmdArgs.push_back("--no-as-needed");
10871 }
10872
10873 if (Args.hasArg(options::OPT_pthread)) {
10874 if (Args.hasArg(options::OPT_pg))
10875 CmdArgs.push_back("-lpthread_p");
10876 else
10877 CmdArgs.push_back("-lpthread");
10878 }
10879
10880 if (Args.hasArg(options::OPT_pg)) {
10881 if (Args.hasArg(options::OPT_shared))
10882 CmdArgs.push_back("-lc");
10883 else {
10884 if (Args.hasArg(options::OPT_static)) {
10885 CmdArgs.push_back("--start-group");
10886 CmdArgs.push_back("-lc_p");
10887 CmdArgs.push_back("-lpthread_p");
10888 CmdArgs.push_back("--end-group");
10889 } else {
10890 CmdArgs.push_back("-lc_p");
10891 }
10892 }
10893 CmdArgs.push_back("-lgcc_p");
10894 } else {
10895 if (Args.hasArg(options::OPT_static)) {
10896 CmdArgs.push_back("--start-group");
10897 CmdArgs.push_back("-lc");
10898 CmdArgs.push_back("-lpthread");
10899 CmdArgs.push_back("--end-group");
10900 } else {
10901 CmdArgs.push_back("-lc");
10902 }
10903 CmdArgs.push_back("-lcompiler_rt");
10904 }
10905
10906 if (Args.hasArg(options::OPT_static)) {
10907 CmdArgs.push_back("-lstdc++");
10908 } else if (Args.hasArg(options::OPT_pg)) {
10909 CmdArgs.push_back("-lgcc_eh_p");
10910 } else {
10911 CmdArgs.push_back("--as-needed");
10912 CmdArgs.push_back("-lstdc++");
10913 CmdArgs.push_back("--no-as-needed");
10914 }
10915 }
10916
Douglas Katzman78b37b02015-11-17 20:28:07 +000010917 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010918 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10919 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10920 else
10921 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10922 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10923 }
10924
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010925 const char *Exec =
10926#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010927 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010928#else
10929 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10930#endif
10931
10932 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10933}
10934
10935void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10936 const InputInfo &Output,
10937 const InputInfoList &Inputs,
10938 const ArgList &Args,
10939 const char *LinkingOutput) const {
10940 const toolchains::FreeBSD &ToolChain =
10941 static_cast<const toolchains::FreeBSD &>(getToolChain());
10942 const Driver &D = ToolChain.getDriver();
10943 bool PS4Linker;
10944 StringRef LinkerOptName;
10945 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10946 LinkerOptName = A->getValue();
10947 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10948 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10949 }
10950
10951 if (LinkerOptName == "gold")
10952 PS4Linker = false;
10953 else if (LinkerOptName == "ps4")
10954 PS4Linker = true;
10955 else
10956 PS4Linker = !Args.hasArg(options::OPT_shared);
10957
10958 if (PS4Linker)
10959 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10960 else
10961 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10962}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010963
10964void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10965 const InputInfo &Output,
10966 const InputInfoList &Inputs,
10967 const ArgList &Args,
10968 const char *LinkingOutput) const {
10969 const auto &TC =
10970 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010971 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010972
10973 std::vector<std::string> gpu_archs =
10974 Args.getAllArgValues(options::OPT_march_EQ);
10975 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10976 const std::string& gpu_arch = gpu_archs[0];
10977
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010978 ArgStringList CmdArgs;
10979 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000010980 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
10981 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010982 // ptxas does not accept -g option if optimization is enabled, so
10983 // we ignore the compiler's -O* options if we want debug info.
10984 CmdArgs.push_back("-g");
10985 CmdArgs.push_back("--dont-merge-basicblocks");
10986 CmdArgs.push_back("--return-at-end");
10987 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10988 // Map the -O we received to -O{0,1,2,3}.
10989 //
10990 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10991 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010992
Justin Lebar2836dcd2016-01-19 19:52:21 +000010993 // -O3 seems like the least-bad option when -Osomething is specified to
10994 // clang but it isn't handled below.
10995 StringRef OOpt = "3";
10996 if (A->getOption().matches(options::OPT_O4) ||
10997 A->getOption().matches(options::OPT_Ofast))
10998 OOpt = "3";
10999 else if (A->getOption().matches(options::OPT_O0))
11000 OOpt = "0";
11001 else if (A->getOption().matches(options::OPT_O)) {
11002 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
11003 OOpt = llvm::StringSwitch<const char *>(A->getValue())
11004 .Case("1", "1")
11005 .Case("2", "2")
11006 .Case("3", "3")
11007 .Case("s", "2")
11008 .Case("z", "2")
11009 .Default("2");
11010 }
11011 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11012 } else {
11013 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11014 // to no optimizations, but ptxas's default is -O3.
11015 CmdArgs.push_back("-O0");
11016 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011017
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011018 CmdArgs.push_back("--gpu-name");
11019 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11020 CmdArgs.push_back("--output-file");
11021 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11022 for (const auto& II : Inputs)
11023 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11024
11025 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11026 CmdArgs.push_back(Args.MakeArgString(A));
11027
11028 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11029 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11030}
11031
11032// All inputs to this linker must be from CudaDeviceActions, as we need to look
11033// at the Inputs' Actions in order to figure out which GPU architecture they
11034// correspond to.
11035void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11036 const InputInfo &Output,
11037 const InputInfoList &Inputs,
11038 const ArgList &Args,
11039 const char *LinkingOutput) const {
11040 const auto &TC =
11041 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011042 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011043
11044 ArgStringList CmdArgs;
11045 CmdArgs.push_back("--cuda");
11046 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11047 CmdArgs.push_back(Args.MakeArgString("--create"));
11048 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11049
11050 for (const auto& II : Inputs) {
11051 auto* A = cast<const CudaDeviceAction>(II.getAction());
11052 // We need to pass an Arch of the form "sm_XX" for cubin files and
11053 // "compute_XX" for ptx.
11054 const char *Arch = (II.getType() == types::TY_PP_Asm)
11055 ? A->getComputeArchName()
11056 : A->getGpuArchName();
11057 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11058 Arch + ",file=" + II.getFilename()));
11059 }
11060
11061 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11062 CmdArgs.push_back(Args.MakeArgString(A));
11063
11064 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11065 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11066}