blob: e1d0ffb296822165ce268d27a84b45ef15ef7686 [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Eric Christopher49062a52015-12-22 03:12:34 +000055static void handleTargetFeaturesGroup(const ArgList &Args,
56 std::vector<const char *> &Features,
57 OptSpecifier Group) {
58 for (const Arg *A : Args.filtered(Group)) {
59 StringRef Name = A->getOption().getName();
60 A->claim();
61
62 // Skip over "-m".
63 assert(Name.startswith("m") && "Invalid feature name.");
64 Name = Name.substr(1);
65
66 bool IsNegative = Name.startswith("no-");
67 if (IsNegative)
68 Name = Name.substr(3);
69 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
70 }
71}
72
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000073static const char *getSparcAsmModeForCPU(StringRef Name,
74 const llvm::Triple &Triple) {
75 if (Triple.getArch() == llvm::Triple::sparcv9) {
76 return llvm::StringSwitch<const char *>(Name)
77 .Case("niagara", "-Av9b")
78 .Case("niagara2", "-Av9b")
79 .Case("niagara3", "-Av9d")
80 .Case("niagara4", "-Av9d")
81 .Default("-Av9");
82 } else {
83 return llvm::StringSwitch<const char *>(Name)
84 .Case("v8", "-Av8")
85 .Case("supersparc", "-Av8")
86 .Case("sparclite", "-Asparclite")
87 .Case("f934", "-Asparclite")
88 .Case("hypersparc", "-Av8")
89 .Case("sparclite86x", "-Asparclite")
90 .Case("sparclet", "-Asparclet")
91 .Case("tsc701", "-Asparclet")
92 .Case("v9", "-Av8plus")
93 .Case("ultrasparc", "-Av8plus")
94 .Case("ultrasparc3", "-Av8plus")
95 .Case("niagara", "-Av8plusb")
96 .Case("niagara2", "-Av8plusb")
97 .Case("niagara3", "-Av8plusd")
98 .Case("niagara4", "-Av8plusd")
99 .Default("-Av8");
100 }
101}
102
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000103/// CheckPreprocessingOptions - Perform some validation of preprocessing
104/// arguments that is shared with gcc.
105static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +0000106 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
107 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
108 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000109 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +0000110 << A->getBaseArg().getAsString(Args)
111 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
112 }
113 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000114}
115
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000116/// CheckCodeGenerationOptions - Perform some validation of code generation
117/// arguments that is shared with gcc.
118static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
119 // In gcc, only ARM checks this, but it seems reasonable to check universally.
120 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000121 if (const Arg *A =
122 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
123 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
124 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000125}
126
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000127// Add backslashes to escape spaces and other backslashes.
128// This is used for the space-separated argument list specified with
129// the -dwarf-debug-flags option.
130static void EscapeSpacesAndBackslashes(const char *Arg,
131 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000132 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000133 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000134 default:
135 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000136 case ' ':
137 case '\\':
138 Res.push_back('\\');
139 break;
140 }
141 Res.push_back(*Arg);
142 }
143}
144
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000145// Quote target names for inclusion in GNU Make dependency files.
146// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000147static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000148 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
149 switch (Target[i]) {
150 case ' ':
151 case '\t':
152 // Escape the preceding backslashes
153 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
154 Res.push_back('\\');
155
156 // Escape the space/tab
157 Res.push_back('\\');
158 break;
159 case '$':
160 Res.push_back('$');
161 break;
162 case '#':
163 Res.push_back('\\');
164 break;
165 default:
166 break;
167 }
168
169 Res.push_back(Target[i]);
170 }
171}
172
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000173static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
174 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000175 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000176 bool CombinedArg = false;
177
Bill Wendling281ca292012-03-12 21:22:35 +0000178 if (!DirList)
179 return; // Nothing to do.
180
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 StringRef Name(ArgName);
182 if (Name.equals("-I") || Name.equals("-L"))
183 CombinedArg = true;
184
Bill Wendling281ca292012-03-12 21:22:35 +0000185 StringRef Dirs(DirList);
186 if (Dirs.empty()) // Empty string should not add '.'.
187 return;
188
189 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000190 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000191 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000192 if (CombinedArg) {
193 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
194 } else {
195 CmdArgs.push_back(ArgName);
196 CmdArgs.push_back(".");
197 }
Bill Wendling281ca292012-03-12 21:22:35 +0000198 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000199 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000200 CmdArgs.push_back(
201 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
Nico Weber89355782012-03-19 15:00:03 +0000207 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000208 }
209
210 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000211 if (CombinedArg) {
212 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
213 } else {
214 CmdArgs.push_back(ArgName);
215 CmdArgs.push_back(".");
216 }
Bill Wendling281ca292012-03-12 21:22:35 +0000217 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000218 if (CombinedArg) {
219 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
220 } else {
221 CmdArgs.push_back(ArgName);
222 CmdArgs.push_back(Args.MakeArgString(Dirs));
223 }
Bill Wendling281ca292012-03-12 21:22:35 +0000224 }
225}
226
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000227static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
228 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000229 const Driver &D = TC.getDriver();
230
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000231 // Add extra linker input arguments which are not treated as inputs
232 // (constructed via -Xarch_).
233 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
234
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000235 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000236 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000237 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000238 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000239
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000240 // Add filenames immediately.
241 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000242 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000243 continue;
244 }
245
246 // Otherwise, this is a linker input argument.
247 const Arg &A = II.getInputArg();
248
249 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000250 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000251 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000252 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000253 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000254 else if (A.getOption().matches(options::OPT_z)) {
255 // Pass -z prefix for gcc linker compatibility.
256 A.claim();
257 A.render(Args, CmdArgs);
258 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000259 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000260 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000261 }
Bill Wendling281ca292012-03-12 21:22:35 +0000262
263 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000264 // and only supported on native toolchains.
265 if (!TC.isCrossCompiling())
266 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000267}
268
John McCall31168b02011-06-15 23:02:42 +0000269/// \brief Determine whether Objective-C automated reference counting is
270/// enabled.
271static bool isObjCAutoRefCount(const ArgList &Args) {
272 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
273}
274
Ted Kremeneke65b0862012-03-06 20:05:56 +0000275/// \brief Determine whether we are linking the ObjC runtime.
276static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000277 if (isObjCAutoRefCount(Args)) {
278 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000279 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000280 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000281 return Args.hasArg(options::OPT_fobjc_link_runtime);
282}
283
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000284static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000285 // Don't forward inputs from the original command line. They are added from
286 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000287 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000288 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000289}
290
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000291void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
292 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000293 ArgStringList &CmdArgs,
294 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000295 const InputInfoList &Inputs,
296 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000297 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000298
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000299 CheckPreprocessingOptions(D, Args);
300
301 Args.AddLastArg(CmdArgs, options::OPT_C);
302 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000303
304 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000305 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000306 (A = Args.getLastArg(options::OPT_MD)) ||
307 (A = Args.getLastArg(options::OPT_MMD))) {
308 // Determine the output location.
309 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000310 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000311 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000312 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000313 } else if (Output.getType() == types::TY_Dependencies) {
314 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000315 } else if (A->getOption().matches(options::OPT_M) ||
316 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000317 DepFile = "-";
318 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000319 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000320 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000321 }
322 CmdArgs.push_back("-dependency-file");
323 CmdArgs.push_back(DepFile);
324
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000326 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
327 const char *DepTarget;
328
329 // If user provided -o, that is the dependency target, except
330 // when we are only generating a dependency file.
331 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
332 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000333 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000334 } else {
335 // Otherwise derive from the base input.
336 //
337 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000338 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000339 llvm::sys::path::replace_extension(P, "o");
340 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000341 }
342
343 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000344 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000345 QuoteTarget(DepTarget, Quoted);
346 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 }
348
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000349 if (A->getOption().matches(options::OPT_M) ||
350 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000351 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000352 if ((isa<PrecompileJobAction>(JA) &&
353 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
354 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000355 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000356 }
357
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000358 if (Args.hasArg(options::OPT_MG)) {
359 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000361 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000362 CmdArgs.push_back("-MG");
363 }
364
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000366 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000367
368 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000369 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000370 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000371
Daniel Dunbara442fd52010-06-11 22:00:13 +0000372 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000373 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000374 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000375 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000376 CmdArgs.push_back(Args.MakeArgString(Quoted));
377
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000378 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000379 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000380 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000381 }
382 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000383
Douglas Gregor111af7d2009-04-18 00:34:01 +0000384 // Add -i* options, and automatically translate to
385 // -include-pch/-include-pth for transparent PCH support. It's
386 // wonky, but we include looking for .gch so we can support seamless
387 // replacement into a build system already set up to be generating
388 // .gch files.
Nico Weber2ca4be92016-03-01 23:16:44 +0000389 int YcIndex = -1, YuIndex = -1;
390 {
391 int AI = -1;
392 const Arg *YcArg = Args.getLastArg(options::OPT__SLASH_Yc);
393 const Arg *YuArg = Args.getLastArg(options::OPT__SLASH_Yu);
394 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
395 // Walk the whole i_Group and skip non "-include" flags so that the index
396 // here matches the index in the next loop below.
397 ++AI;
398 if (!A->getOption().matches(options::OPT_include))
399 continue;
400 if (YcArg && strcmp(A->getValue(), YcArg->getValue()) == 0)
401 YcIndex = AI;
402 if (YuArg && strcmp(A->getValue(), YuArg->getValue()) == 0)
403 YuIndex = AI;
404 }
405 }
406 if (isa<PrecompileJobAction>(JA) && YcIndex != -1) {
407 Driver::InputList Inputs;
408 D.BuildInputs(getToolChain(), C.getArgs(), Inputs);
409 assert(Inputs.size() == 1 && "Need one input when building pch");
410 CmdArgs.push_back(Args.MakeArgString(Twine("-find-pch-source=") +
411 Inputs[0].second->getValue()));
412 }
413
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 bool RenderedImplicitInclude = false;
Nico Weber2ca4be92016-03-01 23:16:44 +0000415 int AI = -1;
Sean Silva14facf32015-06-09 01:57:17 +0000416 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Nico Weber2ca4be92016-03-01 23:16:44 +0000417 ++AI;
418
Nico Weberd8ff0ee2016-04-02 19:10:07 +0000419 if (getToolChain().getDriver().IsCLMode() &&
420 A->getOption().matches(options::OPT_include)) {
Junmo Parke19d6792016-03-17 06:41:27 +0000421 // In clang-cl mode, /Ycfoo.h means that all code up to a foo.h
Nico Weber2ca4be92016-03-01 23:16:44 +0000422 // include is compiled into foo.h, and everything after goes into
423 // the .obj file. /Yufoo.h means that all includes prior to and including
424 // foo.h are completely skipped and replaced with a use of the pch file
425 // for foo.h. (Each flag can have at most one value, multiple /Yc flags
426 // just mean that the last one wins.) If /Yc and /Yu are both present
427 // and refer to the same file, /Yc wins.
428 // Note that OPT__SLASH_FI gets mapped to OPT_include.
429 // FIXME: The code here assumes that /Yc and /Yu refer to the same file.
430 // cl.exe seems to support both flags with different values, but that
431 // seems strange (which flag does /Fp now refer to?), so don't implement
Nico Weberd1728f02016-03-23 18:17:02 +0000432 // that until someone needs it.
Nico Weber2ca4be92016-03-01 23:16:44 +0000433 int PchIndex = YcIndex != -1 ? YcIndex : YuIndex;
434 if (PchIndex != -1) {
435 if (isa<PrecompileJobAction>(JA)) {
436 // When building the pch, skip all includes after the pch.
437 assert(YcIndex != -1 && PchIndex == YcIndex);
438 if (AI >= YcIndex)
439 continue;
440 } else {
441 // When using the pch, skip all includes prior to the pch.
Nico Weberd1728f02016-03-23 18:17:02 +0000442 if (AI < PchIndex) {
443 A->claim();
Nico Weber2ca4be92016-03-01 23:16:44 +0000444 continue;
Nico Weberd1728f02016-03-23 18:17:02 +0000445 }
Nico Weber2ca4be92016-03-01 23:16:44 +0000446 if (AI == PchIndex) {
447 A->claim();
448 CmdArgs.push_back("-include-pch");
449 CmdArgs.push_back(
450 Args.MakeArgString(D.GetClPchPath(C, A->getValue())));
451 continue;
452 }
453 }
454 }
455 } else if (A->getOption().matches(options::OPT_include)) {
456 // Handling of gcc-style gch precompiled headers.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000457 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
458 RenderedImplicitInclude = true;
459
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000460 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000461 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000462
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000463 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000464 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000465 SmallString<128> P(A->getValue());
466 // We want the files to have a name like foo.h.pch. Add a dummy extension
467 // so that replace_extension does the right thing.
468 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000469 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000470 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000471 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000472 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000473 }
474
Douglas Gregor111af7d2009-04-18 00:34:01 +0000475 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000476 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000477 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000478 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000479 }
480
Douglas Gregor111af7d2009-04-18 00:34:01 +0000481 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000482 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000483 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000484 FoundPCH = UsePCH;
485 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000486 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000487 }
488
489 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000490 if (IsFirstImplicitInclude) {
491 A->claim();
492 if (UsePCH)
493 CmdArgs.push_back("-include-pch");
494 else
495 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000496 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000497 continue;
498 } else {
499 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000500 D.Diag(diag::warn_drv_pch_not_first_include) << P
501 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000502 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000503 }
504 }
505
506 // Not translated, render as usual.
507 A->claim();
508 A->render(Args, CmdArgs);
509 }
510
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000511 Args.AddAllArgs(CmdArgs,
512 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
513 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000514
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000515 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000516
517 // FIXME: There is a very unfortunate problem here, some troubled
518 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
519 // really support that we would have to parse and then translate
520 // those options. :(
521 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
522 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000523
524 // -I- is a deprecated GCC feature, reject it.
525 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000527
528 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
529 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000530 StringRef sysroot = C.getSysRoot();
531 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000532 if (!Args.hasArg(options::OPT_isysroot)) {
533 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000534 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000535 }
536 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000537
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000538 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000539 // FIXME: We should probably sink the logic for handling these from the
540 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000541 // CPATH - included following the user specified includes (but prior to
542 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000543 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000544 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000545 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000546 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000547 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000548 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000549 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000550 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000551 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000552
Artem Belevichfa11ab52015-11-17 22:28:46 +0000553 // Optional AuxToolChain indicates that we need to include headers
554 // for more than one target. If that's the case, add include paths
555 // from AuxToolChain right after include paths of the same kind for
556 // the current target.
557
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000558 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000559 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000560 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000561 if (AuxToolChain)
562 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
563 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000564
565 // Add system include arguments.
566 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000567 if (AuxToolChain)
568 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
569
570 // Add CUDA include arguments, if needed.
571 if (types::isCuda(Inputs[0].getType()))
572 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000573}
574
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000575// FIXME: Move to target hook.
576static bool isSignedCharDefault(const llvm::Triple &Triple) {
577 switch (Triple.getArch()) {
578 default:
579 return true;
580
Tim Northover9bb857a2013-01-31 12:13:10 +0000581 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000582 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000583 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000584 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000585 case llvm::Triple::thumb:
586 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000587 if (Triple.isOSDarwin() || Triple.isOSWindows())
588 return true;
589 return false;
590
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000591 case llvm::Triple::ppc:
592 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000593 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000594 return true;
595 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000596
David Majnemerdcecd932015-05-23 19:23:55 +0000597 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000598 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000599 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000600 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000601 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000602 }
603}
604
Robert Lytton0e076492013-08-13 09:43:10 +0000605static bool isNoCommonDefault(const llvm::Triple &Triple) {
606 switch (Triple.getArch()) {
607 default:
608 return false;
609
610 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000611 case llvm::Triple::wasm32:
612 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000613 return true;
614 }
615}
616
Renato Goline17c5802015-07-27 23:44:42 +0000617// ARM tools start.
618
619// Get SubArch (vN).
620static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
621 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000622 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000623}
624
625// True if M-profile.
626static bool isARMMProfile(const llvm::Triple &Triple) {
627 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000628 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000629 return Profile == llvm::ARM::PK_M;
630}
631
632// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000633static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
634 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000635 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
636 CPU = A->getValue();
637 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
638 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000639 if (!FromAs)
640 return;
641
642 for (const Arg *A :
643 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
644 StringRef Value = A->getValue();
645 if (Value.startswith("-mcpu="))
646 CPU = Value.substr(6);
647 if (Value.startswith("-march="))
648 Arch = Value.substr(7);
649 }
Renato Goline17c5802015-07-27 23:44:42 +0000650}
651
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000652// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000653// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000654static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000655 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000656 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000657 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
658 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000659 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
660}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000661
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000662// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000663static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000664 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000665 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000666 unsigned FPUID = llvm::ARM::parseFPU(FPU);
667 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000668 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
669}
670
Bradley Smithbbf5a002015-11-18 16:33:48 +0000671// Decode ARM features from string like +[no]featureA+[no]featureB+...
672static bool DecodeARMFeatures(const Driver &D, StringRef text,
673 std::vector<const char *> &Features) {
674 SmallVector<StringRef, 8> Split;
675 text.split(Split, StringRef("+"), -1, false);
676
677 for (StringRef Feature : Split) {
678 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
679 if (FeatureName)
680 Features.push_back(FeatureName);
681 else
682 return false;
683 }
684 return true;
685}
686
Renato Golin7c542b42015-07-27 23:44:45 +0000687// Check if -march is valid by checking if it can be canonicalised and parsed.
688// getARMArch is used here instead of just checking the -march value in order
689// to handle -march=native correctly.
690static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000691 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000692 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000693 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000694 std::pair<StringRef, StringRef> Split = ArchName.split("+");
695
Renato Goline17c5802015-07-27 23:44:42 +0000696 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000697 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
698 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000699 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000700}
701
Renato Golin7c542b42015-07-27 23:44:45 +0000702// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
703static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
704 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000705 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000706 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000707 std::pair<StringRef, StringRef> Split = CPUName.split("+");
708
Renato Goline17c5802015-07-27 23:44:42 +0000709 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000710 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
711 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000712 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000713}
714
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000715static bool useAAPCSForMachO(const llvm::Triple &T) {
716 // The backend is hardwired to assume AAPCS for M-class processors, ensure
717 // the frontend matches that.
718 return T.getEnvironment() == llvm::Triple::EABI ||
719 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
720}
721
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000722// Select the float ABI as determined by -msoft-float, -mhard-float, and
723// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000724arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
725 const Driver &D = TC.getDriver();
726 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000727 auto SubArch = getARMSubArchVersionNumber(Triple);
728 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000729 if (Arg *A =
730 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
731 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000732 if (A->getOption().matches(options::OPT_msoft_float)) {
733 ABI = FloatABI::Soft;
734 } else if (A->getOption().matches(options::OPT_mhard_float)) {
735 ABI = FloatABI::Hard;
736 } else {
737 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
738 .Case("soft", FloatABI::Soft)
739 .Case("softfp", FloatABI::SoftFP)
740 .Case("hard", FloatABI::Hard)
741 .Default(FloatABI::Invalid);
742 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000743 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000744 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000745 }
746 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000747
748 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
749 // "apcs-gnu".
750 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000751 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000752 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
753 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000754 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000755 }
756
757 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000758 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000759 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000760 case llvm::Triple::Darwin:
761 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000762 case llvm::Triple::IOS:
763 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000764 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000765 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000766 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000767 break;
768 }
Tim Northover756447a2015-10-30 16:30:36 +0000769 case llvm::Triple::WatchOS:
770 ABI = FloatABI::Hard;
771 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000772
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000773 // FIXME: this is invalid for WindowsCE
774 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000775 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000776 break;
777
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000778 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000779 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000780 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000782 break;
783 default:
784 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000786 break;
787 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000788 break;
789
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000791 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000792 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000793 case llvm::Triple::EABIHF:
794 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000795 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000796 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000797 case llvm::Triple::EABI:
798 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000799 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000800 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000801 case llvm::Triple::Android:
802 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000803 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000804 default:
805 // Assume "soft", but warn the user we are guessing.
Tim Northover99694fe2016-04-13 17:08:51 +0000806 if (Triple.isOSBinFormatMachO() &&
807 Triple.getSubArch() == llvm::Triple::ARMSubArch_v7em)
808 ABI = FloatABI::Hard;
809 else
810 ABI = FloatABI::Soft;
811
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000812 if (Triple.getOS() != llvm::Triple::UnknownOS ||
813 !Triple.isOSBinFormatMachO())
814 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000815 break;
816 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000817 }
818 }
819
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000820 assert(ABI != FloatABI::Invalid && "must select an ABI");
821 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000822}
823
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000824static void getARMTargetFeatures(const ToolChain &TC,
825 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000826 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000827 std::vector<const char *> &Features,
828 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000829 const Driver &D = TC.getDriver();
830
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000831 bool KernelOrKext =
832 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000833 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000834 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
835 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
836
Nico Weber6e0ebae2015-04-29 21:16:40 +0000837 if (!ForAS) {
838 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
839 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
840 // stripped out by the ARM target. We should probably pass this a new
841 // -target-option, which is handled by the -cc1/-cc1as invocation.
842 //
843 // FIXME2: For consistency, it would be ideal if we set up the target
844 // machine state the same when using the frontend or the assembler. We don't
845 // currently do that for the assembler, we pass the options directly to the
846 // backend and never even instantiate the frontend TargetInfo. If we did,
847 // and used its handleTargetFeatures hook, then we could ensure the
848 // assembler and the frontend behave the same.
849
850 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000851 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000852 Features.push_back("+soft-float");
853
854 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000855 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000856 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000857 } else {
858 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
859 // to the assembler correctly.
860 for (const Arg *A :
861 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
862 StringRef Value = A->getValue();
863 if (Value.startswith("-mfpu=")) {
864 WaFPU = A;
865 } else if (Value.startswith("-mcpu=")) {
866 WaCPU = A;
867 } else if (Value.startswith("-mhwdiv=")) {
868 WaHDiv = A;
869 } else if (Value.startswith("-march=")) {
870 WaArch = A;
871 }
872 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000873 }
874
Renato Golin7c542b42015-07-27 23:44:45 +0000875 // Check -march. ClangAs gives preference to -Wa,-march=.
876 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000877 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000878 if (WaArch) {
879 if (ArchArg)
880 D.Diag(clang::diag::warn_drv_unused_argument)
881 << ArchArg->getAsString(Args);
882 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000883 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000884 // FIXME: Set Arch.
885 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
886 } else if (ArchArg) {
887 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000888 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000889 }
890
Renato Golin7c542b42015-07-27 23:44:45 +0000891 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
892 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000893 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000894 if (WaCPU) {
895 if (CPUArg)
896 D.Diag(clang::diag::warn_drv_unused_argument)
897 << CPUArg->getAsString(Args);
898 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000899 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000900 } else if (CPUArg) {
901 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000902 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000903 }
John Brawna95c1a82015-05-08 12:52:18 +0000904
Renato Golin23459c62015-07-30 16:40:17 +0000905 // Add CPU features for generic CPUs
906 if (CPUName == "native") {
907 llvm::StringMap<bool> HostFeatures;
908 if (llvm::sys::getHostCPUFeatures(HostFeatures))
909 for (auto &F : HostFeatures)
910 Features.push_back(
911 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
912 }
913
914 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
915 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
916 if (WaFPU) {
917 if (FPUArg)
918 D.Diag(clang::diag::warn_drv_unused_argument)
919 << FPUArg->getAsString(Args);
920 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
921 Features);
922 } else if (FPUArg) {
923 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
924 }
925
926 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
927 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
928 if (WaHDiv) {
929 if (HDivArg)
930 D.Diag(clang::diag::warn_drv_unused_argument)
931 << HDivArg->getAsString(Args);
932 getARMHWDivFeatures(D, WaHDiv, Args,
933 StringRef(WaHDiv->getValue()).substr(8), Features);
934 } else if (HDivArg)
935 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
936
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000937 // Setting -msoft-float effectively disables NEON because of the GCC
938 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000939 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000940 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000941 // Also need to explicitly disable features which imply NEON.
942 Features.push_back("-crypto");
943 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000944
Eric Christopher269c2a22015-04-04 03:34:43 +0000945 // En/disable crc code generation.
946 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000947 if (A->getOption().matches(options::OPT_mcrc))
948 Features.push_back("+crc");
949 else
950 Features.push_back("-crc");
951 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000952
Akira Hatanakac2694822015-07-07 08:28:42 +0000953 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
954 // neither options are specified, see if we are compiling for kernel/kext and
955 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000956 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
957 options::OPT_mno_long_calls)) {
958 if (A->getOption().matches(options::OPT_mlong_calls))
959 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000960 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
961 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000962 Features.push_back("+long-calls");
963 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000964
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000965 // Kernel code has more strict alignment requirements.
966 if (KernelOrKext)
967 Features.push_back("+strict-align");
968 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
969 options::OPT_munaligned_access)) {
970 if (A->getOption().matches(options::OPT_munaligned_access)) {
971 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
972 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
973 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
Bradley Smithf4affc12016-03-03 13:52:22 +0000974 // v8M Baseline follows on from v6M, so doesn't support unaligned memory
975 // access either.
976 else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
977 D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000978 } else
979 Features.push_back("+strict-align");
980 } else {
981 // Assume pre-ARMv6 doesn't support unaligned accesses.
982 //
983 // ARMv6 may or may not support unaligned accesses depending on the
984 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
985 // Darwin and NetBSD targets support unaligned accesses, and others don't.
986 //
987 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
988 // which raises an alignment fault on unaligned accesses. Linux
989 // defaults this bit to 0 and handles it as a system-wide (not
990 // per-process) setting. It is therefore safe to assume that ARMv7+
991 // Linux targets support unaligned accesses. The same goes for NaCl.
992 //
993 // The above behavior is consistent with GCC.
994 int VersionNum = getARMSubArchVersionNumber(Triple);
995 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000996 if (VersionNum < 6 ||
997 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000998 Features.push_back("+strict-align");
999 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
1000 if (VersionNum < 7)
1001 Features.push_back("+strict-align");
1002 } else
1003 Features.push_back("+strict-align");
1004 }
1005
Akira Hatanaka0a23fac2015-07-21 01:41:08 +00001006 // llvm does not support reserving registers in general. There is support
1007 // for reserving r9 on ARM though (defined as a platform-specific register
1008 // in ARM EABI).
1009 if (Args.hasArg(options::OPT_ffixed_r9))
1010 Features.push_back("+reserve-r9");
1011
Dimitry Andric08107392016-01-06 07:42:18 +00001012 // The kext linker doesn't know how to deal with movw/movt.
1013 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +00001014 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015}
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001016
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00001017void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
1018 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001019 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001020 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +00001021 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +00001022 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001023 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001024 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +00001025 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +00001026 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001027 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +00001028 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +00001029 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +00001030 } else {
1031 ABIName = "apcs-gnu";
1032 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00001033 } else if (Triple.isOSWindows()) {
1034 // FIXME: this is invalid for WindowsCE
1035 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001036 } else {
1037 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001038 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +00001039 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001040 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001041 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001042 ABIName = "aapcs-linux";
1043 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +00001044 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001045 case llvm::Triple::EABI:
1046 ABIName = "aapcs";
1047 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001048 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +00001049 if (Triple.getOS() == llvm::Triple::NetBSD)
1050 ABIName = "apcs-gnu";
1051 else
1052 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +00001053 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001054 }
1055 }
1056 CmdArgs.push_back("-target-abi");
1057 CmdArgs.push_back(ABIName);
1058
Anton Korobeynikova29e4622012-04-09 13:38:30 +00001059 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001060 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001061 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001062 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +00001063 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +00001064 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001065 CmdArgs.push_back("-mfloat-abi");
1066 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001067 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +00001068 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001069 CmdArgs.push_back("-mfloat-abi");
1070 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +00001071 } else {
1072 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00001073 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001074 CmdArgs.push_back("-mfloat-abi");
1075 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001076 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001077
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001078 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001079 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1080 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001081 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001082 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001083 CmdArgs.push_back("-arm-global-merge=false");
1084 else
1085 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001086 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001087
Bob Wilson9c8af452013-04-11 18:53:25 +00001088 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001089 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001090 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001091}
Renato Goline17c5802015-07-27 23:44:42 +00001092// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001093
Tim Northover573cbee2014-05-24 12:52:07 +00001094/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1095/// targeting.
1096static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001097 Arg *A;
1098 std::string CPU;
1099 // If we have -mtune or -mcpu, use that.
1100 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001101 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001102 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001103 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001104 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001105 }
1106
Kevin Qin110db6f2014-07-18 07:03:22 +00001107 // Handle CPU name is 'native'.
1108 if (CPU == "native")
1109 return llvm::sys::getHostCPUName();
1110 else if (CPU.size())
1111 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001112
James Molloy9b1586b2014-04-17 12:51:17 +00001113 // Make sure we pick "cyclone" if -arch is used.
1114 // FIXME: Should this be picked by checking the target triple instead?
1115 if (Args.getLastArg(options::OPT_arch))
1116 return "cyclone";
1117
1118 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001119}
1120
Tim Northover573cbee2014-05-24 12:52:07 +00001121void Clang::AddAArch64TargetArgs(const ArgList &Args,
1122 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001123 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1124 llvm::Triple Triple(TripleStr);
1125
1126 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1127 Args.hasArg(options::OPT_mkernel) ||
1128 Args.hasArg(options::OPT_fapple_kext))
1129 CmdArgs.push_back("-disable-red-zone");
1130
1131 if (!Args.hasFlag(options::OPT_mimplicit_float,
1132 options::OPT_mno_implicit_float, true))
1133 CmdArgs.push_back("-no-implicit-float");
1134
Craig Topper92fc2df2014-05-17 16:56:41 +00001135 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1137 ABIName = A->getValue();
1138 else if (Triple.isOSDarwin())
1139 ABIName = "darwinpcs";
1140 else
1141 ABIName = "aapcs";
1142
1143 CmdArgs.push_back("-target-abi");
1144 CmdArgs.push_back(ABIName);
1145
Bradley Smith9ff64332014-10-13 10:16:06 +00001146 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1147 options::OPT_mno_fix_cortex_a53_835769)) {
1148 CmdArgs.push_back("-backend-option");
1149 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1150 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1151 else
1152 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001153 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001154 // Enabled A53 errata (835769) workaround by default on android
1155 CmdArgs.push_back("-backend-option");
1156 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001157 }
1158
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001159 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001160 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1161 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001162 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001163 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001164 CmdArgs.push_back("-aarch64-global-merge=false");
1165 else
1166 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001167 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001168}
1169
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001170// Get CPU and ABI names. They are not independent
1171// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1173 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001174 const char *DefMips32CPU = "mips32r2";
1175 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001176
Daniel Sanders2bf13662014-07-10 14:40:57 +00001177 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1178 // default for mips64(el)?-img-linux-gnu.
1179 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1180 Triple.getEnvironment() == llvm::Triple::GNU) {
1181 DefMips32CPU = "mips32r6";
1182 DefMips64CPU = "mips64r6";
1183 }
Renato Golin7c542b42015-07-27 23:44:45 +00001184
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001185 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001186 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001187 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001188
Brad Smithba26f582015-01-06 02:53:17 +00001189 // MIPS3 is the default for mips64*-unknown-openbsd.
1190 if (Triple.getOS() == llvm::Triple::OpenBSD)
1191 DefMips64CPU = "mips3";
1192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001193 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001194 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001195
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001196 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001197 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001198 // Convert a GNU style Mips ABI name to the name
1199 // accepted by LLVM Mips backend.
1200 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001201 .Case("32", "o32")
1202 .Case("64", "n64")
1203 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001204 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001205
1206 // Setup default CPU and ABI names.
1207 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001208 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001209 default:
1210 llvm_unreachable("Unexpected triple arch name");
1211 case llvm::Triple::mips:
1212 case llvm::Triple::mipsel:
1213 CPUName = DefMips32CPU;
1214 break;
1215 case llvm::Triple::mips64:
1216 case llvm::Triple::mips64el:
1217 CPUName = DefMips64CPU;
1218 break;
1219 }
1220 }
1221
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001222 if (ABIName.empty()) {
1223 // Deduce ABI name from the target triple.
1224 if (Triple.getArch() == llvm::Triple::mips ||
1225 Triple.getArch() == llvm::Triple::mipsel)
1226 ABIName = "o32";
1227 else
1228 ABIName = "n64";
1229 }
1230
1231 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001232 // Deduce CPU name from ABI name.
1233 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001234 .Cases("o32", "eabi", DefMips32CPU)
1235 .Cases("n32", "n64", DefMips64CPU)
1236 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001237 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001238
1239 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001240}
1241
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001242std::string mips::getMipsABILibSuffix(const ArgList &Args,
1243 const llvm::Triple &Triple) {
1244 StringRef CPUName, ABIName;
1245 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1246 return llvm::StringSwitch<std::string>(ABIName)
1247 .Case("o32", "")
1248 .Case("n32", "32")
1249 .Case("n64", "64");
1250}
1251
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001252// Convert ABI name to the GNU tools acceptable variant.
1253static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1254 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001255 .Case("o32", "32")
1256 .Case("n64", "64")
1257 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001258}
1259
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001260// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1261// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001262static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1263 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001264 if (Arg *A =
1265 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1266 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001267 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001268 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001269 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001270 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001271 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001272 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1273 .Case("soft", mips::FloatABI::Soft)
1274 .Case("hard", mips::FloatABI::Hard)
1275 .Default(mips::FloatABI::Invalid);
1276 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001277 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001278 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001279 }
1280 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001281 }
1282
1283 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001284 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001285 // Assume "hard", because it's a default value used by gcc.
1286 // When we start to recognize specific target MIPS processors,
1287 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001288 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001289 }
1290
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001291 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1292 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293}
1294
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001295static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001296 std::vector<const char *> &Features,
1297 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001298 StringRef FeatureName) {
1299 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001300 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001301 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001302 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001303 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001304 }
1305}
1306
Daniel Sanders379d44b2014-07-16 11:52:23 +00001307static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1308 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001309 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001310 StringRef CPUName;
1311 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001313 ABIName = getGnuCompatibleMipsABIName(ABIName);
1314
Daniel Sandersfeb61302014-08-08 15:47:17 +00001315 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1316 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001317
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001318 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1319 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001320 // FIXME: Note, this is a hack. We need to pass the selected float
1321 // mode to the MipsTargetInfoBase to define appropriate macros there.
1322 // Now it is the only method.
1323 Features.push_back("+soft-float");
1324 }
1325
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001326 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001327 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001328 if (Val == "2008") {
1329 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1330 Features.push_back("+nan2008");
1331 else {
1332 Features.push_back("-nan2008");
1333 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1334 }
1335 } else if (Val == "legacy") {
1336 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1337 Features.push_back("-nan2008");
1338 else {
1339 Features.push_back("+nan2008");
1340 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1341 }
1342 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001343 D.Diag(diag::err_drv_unsupported_option_argument)
1344 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001345 }
1346
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001347 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1348 options::OPT_mdouble_float, "single-float");
1349 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1350 "mips16");
1351 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1352 options::OPT_mno_micromips, "micromips");
1353 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1354 "dsp");
1355 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1356 "dspr2");
1357 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1358 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001359
1360 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1361 // pass -mfpxx
1362 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1363 options::OPT_mfp64)) {
1364 if (A->getOption().matches(options::OPT_mfp32))
1365 Features.push_back(Args.MakeArgString("-fp64"));
1366 else if (A->getOption().matches(options::OPT_mfpxx)) {
1367 Features.push_back(Args.MakeArgString("+fpxx"));
1368 Features.push_back(Args.MakeArgString("+nooddspreg"));
1369 } else
1370 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001371 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001372 Features.push_back(Args.MakeArgString("+fpxx"));
1373 Features.push_back(Args.MakeArgString("+nooddspreg"));
1374 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001375
Daniel Sanders28e5d392014-07-10 10:39:51 +00001376 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1377 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001378}
1379
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001380void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001381 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001382 const Driver &D = getToolChain().getDriver();
1383 StringRef CPUName;
1384 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001385 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001386 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001387
1388 CmdArgs.push_back("-target-abi");
1389 CmdArgs.push_back(ABIName.data());
1390
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001391 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1392 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001393 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001394 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001395 CmdArgs.push_back("-mfloat-abi");
1396 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001397 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001398 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001399 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001400 CmdArgs.push_back("-mfloat-abi");
1401 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001402 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001403
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001404 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1405 if (A->getOption().matches(options::OPT_mxgot)) {
1406 CmdArgs.push_back("-mllvm");
1407 CmdArgs.push_back("-mxgot");
1408 }
1409 }
1410
Simon Atanasyanc580b322013-05-11 06:33:44 +00001411 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1412 options::OPT_mno_ldc1_sdc1)) {
1413 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1414 CmdArgs.push_back("-mllvm");
1415 CmdArgs.push_back("-mno-ldc1-sdc1");
1416 }
1417 }
1418
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001419 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1420 options::OPT_mno_check_zero_division)) {
1421 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1422 CmdArgs.push_back("-mllvm");
1423 CmdArgs.push_back("-mno-check-zero-division");
1424 }
1425 }
1426
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001427 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001428 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001429 CmdArgs.push_back("-mllvm");
1430 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1431 A->claim();
1432 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001433}
1434
Hal Finkel8eb59282012-06-11 22:35:19 +00001435/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1436static std::string getPPCTargetCPU(const ArgList &Args) {
1437 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001438 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001439
1440 if (CPUName == "native") {
1441 std::string CPU = llvm::sys::getHostCPUName();
1442 if (!CPU.empty() && CPU != "generic")
1443 return CPU;
1444 else
1445 return "";
1446 }
1447
1448 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001449 .Case("common", "generic")
1450 .Case("440", "440")
1451 .Case("440fp", "440")
1452 .Case("450", "450")
1453 .Case("601", "601")
1454 .Case("602", "602")
1455 .Case("603", "603")
1456 .Case("603e", "603e")
1457 .Case("603ev", "603ev")
1458 .Case("604", "604")
1459 .Case("604e", "604e")
1460 .Case("620", "620")
1461 .Case("630", "pwr3")
1462 .Case("G3", "g3")
1463 .Case("7400", "7400")
1464 .Case("G4", "g4")
1465 .Case("7450", "7450")
1466 .Case("G4+", "g4+")
1467 .Case("750", "750")
1468 .Case("970", "970")
1469 .Case("G5", "g5")
1470 .Case("a2", "a2")
1471 .Case("a2q", "a2q")
1472 .Case("e500mc", "e500mc")
1473 .Case("e5500", "e5500")
1474 .Case("power3", "pwr3")
1475 .Case("power4", "pwr4")
1476 .Case("power5", "pwr5")
1477 .Case("power5x", "pwr5x")
1478 .Case("power6", "pwr6")
1479 .Case("power6x", "pwr6x")
1480 .Case("power7", "pwr7")
1481 .Case("power8", "pwr8")
1482 .Case("pwr3", "pwr3")
1483 .Case("pwr4", "pwr4")
1484 .Case("pwr5", "pwr5")
1485 .Case("pwr5x", "pwr5x")
1486 .Case("pwr6", "pwr6")
1487 .Case("pwr6x", "pwr6x")
1488 .Case("pwr7", "pwr7")
1489 .Case("pwr8", "pwr8")
1490 .Case("powerpc", "ppc")
1491 .Case("powerpc64", "ppc64")
1492 .Case("powerpc64le", "ppc64le")
1493 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001494 }
1495
1496 return "";
1497}
1498
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001499static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1500 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001501 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001502 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001503
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001504 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1505 if (FloatABI == ppc::FloatABI::Soft &&
1506 !(Triple.getArch() == llvm::Triple::ppc64 ||
1507 Triple.getArch() == llvm::Triple::ppc64le))
1508 Features.push_back("+soft-float");
1509 else if (FloatABI == ppc::FloatABI::Soft &&
1510 (Triple.getArch() == llvm::Triple::ppc64 ||
1511 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001512 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001513 << "soft float is not supported for ppc64";
1514
Eric Christopher643bb6a2013-10-16 20:40:08 +00001515 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001516 AddTargetFeature(Args, Features, options::OPT_faltivec,
1517 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001518}
1519
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001520ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1521 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1522 if (Arg *A =
1523 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1524 options::OPT_mfloat_abi_EQ)) {
1525 if (A->getOption().matches(options::OPT_msoft_float))
1526 ABI = ppc::FloatABI::Soft;
1527 else if (A->getOption().matches(options::OPT_mhard_float))
1528 ABI = ppc::FloatABI::Hard;
1529 else {
1530 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1531 .Case("soft", ppc::FloatABI::Soft)
1532 .Case("hard", ppc::FloatABI::Hard)
1533 .Default(ppc::FloatABI::Invalid);
1534 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1535 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1536 ABI = ppc::FloatABI::Hard;
1537 }
1538 }
1539 }
1540
1541 // If unspecified, choose the default based on the platform.
1542 if (ABI == ppc::FloatABI::Invalid) {
1543 ABI = ppc::FloatABI::Hard;
1544 }
1545
1546 return ABI;
1547}
1548
Ulrich Weigand8afad612014-07-28 13:17:52 +00001549void Clang::AddPPCTargetArgs(const ArgList &Args,
1550 ArgStringList &CmdArgs) const {
1551 // Select the ABI to use.
1552 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001553 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001554 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001555 case llvm::Triple::ppc64: {
1556 // When targeting a processor that supports QPX, or if QPX is
1557 // specifically enabled, default to using the ABI that supports QPX (so
1558 // long as it is not specifically disabled).
1559 bool HasQPX = false;
1560 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1561 HasQPX = A->getValue() == StringRef("a2q");
1562 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1563 if (HasQPX) {
1564 ABIName = "elfv1-qpx";
1565 break;
1566 }
1567
Ulrich Weigand8afad612014-07-28 13:17:52 +00001568 ABIName = "elfv1";
1569 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001570 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001571 case llvm::Triple::ppc64le:
1572 ABIName = "elfv2";
1573 break;
1574 default:
1575 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001576 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001577
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001578 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1579 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1580 // the option if given as we don't have backend support for any targets
1581 // that don't use the altivec abi.
1582 if (StringRef(A->getValue()) != "altivec")
1583 ABIName = A->getValue();
1584
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001585 ppc::FloatABI FloatABI =
1586 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1587
1588 if (FloatABI == ppc::FloatABI::Soft) {
1589 // Floating point operations and argument passing are soft.
1590 CmdArgs.push_back("-msoft-float");
1591 CmdArgs.push_back("-mfloat-abi");
1592 CmdArgs.push_back("soft");
1593 } else {
1594 // Floating point operations and argument passing are hard.
1595 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1596 CmdArgs.push_back("-mfloat-abi");
1597 CmdArgs.push_back("hard");
1598 }
1599
Ulrich Weigand8afad612014-07-28 13:17:52 +00001600 if (ABIName) {
1601 CmdArgs.push_back("-target-abi");
1602 CmdArgs.push_back(ABIName);
1603 }
1604}
1605
1606bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1607 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1608 return A && (A->getValue() == StringRef(Value));
1609}
1610
Tom Stellard6674c702013-04-01 20:56:53 +00001611/// Get the (LLVM) name of the R600 gpu we are targeting.
1612static std::string getR600TargetGPU(const ArgList &Args) {
1613 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001614 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001615 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001616 .Cases("rv630", "rv635", "r600")
1617 .Cases("rv610", "rv620", "rs780", "rs880")
1618 .Case("rv740", "rv770")
1619 .Case("palm", "cedar")
1620 .Cases("sumo", "sumo2", "sumo")
1621 .Case("hemlock", "cypress")
1622 .Case("aruba", "cayman")
1623 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001624 }
1625 return "";
1626}
1627
Jacques Pienaard964cc22016-03-28 21:02:54 +00001628static std::string getLanaiTargetCPU(const ArgList &Args) {
1629 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1630 return A->getValue();
1631 }
1632 return "";
1633}
1634
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001635void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001636 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001637 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001638 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001639
James Y Knightb2406522015-06-15 20:51:24 +00001640 bool SoftFloatABI = false;
1641 if (Arg *A =
1642 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001643 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001644 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001645 }
1646
James Y Knightb2406522015-06-15 20:51:24 +00001647 // Only the hard-float ABI on Sparc is standardized, and it is the
1648 // default. GCC also supports a nonstandard soft-float ABI mode, and
1649 // perhaps LLVM should implement that, too. However, since llvm
1650 // currently does not support Sparc soft-float, at all, display an
1651 // error if it's requested.
1652 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1654 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001655 }
1656}
1657
Richard Sandiford4652d892013-07-19 16:51:51 +00001658static const char *getSystemZTargetCPU(const ArgList &Args) {
1659 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1660 return A->getValue();
1661 return "z10";
1662}
1663
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001664static void getSystemZTargetFeatures(const ArgList &Args,
1665 std::vector<const char *> &Features) {
1666 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001667 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001668 if (A->getOption().matches(options::OPT_mhtm))
1669 Features.push_back("+transactional-execution");
1670 else
1671 Features.push_back("-transactional-execution");
1672 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001673 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001674 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001675 if (A->getOption().matches(options::OPT_mvx))
1676 Features.push_back("+vector");
1677 else
1678 Features.push_back("-vector");
1679 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001680}
1681
Chandler Carruth953fb082013-01-13 11:46:33 +00001682static const char *getX86TargetCPU(const ArgList &Args,
1683 const llvm::Triple &Triple) {
1684 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001685 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001686 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001687 return "core-avx2";
1688
Chandler Carruth953fb082013-01-13 11:46:33 +00001689 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001690 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001691
1692 // FIXME: Reject attempts to use -march=native unless the target matches
1693 // the host.
1694 //
1695 // FIXME: We should also incorporate the detected target features for use
1696 // with -native.
1697 std::string CPU = llvm::sys::getHostCPUName();
1698 if (!CPU.empty() && CPU != "generic")
1699 return Args.MakeArgString(CPU);
1700 }
1701
Reid Kleckner3123eff2015-06-30 16:32:04 +00001702 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1703 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1704 StringRef Arch = A->getValue();
1705 const char *CPU;
1706 if (Triple.getArch() == llvm::Triple::x86) {
1707 CPU = llvm::StringSwitch<const char *>(Arch)
1708 .Case("IA32", "i386")
1709 .Case("SSE", "pentium3")
1710 .Case("SSE2", "pentium4")
1711 .Case("AVX", "sandybridge")
1712 .Case("AVX2", "haswell")
1713 .Default(nullptr);
1714 } else {
1715 CPU = llvm::StringSwitch<const char *>(Arch)
1716 .Case("AVX", "sandybridge")
1717 .Case("AVX2", "haswell")
1718 .Default(nullptr);
1719 }
1720 if (CPU)
1721 return CPU;
1722 }
1723
Chandler Carruth953fb082013-01-13 11:46:33 +00001724 // Select the default CPU if none was given (or detection failed).
1725
1726 if (Triple.getArch() != llvm::Triple::x86_64 &&
1727 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001728 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001729
1730 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1731
1732 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001733 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001734 if (Triple.getArchName() == "x86_64h")
1735 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001736 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001737 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001738
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001739 // Set up default CPU name for PS4 compilers.
1740 if (Triple.isPS4CPU())
1741 return "btver2";
1742
Alexey Bataev286d1b92014-01-31 04:07:13 +00001743 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001744 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001745 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001746
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001747 // Everything else goes to x86-64 in 64-bit mode.
1748 if (Is64Bit)
1749 return "x86-64";
1750
1751 switch (Triple.getOS()) {
1752 case llvm::Triple::FreeBSD:
1753 case llvm::Triple::NetBSD:
1754 case llvm::Triple::OpenBSD:
1755 return "i486";
1756 case llvm::Triple::Haiku:
1757 return "i586";
1758 case llvm::Triple::Bitrig:
1759 return "i686";
1760 default:
1761 // Fallback to p4.
1762 return "pentium4";
1763 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001764}
1765
Dan Gohmanc2853072015-09-03 22:51:53 +00001766/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1767static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1768 // If we have -mcpu=, use that.
1769 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1770 StringRef CPU = A->getValue();
1771
1772#ifdef __wasm__
1773 // Handle "native" by examining the host. "native" isn't meaningful when
1774 // cross compiling, so only support this when the host is also WebAssembly.
1775 if (CPU == "native")
1776 return llvm::sys::getHostCPUName();
1777#endif
1778
1779 return CPU;
1780 }
1781
1782 return "generic";
1783}
1784
Renato Golin7c542b42015-07-27 23:44:45 +00001785static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1786 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001787 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001788 default:
1789 return "";
1790
Amara Emerson703da2e2013-10-31 09:32:33 +00001791 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001792 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001793 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001794
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001795 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001796 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001797 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001798 case llvm::Triple::thumbeb: {
1799 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001800 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001801 return arm::getARMTargetCPU(MCPU, MArch, T);
1802 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001803 case llvm::Triple::mips:
1804 case llvm::Triple::mipsel:
1805 case llvm::Triple::mips64:
1806 case llvm::Triple::mips64el: {
1807 StringRef CPUName;
1808 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001809 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001810 return CPUName;
1811 }
1812
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001813 case llvm::Triple::nvptx:
1814 case llvm::Triple::nvptx64:
1815 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1816 return A->getValue();
1817 return "";
1818
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001819 case llvm::Triple::ppc:
1820 case llvm::Triple::ppc64:
1821 case llvm::Triple::ppc64le: {
1822 std::string TargetCPUName = getPPCTargetCPU(Args);
1823 // LLVM may default to generating code for the native CPU,
1824 // but, like gcc, we default to a more generic option for
1825 // each architecture. (except on Darwin)
1826 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1827 if (T.getArch() == llvm::Triple::ppc64)
1828 TargetCPUName = "ppc64";
1829 else if (T.getArch() == llvm::Triple::ppc64le)
1830 TargetCPUName = "ppc64le";
1831 else
1832 TargetCPUName = "ppc";
1833 }
1834 return TargetCPUName;
1835 }
1836
1837 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001838 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001839 case llvm::Triple::sparcv9:
1840 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001841 return A->getValue();
1842 return "";
1843
1844 case llvm::Triple::x86:
1845 case llvm::Triple::x86_64:
1846 return getX86TargetCPU(Args, T);
1847
1848 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001849 return "hexagon" +
1850 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001851
Jacques Pienaard964cc22016-03-28 21:02:54 +00001852 case llvm::Triple::lanai:
1853 return getLanaiTargetCPU(Args);
1854
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001855 case llvm::Triple::systemz:
1856 return getSystemZTargetCPU(Args);
1857
1858 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001859 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001860 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001861
1862 case llvm::Triple::wasm32:
1863 case llvm::Triple::wasm64:
1864 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001865 }
1866}
1867
Alp Tokerce365ca2013-12-02 12:43:03 +00001868static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001869 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001870 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1871 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1872 // forward.
1873 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 std::string Plugin =
1875 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001876 CmdArgs.push_back(Args.MakeArgString(Plugin));
1877
1878 // Try to pass driver level flags relevant to LTO code generation down to
1879 // the plugin.
1880
1881 // Handle flags for selecting CPU variants.
1882 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1883 if (!CPU.empty())
1884 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001885
James Molloyf97fdae2015-12-21 10:44:36 +00001886 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1887 StringRef OOpt;
1888 if (A->getOption().matches(options::OPT_O4) ||
1889 A->getOption().matches(options::OPT_Ofast))
1890 OOpt = "3";
1891 else if (A->getOption().matches(options::OPT_O))
1892 OOpt = A->getValue();
1893 else if (A->getOption().matches(options::OPT_O0))
1894 OOpt = "0";
1895 if (!OOpt.empty())
1896 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1897 }
1898
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001899 if (IsThinLTO)
1900 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001901
1902 // If an explicit debugger tuning argument appeared, pass it along.
1903 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1904 options::OPT_ggdbN_Group)) {
1905 if (A->getOption().matches(options::OPT_glldb))
1906 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1907 else if (A->getOption().matches(options::OPT_gsce))
1908 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1909 else
1910 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1911 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001912}
1913
Sanjay Patel2987c292015-06-11 14:53:41 +00001914/// This is a helper function for validating the optional refinement step
1915/// parameter in reciprocal argument strings. Return false if there is an error
1916/// parsing the refinement step. Otherwise, return true and set the Position
1917/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001918static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001920 const char RefinementStepToken = ':';
1921 Position = In.find(RefinementStepToken);
1922 if (Position != StringRef::npos) {
1923 StringRef Option = A.getOption().getName();
1924 StringRef RefStep = In.substr(Position + 1);
1925 // Allow exactly one numeric character for the additional refinement
1926 // step parameter. This is reasonable for all currently-supported
1927 // operations and architectures because we would expect that a larger value
1928 // of refinement steps would cause the estimate "optimization" to
1929 // under-perform the native operation. Also, if the estimate does not
1930 // converge quickly, it probably will not ever converge, so further
1931 // refinement steps will not produce a better answer.
1932 if (RefStep.size() != 1) {
1933 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1934 return false;
1935 }
1936 char RefStepChar = RefStep[0];
1937 if (RefStepChar < '0' || RefStepChar > '9') {
1938 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1939 return false;
1940 }
1941 }
1942 return true;
1943}
1944
1945/// The -mrecip flag requires processing of many optional parameters.
1946static void ParseMRecip(const Driver &D, const ArgList &Args,
1947 ArgStringList &OutStrings) {
1948 StringRef DisabledPrefixIn = "!";
1949 StringRef DisabledPrefixOut = "!";
1950 StringRef EnabledPrefixOut = "";
1951 StringRef Out = "-mrecip=";
1952
1953 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1954 if (!A)
1955 return;
1956
1957 unsigned NumOptions = A->getNumValues();
1958 if (NumOptions == 0) {
1959 // No option is the same as "all".
1960 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1961 return;
1962 }
1963
1964 // Pass through "all", "none", or "default" with an optional refinement step.
1965 if (NumOptions == 1) {
1966 StringRef Val = A->getValue(0);
1967 size_t RefStepLoc;
1968 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1969 return;
1970 StringRef ValBase = Val.slice(0, RefStepLoc);
1971 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1972 OutStrings.push_back(Args.MakeArgString(Out + Val));
1973 return;
1974 }
1975 }
1976
1977 // Each reciprocal type may be enabled or disabled individually.
1978 // Check each input value for validity, concatenate them all back together,
1979 // and pass through.
1980
1981 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001982 OptionStrings.insert(std::make_pair("divd", false));
1983 OptionStrings.insert(std::make_pair("divf", false));
1984 OptionStrings.insert(std::make_pair("vec-divd", false));
1985 OptionStrings.insert(std::make_pair("vec-divf", false));
1986 OptionStrings.insert(std::make_pair("sqrtd", false));
1987 OptionStrings.insert(std::make_pair("sqrtf", false));
1988 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1989 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001990
1991 for (unsigned i = 0; i != NumOptions; ++i) {
1992 StringRef Val = A->getValue(i);
1993
1994 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1995 // Ignore the disablement token for string matching.
1996 if (IsDisabled)
1997 Val = Val.substr(1);
1998
1999 size_t RefStep;
2000 if (!getRefinementStep(Val, D, *A, RefStep))
2001 return;
2002
2003 StringRef ValBase = Val.slice(0, RefStep);
2004 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
2005 if (OptionIter == OptionStrings.end()) {
2006 // Try again specifying float suffix.
2007 OptionIter = OptionStrings.find(ValBase.str() + 'f');
2008 if (OptionIter == OptionStrings.end()) {
2009 // The input name did not match any known option string.
2010 D.Diag(diag::err_drv_unknown_argument) << Val;
2011 return;
2012 }
2013 // The option was specified without a float or double suffix.
2014 // Make sure that the double entry was not already specified.
2015 // The float entry will be checked below.
2016 if (OptionStrings[ValBase.str() + 'd']) {
2017 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2018 return;
2019 }
2020 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002021
Sanjay Patel2987c292015-06-11 14:53:41 +00002022 if (OptionIter->second == true) {
2023 // Duplicate option specified.
2024 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
2025 return;
2026 }
2027
2028 // Mark the matched option as found. Do not allow duplicate specifiers.
2029 OptionIter->second = true;
2030
2031 // If the precision was not specified, also mark the double entry as found.
2032 if (ValBase.back() != 'f' && ValBase.back() != 'd')
2033 OptionStrings[ValBase.str() + 'd'] = true;
2034
2035 // Build the output string.
2036 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
2037 Out = Args.MakeArgString(Out + Prefix + Val);
2038 if (i != NumOptions - 1)
2039 Out = Args.MakeArgString(Out + ",");
2040 }
2041
2042 OutStrings.push_back(Args.MakeArgString(Out));
2043}
2044
Eric Christopherc54920a2015-03-23 19:26:05 +00002045static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00002046 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002047 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00002048 // If -march=native, autodetect the feature list.
2049 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
2050 if (StringRef(A->getValue()) == "native") {
2051 llvm::StringMap<bool> HostFeatures;
2052 if (llvm::sys::getHostCPUFeatures(HostFeatures))
2053 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054 Features.push_back(
2055 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00002056 }
2057 }
2058
Jim Grosbach82eee262013-11-16 00:53:35 +00002059 if (Triple.getArchName() == "x86_64h") {
2060 // x86_64h implies quite a few of the more modern subtarget features
2061 // for Haswell class CPUs, but not all of them. Opt-out of a few.
2062 Features.push_back("-rdrnd");
2063 Features.push_back("-aes");
2064 Features.push_back("-pclmul");
2065 Features.push_back("-rtm");
2066 Features.push_back("-hle");
2067 Features.push_back("-fsgsbase");
2068 }
2069
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002070 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00002071 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002072 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002073 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00002074 Features.push_back("+sse4.2");
2075 Features.push_back("+popcnt");
2076 } else
2077 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00002078 }
2079
Eric Christopherc54920a2015-03-23 19:26:05 +00002080 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002081 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
2082 StringRef Arch = A->getValue();
2083 bool ArchUsed = false;
2084 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002085 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002086 if (Arch == "AVX" || Arch == "AVX2") {
2087 ArchUsed = true;
2088 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2089 }
2090 }
2091 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002092 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002093 if (Arch == "IA32") {
2094 ArchUsed = true;
2095 } else if (Arch == "SSE" || Arch == "SSE2") {
2096 ArchUsed = true;
2097 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2098 }
2099 }
2100 if (!ArchUsed)
2101 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2102 }
2103
Jim Grosbach82eee262013-11-16 00:53:35 +00002104 // Now add any that the user explicitly requested on the command line,
2105 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002106 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002107}
2108
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002109void Clang::AddX86TargetArgs(const ArgList &Args,
2110 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002112 Args.hasArg(options::OPT_mkernel) ||
2113 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002114 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002115
Bob Wilson2616e2e2013-02-10 16:01:41 +00002116 // Default to avoid implicit floating-point for kernel/kext code, but allow
2117 // that to be overridden with -mno-soft-float.
2118 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2119 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002120 if (Arg *A = Args.getLastArg(
2121 options::OPT_msoft_float, options::OPT_mno_soft_float,
2122 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002123 const Option &O = A->getOption();
2124 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2125 O.matches(options::OPT_msoft_float));
2126 }
2127 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002128 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002129
2130 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2131 StringRef Value = A->getValue();
2132 if (Value == "intel" || Value == "att") {
2133 CmdArgs.push_back("-mllvm");
2134 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2135 } else {
2136 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2137 << A->getOption().getName() << Value;
2138 }
2139 }
Andrey Turetskiy6a8b91d2016-04-21 10:16:48 +00002140
2141 // Set flags to support MCU ABI.
2142 if (Args.hasArg(options::OPT_miamcu)) {
2143 CmdArgs.push_back("-mfloat-abi");
2144 CmdArgs.push_back("soft");
2145 CmdArgs.push_back("-mstack-alignment=4");
2146 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002147}
2148
Tony Linthicum76329bf2011-12-12 21:14:55 +00002149void Clang::AddHexagonTargetArgs(const ArgList &Args,
2150 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002151 CmdArgs.push_back("-mqdsp6-compat");
2152 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002153
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002154 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2155 std::string N = llvm::utostr(G.getValue());
2156 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002158 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002159 }
2160
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002161 if (!Args.hasArg(options::OPT_fno_short_enums))
2162 CmdArgs.push_back("-fshort-enums");
2163 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002164 CmdArgs.push_back("-mllvm");
2165 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002166 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002167 CmdArgs.push_back("-mllvm");
2168 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002169}
2170
Jacques Pienaard964cc22016-03-28 21:02:54 +00002171void Clang::AddLanaiTargetArgs(const ArgList &Args,
2172 ArgStringList &CmdArgs) const {
2173 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
2174 StringRef CPUName = A->getValue();
2175
2176 CmdArgs.push_back("-target-cpu");
2177 CmdArgs.push_back(Args.MakeArgString(CPUName));
2178 }
2179 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2180 StringRef Value = A->getValue();
2181 // Only support mregparm=4 to support old usage. Report error for all other
2182 // cases.
2183 int Mregparm;
2184 if (Value.getAsInteger(10, Mregparm)) {
2185 if (Mregparm != 4) {
2186 getToolChain().getDriver().Diag(
2187 diag::err_drv_unsupported_option_argument)
2188 << A->getOption().getName() << Value;
2189 }
2190 }
2191 }
2192}
2193
Dan Gohmane3d71e12016-01-07 01:00:21 +00002194void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2195 ArgStringList &CmdArgs) const {
2196 // Default to "hidden" visibility.
2197 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2198 options::OPT_fvisibility_ms_compat)) {
2199 CmdArgs.push_back("-fvisibility");
2200 CmdArgs.push_back("hidden");
2201 }
2202}
2203
Kevin Qin110db6f2014-07-18 07:03:22 +00002204// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002205static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 std::vector<const char *> &Features) {
2207 SmallVector<StringRef, 8> Split;
2208 text.split(Split, StringRef("+"), -1, false);
2209
Benjamin Kramer72e64312015-09-24 14:48:49 +00002210 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002211 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002212 .Case("fp", "+fp-armv8")
2213 .Case("simd", "+neon")
2214 .Case("crc", "+crc")
2215 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002216 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002217 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002218 .Case("nofp", "-fp-armv8")
2219 .Case("nosimd", "-neon")
2220 .Case("nocrc", "-crc")
2221 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002222 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002223 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002224 .Default(nullptr);
2225 if (result)
2226 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002227 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002228 D.Diag(diag::err_drv_no_neon_modifier);
2229 else
2230 return false;
2231 }
2232 return true;
2233}
2234
2235// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2236// decode CPU and feature.
2237static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2238 std::vector<const char *> &Features) {
2239 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2240 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002241 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002242 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2243 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002244 Features.push_back("+neon");
2245 Features.push_back("+crc");
2246 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002247 } else if (CPU == "cyclone") {
2248 Features.push_back("+neon");
2249 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002250 } else if (CPU == "generic") {
2251 Features.push_back("+neon");
2252 } else {
2253 return false;
2254 }
2255
2256 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2257 return false;
2258
2259 return true;
2260}
2261
2262static bool
2263getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2264 const ArgList &Args,
2265 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002266 std::string MarchLowerCase = March.lower();
2267 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002269 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002270 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002271 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002272 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002273 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2274 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002275 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002276 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002277 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002278
2279 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2280 return false;
2281
2282 return true;
2283}
2284
2285static bool
2286getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2287 const ArgList &Args,
2288 std::vector<const char *> &Features) {
2289 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002290 std::string McpuLowerCase = Mcpu.lower();
2291 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002292 return false;
2293
2294 return true;
2295}
2296
2297static bool
2298getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2299 const ArgList &Args,
2300 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002301 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002302 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002303 if (MtuneLowerCase == "native")
2304 MtuneLowerCase = llvm::sys::getHostCPUName();
2305 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002306 Features.push_back("+zcm");
2307 Features.push_back("+zcz");
2308 }
2309 return true;
2310}
2311
2312static bool
2313getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2314 const ArgList &Args,
2315 std::vector<const char *> &Features) {
2316 StringRef CPU;
2317 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002318 std::string McpuLowerCase = Mcpu.lower();
2319 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002320 return false;
2321
2322 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2323}
2324
Justin Bognerf9052562015-11-13 23:07:31 +00002325static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002326 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002327 Arg *A;
2328 bool success = true;
2329 // Enable NEON by default.
2330 Features.push_back("+neon");
2331 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2332 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2333 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2334 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002335 else if (Args.hasArg(options::OPT_arch))
2336 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2337 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002338
2339 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2340 success =
2341 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2342 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2343 success =
2344 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002345 else if (Args.hasArg(options::OPT_arch))
2346 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2347 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002348
2349 if (!success)
2350 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002351
2352 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2353 Features.push_back("-fp-armv8");
2354 Features.push_back("-crypto");
2355 Features.push_back("-neon");
2356 }
Bradley Smith418c5932014-05-02 15:17:51 +00002357
2358 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002359 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002360 if (A->getOption().matches(options::OPT_mcrc))
2361 Features.push_back("+crc");
2362 else
2363 Features.push_back("-crc");
2364 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002365
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002366 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2367 options::OPT_munaligned_access))
2368 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2369 Features.push_back("+strict-align");
2370
Justin Bognerf9052562015-11-13 23:07:31 +00002371 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002372 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002373}
2374
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002375static void getHexagonTargetFeatures(const ArgList &Args,
2376 std::vector<const char *> &Features) {
2377 bool HasHVX = false, HasHVXD = false;
2378
Eric Christopher49062a52015-12-22 03:12:34 +00002379 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2380 // doing dependent option handling here rather than in initFeatureMap or a
2381 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002382 for (auto &A : Args) {
2383 auto &Opt = A->getOption();
2384 if (Opt.matches(options::OPT_mhexagon_hvx))
2385 HasHVX = true;
2386 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2387 HasHVXD = HasHVX = false;
2388 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2389 HasHVXD = HasHVX = true;
2390 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2391 HasHVXD = false;
2392 else
2393 continue;
2394 A->claim();
2395 }
2396
2397 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2398 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2399}
2400
Dan Gohmanc2853072015-09-03 22:51:53 +00002401static void getWebAssemblyTargetFeatures(const ArgList &Args,
2402 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002403 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002404}
2405
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002406static void getAMDGPUTargetFeatures(const Driver &D, const ArgList &Args,
2407 std::vector<const char *> &Features) {
2408 if (const Arg *dAbi = Args.getLastArg(options::OPT_mamdgpu_debugger_abi)) {
2409 StringRef value = dAbi->getValue();
2410 if (value == "1.0") {
2411 Features.push_back("+amdgpu-debugger-insert-nops");
2412 Features.push_back("+amdgpu-debugger-reserve-trap-regs");
2413 } else {
2414 D.Diag(diag::err_drv_clang_unsupported) << dAbi->getAsString(Args);
2415 }
2416 }
2417
2418 handleTargetFeaturesGroup(
2419 Args, Features, options::OPT_m_amdgpu_Features_Group);
2420}
2421
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002422static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002423 const ArgList &Args, ArgStringList &CmdArgs,
2424 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002425 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002426 std::vector<const char *> Features;
2427 switch (Triple.getArch()) {
2428 default:
2429 break;
2430 case llvm::Triple::mips:
2431 case llvm::Triple::mipsel:
2432 case llvm::Triple::mips64:
2433 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002434 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002435 break;
2436
2437 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002438 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002439 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002440 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002441 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002442 break;
2443
2444 case llvm::Triple::ppc:
2445 case llvm::Triple::ppc64:
2446 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002447 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002448 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002449 case llvm::Triple::systemz:
2450 getSystemZTargetFeatures(Args, Features);
2451 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002452 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002453 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002454 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002455 break;
2456 case llvm::Triple::x86:
2457 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002458 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002459 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002460 case llvm::Triple::hexagon:
2461 getHexagonTargetFeatures(Args, Features);
2462 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002463 case llvm::Triple::wasm32:
2464 case llvm::Triple::wasm64:
2465 getWebAssemblyTargetFeatures(Args, Features);
2466 break;
Konstantin Zhuravlyov5124bf82016-04-12 21:42:15 +00002467 case llvm::Triple::r600:
2468 case llvm::Triple::amdgcn:
2469 getAMDGPUTargetFeatures(D, Args, Features);
2470 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002471 }
Rafael Espindola43964802013-08-21 17:34:32 +00002472
2473 // Find the last of each feature.
2474 llvm::StringMap<unsigned> LastOpt;
2475 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2476 const char *Name = Features[I];
2477 assert(Name[0] == '-' || Name[0] == '+');
2478 LastOpt[Name + 1] = I;
2479 }
2480
2481 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2482 // If this feature was overridden, ignore it.
2483 const char *Name = Features[I];
2484 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2485 assert(LastI != LastOpt.end());
2486 unsigned Last = LastI->second;
2487 if (Last != I)
2488 continue;
2489
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002490 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002491 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002492 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002493}
2494
David Majnemerae394812014-12-09 00:12:30 +00002495static bool
2496shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2497 const llvm::Triple &Triple) {
2498 // We use the zero-cost exception tables for Objective-C if the non-fragile
2499 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2500 // later.
2501 if (runtime.isNonFragile())
2502 return true;
2503
2504 if (!Triple.isMacOSX())
2505 return false;
2506
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002507 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002508 (Triple.getArch() == llvm::Triple::x86_64 ||
2509 Triple.getArch() == llvm::Triple::arm));
2510}
2511
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002512/// Adds exception related arguments to the driver command arguments. There's a
2513/// master flag, -fexceptions and also language specific flags to enable/disable
2514/// C++ and Objective-C exceptions. This makes it possible to for example
2515/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002516static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002517 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002518 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002519 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002520 const Driver &D = TC.getDriver();
2521 const llvm::Triple &Triple = TC.getTriple();
2522
Chad Rosier4fab82c2012-03-26 22:04:46 +00002523 if (KernelOrKext) {
2524 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2525 // arguments now to avoid warnings about unused arguments.
2526 Args.ClaimAllArgs(options::OPT_fexceptions);
2527 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2528 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2529 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2530 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2531 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002532 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002533 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002534
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002535 // See if the user explicitly enabled exceptions.
2536 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2537 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002538
David Majnemerae394812014-12-09 00:12:30 +00002539 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2540 // is not necessarily sensible, but follows GCC.
2541 if (types::isObjC(InputType) &&
2542 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002543 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002544 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002545
David Majnemerae394812014-12-09 00:12:30 +00002546 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002547 }
2548
2549 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002550 // Disable C++ EH by default on XCore and PS4.
2551 bool CXXExceptionsEnabled =
2552 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002553 Arg *ExceptionArg = Args.getLastArg(
2554 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2555 options::OPT_fexceptions, options::OPT_fno_exceptions);
2556 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002557 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002558 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2559 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002560
2561 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002562 if (Triple.isPS4CPU()) {
2563 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2564 assert(ExceptionArg &&
2565 "On the PS4 exceptions should only be enabled if passing "
2566 "an argument");
2567 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2568 const Arg *RTTIArg = TC.getRTTIArg();
2569 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2570 D.Diag(diag::err_drv_argument_not_allowed_with)
2571 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2572 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2573 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2574 } else
2575 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2576
Anders Carlssone96ab552011-02-28 02:27:16 +00002577 CmdArgs.push_back("-fcxx-exceptions");
2578
David Majnemer8de68642014-12-05 08:11:58 +00002579 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002580 }
2581 }
2582
David Majnemer8de68642014-12-05 08:11:58 +00002583 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002584 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002585}
2586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002587static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002588 bool Default = true;
2589 if (TC.getTriple().isOSDarwin()) {
2590 // The native darwin assembler doesn't support the linker_option directives,
2591 // so we disable them if we think the .s file will be passed to it.
2592 Default = TC.useIntegratedAs();
2593 }
2594 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2595 Default);
2596}
2597
Ted Kremenek62093662013-03-12 17:02:12 +00002598static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2599 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002600 bool UseDwarfDirectory =
2601 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2602 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002603 return !UseDwarfDirectory;
2604}
2605
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002606/// \brief Check whether the given input tree contains any compilation actions.
2607static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002608 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002609 return true;
2610
Nico Weber5a459f82016-02-23 19:30:43 +00002611 for (const auto &AI : A->inputs())
2612 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002613 return true;
2614
2615 return false;
2616}
2617
2618/// \brief Check if -relax-all should be passed to the internal assembler.
2619/// This is done by default when compiling non-assembler source with -O0.
2620static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2621 bool RelaxDefault = true;
2622
2623 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2624 RelaxDefault = A->getOption().matches(options::OPT_O0);
2625
2626 if (RelaxDefault) {
2627 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002628 for (const auto &Act : C.getActions()) {
2629 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002630 RelaxDefault = true;
2631 break;
2632 }
2633 }
2634 }
2635
2636 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002638}
2639
Paul Robinson0334a042015-12-19 19:41:48 +00002640// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2641// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002642static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002643 assert(A.getOption().matches(options::OPT_gN_Group) &&
2644 "Not a -g option that specifies a debug-info level");
2645 if (A.getOption().matches(options::OPT_g0) ||
2646 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002647 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002648 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2649 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002650 return codegenoptions::DebugLineTablesOnly;
2651 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002652}
2653
Douglas Katzman3459ce22015-10-08 04:24:12 +00002654// Extract the integer N from a string spelled "-dwarf-N", returning 0
2655// on mismatch. The StringRef input (rather than an Arg) allows
2656// for use by the "-Xassembler" option parser.
2657static unsigned DwarfVersionNum(StringRef ArgValue) {
2658 return llvm::StringSwitch<unsigned>(ArgValue)
2659 .Case("-gdwarf-2", 2)
2660 .Case("-gdwarf-3", 3)
2661 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002662 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002663 .Default(0);
2664}
2665
2666static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002667 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002668 unsigned DwarfVersion,
2669 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002670 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002671 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002672 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2673 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002674 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002675 CmdArgs.push_back("-debug-info-kind=limited");
2676 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002677 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002678 CmdArgs.push_back("-debug-info-kind=standalone");
2679 break;
2680 default:
2681 break;
2682 }
2683 if (DwarfVersion > 0)
2684 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002685 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002686 switch (DebuggerTuning) {
2687 case llvm::DebuggerKind::GDB:
2688 CmdArgs.push_back("-debugger-tuning=gdb");
2689 break;
2690 case llvm::DebuggerKind::LLDB:
2691 CmdArgs.push_back("-debugger-tuning=lldb");
2692 break;
2693 case llvm::DebuggerKind::SCE:
2694 CmdArgs.push_back("-debugger-tuning=sce");
2695 break;
2696 default:
2697 break;
2698 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002699}
2700
David Blaikie9260ed62013-07-25 21:19:01 +00002701static void CollectArgsForIntegratedAssembler(Compilation &C,
2702 const ArgList &Args,
2703 ArgStringList &CmdArgs,
2704 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002705 if (UseRelaxAll(C, Args))
2706 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002707
David Majnemer2b9349d2015-12-21 22:09:34 +00002708 // Only default to -mincremental-linker-compatible if we think we are
2709 // targeting the MSVC linker.
2710 bool DefaultIncrementalLinkerCompatible =
2711 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2712 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2713 options::OPT_mno_incremental_linker_compatible,
2714 DefaultIncrementalLinkerCompatible))
2715 CmdArgs.push_back("-mincremental-linker-compatible");
2716
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002717 // When passing -I arguments to the assembler we sometimes need to
2718 // unconditionally take the next argument. For example, when parsing
2719 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2720 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2721 // arg after parsing the '-I' arg.
2722 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002723
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002724 // When using an integrated assembler, translate -Wa, and -Xassembler
2725 // options.
2726 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002727 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002728 for (const Arg *A :
2729 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2730 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002731
Benjamin Kramer72e64312015-09-24 14:48:49 +00002732 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002733 if (TakeNextArg) {
2734 CmdArgs.push_back(Value.data());
2735 TakeNextArg = false;
2736 continue;
2737 }
David Blaikie9260ed62013-07-25 21:19:01 +00002738
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002739 switch (C.getDefaultToolChain().getArch()) {
2740 default:
2741 break;
2742 case llvm::Triple::mips:
2743 case llvm::Triple::mipsel:
2744 case llvm::Triple::mips64:
2745 case llvm::Triple::mips64el:
2746 if (Value == "--trap") {
2747 CmdArgs.push_back("-target-feature");
2748 CmdArgs.push_back("+use-tcc-in-div");
2749 continue;
2750 }
2751 if (Value == "--break") {
2752 CmdArgs.push_back("-target-feature");
2753 CmdArgs.push_back("-use-tcc-in-div");
2754 continue;
2755 }
2756 if (Value.startswith("-msoft-float")) {
2757 CmdArgs.push_back("-target-feature");
2758 CmdArgs.push_back("+soft-float");
2759 continue;
2760 }
2761 if (Value.startswith("-mhard-float")) {
2762 CmdArgs.push_back("-target-feature");
2763 CmdArgs.push_back("-soft-float");
2764 continue;
2765 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002766
2767 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2768 .Case("-mips1", "+mips1")
2769 .Case("-mips2", "+mips2")
2770 .Case("-mips3", "+mips3")
2771 .Case("-mips4", "+mips4")
2772 .Case("-mips5", "+mips5")
2773 .Case("-mips32", "+mips32")
2774 .Case("-mips32r2", "+mips32r2")
2775 .Case("-mips32r3", "+mips32r3")
2776 .Case("-mips32r5", "+mips32r5")
2777 .Case("-mips32r6", "+mips32r6")
2778 .Case("-mips64", "+mips64")
2779 .Case("-mips64r2", "+mips64r2")
2780 .Case("-mips64r3", "+mips64r3")
2781 .Case("-mips64r5", "+mips64r5")
2782 .Case("-mips64r6", "+mips64r6")
2783 .Default(nullptr);
2784 if (MipsTargetFeature)
2785 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002786 }
2787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002788 if (Value == "-force_cpusubtype_ALL") {
2789 // Do nothing, this is the default and we don't support anything else.
2790 } else if (Value == "-L") {
2791 CmdArgs.push_back("-msave-temp-labels");
2792 } else if (Value == "--fatal-warnings") {
2793 CmdArgs.push_back("-massembler-fatal-warnings");
2794 } else if (Value == "--noexecstack") {
2795 CmdArgs.push_back("-mnoexecstack");
2796 } else if (Value == "-compress-debug-sections" ||
2797 Value == "--compress-debug-sections") {
2798 CompressDebugSections = true;
2799 } else if (Value == "-nocompress-debug-sections" ||
2800 Value == "--nocompress-debug-sections") {
2801 CompressDebugSections = false;
2802 } else if (Value.startswith("-I")) {
2803 CmdArgs.push_back(Value.data());
2804 // We need to consume the next argument if the current arg is a plain
2805 // -I. The next arg will be the include directory.
2806 if (Value == "-I")
2807 TakeNextArg = true;
2808 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002809 // "-gdwarf-N" options are not cc1as options.
2810 unsigned DwarfVersion = DwarfVersionNum(Value);
2811 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2812 CmdArgs.push_back(Value.data());
2813 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002814 RenderDebugEnablingArgs(Args, CmdArgs,
2815 codegenoptions::LimitedDebugInfo,
2816 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002817 }
Renato Golin7c542b42015-07-27 23:44:45 +00002818 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2819 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2820 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002821 } else {
2822 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002823 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002824 }
2825 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002826 }
2827 if (CompressDebugSections) {
2828 if (llvm::zlib::isAvailable())
2829 CmdArgs.push_back("-compress-debug-sections");
2830 else
2831 D.Diag(diag::warn_debug_compression_unavailable);
2832 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002833 if (MipsTargetFeature != nullptr) {
2834 CmdArgs.push_back("-target-feature");
2835 CmdArgs.push_back(MipsTargetFeature);
2836 }
David Blaikie9260ed62013-07-25 21:19:01 +00002837}
2838
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002839// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002840// FIXME: Make sure we can also emit shared objects if they're requested
2841// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002842static void addClangRT(const ToolChain &TC, const ArgList &Args,
2843 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002844 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002845}
2846
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002847namespace {
2848enum OpenMPRuntimeKind {
2849 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2850 /// without knowing what runtime to target.
2851 OMPRT_Unknown,
2852
2853 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2854 /// the default for Clang.
2855 OMPRT_OMP,
2856
2857 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2858 /// this runtime but can swallow the pragmas, and find and link against the
2859 /// runtime library itself.
2860 OMPRT_GOMP,
2861
Chandler Carruthc6625c62015-05-28 21:10:31 +00002862 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002863 /// OpenMP runtime. We support this mode for users with existing dependencies
2864 /// on this runtime library name.
2865 OMPRT_IOMP5
2866};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002867}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002868
2869/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002870static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2871 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002872 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2873
2874 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2875 if (A)
2876 RuntimeName = A->getValue();
2877
2878 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002879 .Case("libomp", OMPRT_OMP)
2880 .Case("libgomp", OMPRT_GOMP)
2881 .Case("libiomp5", OMPRT_IOMP5)
2882 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002883
2884 if (RT == OMPRT_Unknown) {
2885 if (A)
2886 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002887 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002888 else
2889 // FIXME: We could use a nicer diagnostic here.
2890 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2891 }
2892
2893 return RT;
2894}
2895
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002896static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2897 const ArgList &Args) {
2898 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2899 options::OPT_fno_openmp, false))
2900 return;
2901
2902 switch (getOpenMPRuntime(TC, Args)) {
2903 case OMPRT_OMP:
2904 CmdArgs.push_back("-lomp");
2905 break;
2906 case OMPRT_GOMP:
2907 CmdArgs.push_back("-lgomp");
2908 break;
2909 case OMPRT_IOMP5:
2910 CmdArgs.push_back("-liomp5");
2911 break;
2912 case OMPRT_Unknown:
2913 // Already diagnosed.
2914 break;
2915 }
2916}
2917
Alexey Samsonov52550342014-09-15 19:58:40 +00002918static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2919 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002920 bool IsShared, bool IsWhole) {
2921 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002922 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002923 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002924 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002925 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002926}
2927
Alexey Samsonov52550342014-09-15 19:58:40 +00002928// Tries to use a file with the list of dynamic symbols that need to be exported
2929// from the runtime library. Returns true if the file was found.
2930static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2931 ArgStringList &CmdArgs,
2932 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002933 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002934 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2935 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002936 return true;
2937 }
2938 return false;
2939}
2940
2941static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2942 ArgStringList &CmdArgs) {
2943 // Force linking against the system libraries sanitizers depends on
2944 // (see PR15823 why this is necessary).
2945 CmdArgs.push_back("--no-as-needed");
2946 CmdArgs.push_back("-lpthread");
2947 CmdArgs.push_back("-lrt");
2948 CmdArgs.push_back("-lm");
2949 // There's no libdl on FreeBSD.
2950 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2951 CmdArgs.push_back("-ldl");
2952}
2953
2954static void
2955collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2956 SmallVectorImpl<StringRef> &SharedRuntimes,
2957 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002958 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2959 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2960 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002961 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2962 // Collect shared runtimes.
2963 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2964 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002965 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002966 // The stats_client library is also statically linked into DSOs.
2967 if (SanArgs.needsStatsRt())
2968 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002969
Alexey Samsonov52550342014-09-15 19:58:40 +00002970 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002971 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002972 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002973 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002974 }
2975 if (SanArgs.needsAsanRt()) {
2976 if (SanArgs.needsSharedAsanRt()) {
2977 HelperStaticRuntimes.push_back("asan-preinit");
2978 } else {
2979 StaticRuntimes.push_back("asan");
2980 if (SanArgs.linkCXXRuntimes())
2981 StaticRuntimes.push_back("asan_cxx");
2982 }
2983 }
2984 if (SanArgs.needsDfsanRt())
2985 StaticRuntimes.push_back("dfsan");
2986 if (SanArgs.needsLsanRt())
2987 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002988 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002989 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002990 if (SanArgs.linkCXXRuntimes())
2991 StaticRuntimes.push_back("msan_cxx");
2992 }
2993 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002994 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002995 if (SanArgs.linkCXXRuntimes())
2996 StaticRuntimes.push_back("tsan_cxx");
2997 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002998 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002999 StaticRuntimes.push_back("ubsan_standalone");
3000 if (SanArgs.linkCXXRuntimes())
3001 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00003002 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00003003 if (SanArgs.needsSafeStackRt())
3004 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00003005 if (SanArgs.needsCfiRt())
3006 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003007 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00003008 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00003009 if (SanArgs.linkCXXRuntimes())
3010 StaticRuntimes.push_back("ubsan_standalone_cxx");
3011 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003012 if (SanArgs.needsStatsRt()) {
3013 NonWholeStaticRuntimes.push_back("stats");
3014 RequiredSymbols.push_back("__sanitizer_stats_register");
3015 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00003016}
3017
Alexey Samsonov52550342014-09-15 19:58:40 +00003018// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
3019// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
3020static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00003021 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00003022 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003023 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00003024 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00003025 NonWholeStaticRuntimes, HelperStaticRuntimes,
3026 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00003027 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003028 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00003029 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00003030 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003031 bool AddExportDynamic = false;
3032 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00003033 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00003034 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3035 }
Peter Collingbournedc134532016-01-16 00:31:22 +00003036 for (auto RT : NonWholeStaticRuntimes) {
3037 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
3038 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
3039 }
3040 for (auto S : RequiredSymbols) {
3041 CmdArgs.push_back("-u");
3042 CmdArgs.push_back(Args.MakeArgString(S));
3043 }
Alexey Samsonov52550342014-09-15 19:58:40 +00003044 // If there is a static runtime with no dynamic list, force all the symbols
3045 // to be dynamic to be sure we export sanitizer interface functions.
3046 if (AddExportDynamic)
3047 CmdArgs.push_back("-export-dynamic");
3048 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00003049}
3050
Reid Kleckner86ea7702015-02-04 23:45:07 +00003051static bool areOptimizationsEnabled(const ArgList &Args) {
3052 // Find the last -O arg and see if it is non-zero.
3053 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
3054 return !A->getOption().matches(options::OPT_O0);
3055 // Defaults to -O0.
3056 return false;
3057}
3058
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003059static bool shouldUseFramePointerForTarget(const ArgList &Args,
3060 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00003061 switch (Triple.getArch()) {
3062 case llvm::Triple::xcore:
3063 case llvm::Triple::wasm32:
3064 case llvm::Triple::wasm64:
3065 // XCore never wants frame pointers, regardless of OS.
3066 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003067 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00003068 default:
3069 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003070 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00003071
3072 if (Triple.isOSLinux()) {
3073 switch (Triple.getArch()) {
3074 // Don't use a frame pointer on linux if optimizing for certain targets.
3075 case llvm::Triple::mips64:
3076 case llvm::Triple::mips64el:
3077 case llvm::Triple::mips:
3078 case llvm::Triple::mipsel:
3079 case llvm::Triple::systemz:
3080 case llvm::Triple::x86:
3081 case llvm::Triple::x86_64:
3082 return !areOptimizationsEnabled(Args);
3083 default:
3084 return true;
3085 }
3086 }
3087
3088 if (Triple.isOSWindows()) {
3089 switch (Triple.getArch()) {
3090 case llvm::Triple::x86:
3091 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00003092 case llvm::Triple::x86_64:
3093 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00003094 case llvm::Triple::arm:
3095 case llvm::Triple::thumb:
3096 // Windows on ARM builds with FPO disabled to aid fast stack walking
3097 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00003098 default:
3099 // All other supported Windows ISAs use xdata unwind information, so frame
3100 // pointers are not generally useful.
3101 return false;
3102 }
3103 }
3104
3105 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003106}
3107
Rafael Espindola224dd632011-12-14 21:02:23 +00003108static bool shouldUseFramePointer(const ArgList &Args,
3109 const llvm::Triple &Triple) {
3110 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
3111 options::OPT_fomit_frame_pointer))
3112 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003113 if (Args.hasArg(options::OPT_pg))
3114 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00003115
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003116 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00003117}
3118
Eric Christopherb7d97e92013-04-03 01:58:53 +00003119static bool shouldUseLeafFramePointer(const ArgList &Args,
3120 const llvm::Triple &Triple) {
3121 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
3122 options::OPT_momit_leaf_frame_pointer))
3123 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00003124 if (Args.hasArg(options::OPT_pg))
3125 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00003126
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00003127 if (Triple.isPS4CPU())
3128 return false;
3129
Benjamin Kramer34cb0432013-10-16 17:42:39 +00003130 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00003131}
3132
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003133/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003134static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003135 SmallString<128> cwd;
3136 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003137 CmdArgs.push_back("-fdebug-compilation-dir");
3138 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003139 }
3140}
3141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003142static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003143 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3144 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3145 SmallString<128> T(FinalOutput->getValue());
3146 llvm::sys::path::replace_extension(T, "dwo");
3147 return Args.MakeArgString(T);
3148 } else {
3149 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003150 SmallString<128> T(
3151 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003152 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003153 llvm::sys::path::replace_extension(F, "dwo");
3154 T += F;
3155 return Args.MakeArgString(F);
3156 }
3157}
3158
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003159static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3160 const JobAction &JA, const ArgList &Args,
3161 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003162 ArgStringList ExtractArgs;
3163 ExtractArgs.push_back("--extract-dwo");
3164
3165 ArgStringList StripArgs;
3166 StripArgs.push_back("--strip-dwo");
3167
3168 // Grabbing the output of the earlier compile step.
3169 StripArgs.push_back(Output.getFilename());
3170 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003171 ExtractArgs.push_back(OutFile);
3172
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003173 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003174 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003175
3176 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003177 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003178
3179 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003180 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003181}
3182
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003183/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003184/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3185static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003186 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003187 if (A->getOption().matches(options::OPT_O4) ||
3188 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003189 return true;
3190
3191 if (A->getOption().matches(options::OPT_O0))
3192 return false;
3193
3194 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3195
Rafael Espindola91780de2013-08-26 14:05:41 +00003196 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003197 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003198 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003199 return true;
3200
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003201 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003202 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003203 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003204
3205 unsigned OptLevel = 0;
3206 if (S.getAsInteger(10, OptLevel))
3207 return false;
3208
3209 return OptLevel > 1;
3210 }
3211
3212 return false;
3213}
3214
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003215/// Add -x lang to \p CmdArgs for \p Input.
3216static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3217 ArgStringList &CmdArgs) {
3218 // When using -verify-pch, we don't want to provide the type
3219 // 'precompiled-header' if it was inferred from the file extension
3220 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3221 return;
3222
3223 CmdArgs.push_back("-x");
3224 if (Args.hasArg(options::OPT_rewrite_objc))
3225 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3226 else
3227 CmdArgs.push_back(types::getTypeName(Input.getType()));
3228}
3229
David Majnemerc371ff02015-03-22 08:39:22 +00003230static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003231 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003232 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003233
3234 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003235 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003236
3237 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003238 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003239 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003240 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003241}
3242
Rafael Espindola577637a2015-01-03 00:06:04 +00003243// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003244// options that build systems might add but are unused when assembling or only
3245// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003246static void claimNoWarnArgs(const ArgList &Args) {
3247 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003248 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003249 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003250 Args.ClaimAllArgs(options::OPT_flto);
3251 Args.ClaimAllArgs(options::OPT_fno_lto);
3252}
3253
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003254static void appendUserToPath(SmallVectorImpl<char> &Result) {
3255#ifdef LLVM_ON_UNIX
3256 const char *Username = getenv("LOGNAME");
3257#else
3258 const char *Username = getenv("USERNAME");
3259#endif
3260 if (Username) {
3261 // Validate that LoginName can be used in a path, and get its length.
3262 size_t Len = 0;
3263 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003264 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003265 Username = nullptr;
3266 break;
3267 }
3268 }
3269
3270 if (Username && Len > 0) {
3271 Result.append(Username, Username + Len);
3272 return;
3273 }
3274 }
3275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003276// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003277#ifdef LLVM_ON_UNIX
3278 std::string UID = llvm::utostr(getuid());
3279#else
3280 // FIXME: Windows seems to have an 'SID' that might work.
3281 std::string UID = "9999";
3282#endif
3283 Result.append(UID.begin(), UID.end());
3284}
3285
David Majnemere11d3732015-06-08 00:22:46 +00003286VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3287 const llvm::Triple &Triple,
3288 const llvm::opt::ArgList &Args,
3289 bool IsWindowsMSVC) {
3290 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3291 IsWindowsMSVC) ||
3292 Args.hasArg(options::OPT_fmsc_version) ||
3293 Args.hasArg(options::OPT_fms_compatibility_version)) {
3294 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3295 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003296 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003297
3298 if (MSCVersion && MSCompatibilityVersion) {
3299 if (D)
3300 D->Diag(diag::err_drv_argument_not_allowed_with)
3301 << MSCVersion->getAsString(Args)
3302 << MSCompatibilityVersion->getAsString(Args);
3303 return VersionTuple();
3304 }
3305
3306 if (MSCompatibilityVersion) {
3307 VersionTuple MSVT;
3308 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3309 D->Diag(diag::err_drv_invalid_value)
3310 << MSCompatibilityVersion->getAsString(Args)
3311 << MSCompatibilityVersion->getValue();
3312 return MSVT;
3313 }
3314
3315 if (MSCVersion) {
3316 unsigned Version = 0;
3317 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3318 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3319 << MSCVersion->getValue();
3320 return getMSCompatibilityVersion(Version);
3321 }
3322
3323 unsigned Major, Minor, Micro;
3324 Triple.getEnvironmentVersion(Major, Minor, Micro);
3325 if (Major || Minor || Micro)
3326 return VersionTuple(Major, Minor, Micro);
3327
Nico Weber9a952752016-03-23 23:26:59 +00003328 // FIXME: Consider bumping this to 19 (MSVC2015) soon.
David Majnemere11d3732015-06-08 00:22:46 +00003329 return VersionTuple(18);
3330 }
3331 return VersionTuple();
3332}
3333
Diego Novilloa0545962015-07-10 18:00:07 +00003334static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3335 const InputInfo &Output, const ArgList &Args,
3336 ArgStringList &CmdArgs) {
3337 auto *ProfileGenerateArg = Args.getLastArg(
3338 options::OPT_fprofile_instr_generate,
3339 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003340 options::OPT_fprofile_generate_EQ,
3341 options::OPT_fno_profile_instr_generate);
3342 if (ProfileGenerateArg &&
3343 ProfileGenerateArg->getOption().matches(
3344 options::OPT_fno_profile_instr_generate))
3345 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003346
3347 auto *ProfileUseArg = Args.getLastArg(
3348 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003349 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3350 options::OPT_fno_profile_instr_use);
3351 if (ProfileUseArg &&
3352 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3353 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003354
3355 if (ProfileGenerateArg && ProfileUseArg)
3356 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003357 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003358
Diego Novillo758f3f52015-08-05 21:49:51 +00003359 if (ProfileGenerateArg) {
3360 if (ProfileGenerateArg->getOption().matches(
3361 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003362 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3363 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003364 else if (ProfileGenerateArg->getOption().matches(
3365 options::OPT_fprofile_generate_EQ)) {
3366 SmallString<128> Path(ProfileGenerateArg->getValue());
3367 llvm::sys::path::append(Path, "default.profraw");
3368 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003369 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3370 }
3371 // The default is to use Clang Instrumentation.
3372 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003373 }
Diego Novilloa0545962015-07-10 18:00:07 +00003374
Diego Novillo758f3f52015-08-05 21:49:51 +00003375 if (ProfileUseArg) {
3376 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
Rong Xu9c6f1532016-03-02 20:59:36 +00003377 CmdArgs.push_back(Args.MakeArgString(
3378 Twine("-fprofile-instrument-use-path=") + ProfileUseArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003379 else if ((ProfileUseArg->getOption().matches(
3380 options::OPT_fprofile_use_EQ) ||
3381 ProfileUseArg->getOption().matches(
3382 options::OPT_fprofile_instr_use))) {
3383 SmallString<128> Path(
3384 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3385 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3386 llvm::sys::path::append(Path, "default.profdata");
3387 CmdArgs.push_back(
Rong Xu9c6f1532016-03-02 20:59:36 +00003388 Args.MakeArgString(Twine("-fprofile-instrument-use-path=") + Path));
Diego Novillo758f3f52015-08-05 21:49:51 +00003389 }
Diego Novilloa0545962015-07-10 18:00:07 +00003390 }
3391
3392 if (Args.hasArg(options::OPT_ftest_coverage) ||
3393 Args.hasArg(options::OPT_coverage))
3394 CmdArgs.push_back("-femit-coverage-notes");
3395 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3396 false) ||
3397 Args.hasArg(options::OPT_coverage))
3398 CmdArgs.push_back("-femit-coverage-data");
3399
Diego Novilloc4b94da2015-08-05 23:27:40 +00003400 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3401 options::OPT_fno_coverage_mapping, false) &&
3402 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003403 D.Diag(diag::err_drv_argument_only_allowed_with)
3404 << "-fcoverage-mapping"
3405 << "-fprofile-instr-generate";
3406
Diego Novilloc4b94da2015-08-05 23:27:40 +00003407 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3408 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003409 CmdArgs.push_back("-fcoverage-mapping");
3410
3411 if (C.getArgs().hasArg(options::OPT_c) ||
3412 C.getArgs().hasArg(options::OPT_S)) {
3413 if (Output.isFilename()) {
3414 CmdArgs.push_back("-coverage-file");
3415 SmallString<128> CoverageFilename;
3416 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3417 CoverageFilename = FinalOutput->getValue();
3418 } else {
3419 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3420 }
3421 if (llvm::sys::path::is_relative(CoverageFilename)) {
3422 SmallString<128> Pwd;
3423 if (!llvm::sys::fs::current_path(Pwd)) {
3424 llvm::sys::path::append(Pwd, CoverageFilename);
3425 CoverageFilename.swap(Pwd);
3426 }
3427 }
3428 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3429 }
3430 }
3431}
3432
Paul Robinsond083b9a2015-12-16 17:25:27 +00003433static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3434 ArgStringList &CmdArgs) {
3435 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3436 false) ||
3437 Args.hasFlag(options::OPT_fprofile_generate,
3438 options::OPT_fno_profile_instr_generate, false) ||
3439 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3440 options::OPT_fno_profile_instr_generate, false) ||
3441 Args.hasFlag(options::OPT_fprofile_instr_generate,
3442 options::OPT_fno_profile_instr_generate, false) ||
3443 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3444 options::OPT_fno_profile_instr_generate, false) ||
3445 Args.hasArg(options::OPT_fcreate_profile) ||
3446 Args.hasArg(options::OPT_coverage)))
3447 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3448}
3449
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003450/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3451/// smooshes them together with platform defaults, to decide whether
3452/// this compile should be using PIC mode or not. Returns a tuple of
3453/// (RelocationModel, PICLevel, IsPIE).
3454static std::tuple<llvm::Reloc::Model, unsigned, bool>
3455ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3456 const ArgList &Args) {
3457 // FIXME: why does this code...and so much everywhere else, use both
3458 // ToolChain.getTriple() and Triple?
3459 bool PIE = ToolChain.isPIEDefault();
3460 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003461 // The Darwin/MachO default to use PIC does not apply when using -static.
3462 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3463 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003464 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003465 bool IsPICLevelTwo = PIC;
3466
3467 bool KernelOrKext =
3468 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3469
3470 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003471 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003472 switch (ToolChain.getArch()) {
3473 case llvm::Triple::arm:
3474 case llvm::Triple::armeb:
3475 case llvm::Triple::thumb:
3476 case llvm::Triple::thumbeb:
3477 case llvm::Triple::aarch64:
3478 case llvm::Triple::mips:
3479 case llvm::Triple::mipsel:
3480 case llvm::Triple::mips64:
3481 case llvm::Triple::mips64el:
3482 PIC = true; // "-fpic"
3483 break;
3484
3485 case llvm::Triple::x86:
3486 case llvm::Triple::x86_64:
3487 PIC = true; // "-fPIC"
3488 IsPICLevelTwo = true;
3489 break;
3490
3491 default:
3492 break;
3493 }
3494 }
3495
3496 // OpenBSD-specific defaults for PIE
3497 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3498 switch (ToolChain.getArch()) {
3499 case llvm::Triple::mips64:
3500 case llvm::Triple::mips64el:
3501 case llvm::Triple::sparcel:
3502 case llvm::Triple::x86:
3503 case llvm::Triple::x86_64:
3504 IsPICLevelTwo = false; // "-fpie"
3505 break;
3506
3507 case llvm::Triple::ppc:
3508 case llvm::Triple::sparc:
3509 case llvm::Triple::sparcv9:
3510 IsPICLevelTwo = true; // "-fPIE"
3511 break;
3512
3513 default:
3514 break;
3515 }
3516 }
3517
3518 // The last argument relating to either PIC or PIE wins, and no
3519 // other argument is used. If the last argument is any flavor of the
3520 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3521 // option implicitly enables PIC at the same level.
3522 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3523 options::OPT_fpic, options::OPT_fno_pic,
3524 options::OPT_fPIE, options::OPT_fno_PIE,
3525 options::OPT_fpie, options::OPT_fno_pie);
3526 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3527 // is forced, then neither PIC nor PIE flags will have no effect.
3528 if (!ToolChain.isPICDefaultForced()) {
3529 if (LastPICArg) {
3530 Option O = LastPICArg->getOption();
3531 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3532 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3533 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3534 PIC =
3535 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3536 IsPICLevelTwo =
3537 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3538 } else {
3539 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003540 if (Triple.isPS4CPU()) {
3541 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3542 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3543 if (Model != "kernel") {
3544 PIC = true;
3545 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3546 << LastPICArg->getSpelling();
3547 }
3548 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003549 }
3550 }
3551 }
3552
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003553 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3554 // PIC level would've been set to level 1, force it back to level 2 PIC
3555 // instead.
3556 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003557 IsPICLevelTwo |= ToolChain.isPICDefault();
3558
James Y Knightc4015d32015-08-21 04:14:55 +00003559 // This kernel flags are a trump-card: they will disable PIC/PIE
3560 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003561 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3562 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003563 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003564
3565 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3566 // This is a very special mode. It trumps the other modes, almost no one
3567 // uses it, and it isn't even valid on any OS but Darwin.
3568 if (!ToolChain.getTriple().isOSDarwin())
3569 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3570 << A->getSpelling() << ToolChain.getTriple().str();
3571
3572 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3573
3574 // Only a forced PIC mode can cause the actual compile to have PIC defines
3575 // etc., no flags are sufficient. This behavior was selected to closely
3576 // match that of llvm-gcc and Apple GCC before that.
3577 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3578
3579 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3580 }
3581
3582 if (PIC)
3583 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3584
3585 return std::make_tuple(llvm::Reloc::Static, 0, false);
3586}
3587
3588static const char *RelocationModelName(llvm::Reloc::Model Model) {
3589 switch (Model) {
3590 case llvm::Reloc::Default:
3591 return nullptr;
3592 case llvm::Reloc::Static:
3593 return "static";
3594 case llvm::Reloc::PIC_:
3595 return "pic";
3596 case llvm::Reloc::DynamicNoPIC:
3597 return "dynamic-no-pic";
3598 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003599 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003600}
3601
3602static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3603 ArgStringList &CmdArgs) {
3604 llvm::Reloc::Model RelocationModel;
3605 unsigned PICLevel;
3606 bool IsPIE;
3607 std::tie(RelocationModel, PICLevel, IsPIE) =
3608 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3609
3610 if (RelocationModel != llvm::Reloc::Static)
3611 CmdArgs.push_back("-KPIC");
3612}
3613
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003614void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003615 const InputInfo &Output, const InputInfoList &Inputs,
3616 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003617 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3618 const llvm::Triple Triple(TripleStr);
3619
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003620 bool KernelOrKext =
3621 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003622 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003623 ArgStringList CmdArgs;
3624
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003625 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003626 bool IsWindowsCygnus =
3627 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003628 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003629 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003630
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003631 // Check number of inputs for sanity. We need at least one input.
3632 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003633 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003634 // CUDA compilation may have multiple inputs (source file + results of
3635 // device-side compilations). All other jobs are expected to have exactly one
3636 // input.
3637 bool IsCuda = types::isCuda(Input.getType());
3638 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003639
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003640 // Invoke ourselves in -cc1 mode.
3641 //
3642 // FIXME: Implement custom jobs for internal actions.
3643 CmdArgs.push_back("-cc1");
3644
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003645 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003646 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003647 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003648
Artem Belevichfa11ab52015-11-17 22:28:46 +00003649 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003650 if (IsCuda) {
3651 // FIXME: We need a (better) way to pass information about
3652 // particular compilation pass we're constructing here. For now we
3653 // can check which toolchain we're using and pick the other one to
3654 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003655 if (&getToolChain() == C.getCudaDeviceToolChain())
3656 AuxToolChain = C.getCudaHostToolChain();
3657 else if (&getToolChain() == C.getCudaHostToolChain())
3658 AuxToolChain = C.getCudaDeviceToolChain();
3659 else
3660 llvm_unreachable("Can't figure out CUDA compilation mode.");
3661 assert(AuxToolChain != nullptr && "No aux toolchain.");
3662 CmdArgs.push_back("-aux-triple");
3663 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
3664 }
3665
James Y Knight2db38f32015-08-15 03:45:25 +00003666 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3667 Triple.getArch() == llvm::Triple::thumb)) {
3668 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003669 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003670 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003671 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003672 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003673 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003674 }
3675
Tim Northover336f1892014-03-29 13:16:12 +00003676 // Push all default warning arguments that are specific to
3677 // the given target. These come before user provided warning options
3678 // are provided.
3679 getToolChain().addClangWarningOptions(CmdArgs);
3680
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003681 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003682 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003683
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003684 if (isa<AnalyzeJobAction>(JA)) {
3685 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3686 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003687 } else if (isa<MigrateJobAction>(JA)) {
3688 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003689 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003690 if (Output.getType() == types::TY_Dependencies)
3691 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003692 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003693 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003694 if (Args.hasArg(options::OPT_rewrite_objc) &&
3695 !Args.hasArg(options::OPT_g_Group))
3696 CmdArgs.push_back("-P");
3697 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003698 } else if (isa<AssembleJobAction>(JA)) {
3699 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003700
David Blaikie9260ed62013-07-25 21:19:01 +00003701 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003702
3703 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003704 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003705 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003706 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003707 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003708
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003709 if (JA.getType() == types::TY_Nothing)
3710 CmdArgs.push_back("-fsyntax-only");
3711 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003712 CmdArgs.push_back("-emit-pch");
3713 else
3714 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003715 } else if (isa<VerifyPCHJobAction>(JA)) {
3716 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003717 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003718 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3719 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003720 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003721 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003722 } else if (JA.getType() == types::TY_LLVM_IR ||
3723 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003724 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003725 } else if (JA.getType() == types::TY_LLVM_BC ||
3726 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003727 CmdArgs.push_back("-emit-llvm-bc");
3728 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003729 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003730 } else if (JA.getType() == types::TY_AST) {
3731 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003732 } else if (JA.getType() == types::TY_ModuleFile) {
3733 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003734 } else if (JA.getType() == types::TY_RewrittenObjC) {
3735 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003736 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003737 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3738 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003739 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003740 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003741 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003742 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003743
3744 // Preserve use-list order by default when emitting bitcode, so that
3745 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3746 // same result as running passes here. For LTO, we don't need to preserve
3747 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003748 if (JA.getType() == types::TY_LLVM_BC)
3749 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003750
3751 if (D.isUsingLTO())
3752 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003753 }
3754
Teresa Johnsonaff22322015-12-07 19:21:34 +00003755 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3756 if (!types::isLLVMIR(Input.getType()))
3757 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3758 << "-x ir";
3759 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3760 }
3761
Steven Wu574b0f22016-03-01 01:07:58 +00003762 // Embed-bitcode option.
3763 if (C.getDriver().embedBitcodeEnabled() &&
3764 (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) {
3765 // Add flags implied by -fembed-bitcode.
3766 CmdArgs.push_back("-fembed-bitcode");
3767 // Disable all llvm IR level optimizations.
3768 CmdArgs.push_back("-disable-llvm-optzns");
3769 }
3770 if (C.getDriver().embedBitcodeMarkerOnly())
3771 CmdArgs.push_back("-fembed-bitcode-marker");
3772
Justin Bognera88f0122014-06-20 22:59:50 +00003773 // We normally speed up the clang process a bit by skipping destructors at
3774 // exit, but when we're generating diagnostics we can rely on some of the
3775 // cleanup.
3776 if (!C.isForDiagnostics())
3777 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003778
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003779// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003780#ifdef NDEBUG
3781 CmdArgs.push_back("-disable-llvm-verifier");
Mehdi Amini557c20a2016-03-13 21:05:23 +00003782 // Discard LLVM value names in -asserts builds.
3783 CmdArgs.push_back("-discard-value-names");
John McCallbb79b5f2010-02-13 03:50:24 +00003784#endif
3785
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003786 // Set the main file name, so that debug info works even with
3787 // -save-temps.
3788 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003789 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003790
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003791 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003792 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003793 if (Args.hasArg(options::OPT_static))
3794 CmdArgs.push_back("-static-define");
3795
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003796 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003797 // Enable region store model by default.
3798 CmdArgs.push_back("-analyzer-store=region");
3799
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003800 // Treat blocks as analysis entry points.
3801 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3802
Ted Kremenek49c79792011-03-24 00:28:47 +00003803 CmdArgs.push_back("-analyzer-eagerly-assume");
3804
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003805 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003806 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003807 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003808
Devin Coughlin65c77082016-01-21 20:09:49 +00003809 if (!IsWindowsMSVC) {
3810 CmdArgs.push_back("-analyzer-checker=unix");
3811 } else {
3812 // Enable "unix" checkers that also work on Windows.
3813 CmdArgs.push_back("-analyzer-checker=unix.API");
3814 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3815 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3816 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3817 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3818 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3819 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003820
Sean Evesonb38c32b2016-01-06 10:03:58 +00003821 // Disable some unix checkers for PS4.
3822 if (IsPS4CPU) {
3823 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3824 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3825 }
3826
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003827 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003828 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003829
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003830 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003831
Artem Belevichba558952015-05-06 18:20:23 +00003832 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003833 CmdArgs.push_back("-analyzer-checker=cplusplus");
3834
Sean Evesonb38c32b2016-01-06 10:03:58 +00003835 if (!IsPS4CPU) {
3836 CmdArgs.push_back(
3837 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3838 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3839 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3840 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3841 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3842 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3843 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003844
3845 // Default nullability checks.
3846 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3847 CmdArgs.push_back(
3848 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003849 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003850
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003851 // Set the output format. The default is plist, for (lame) historical
3852 // reasons.
3853 CmdArgs.push_back("-analyzer-output");
3854 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003855 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003856 else
3857 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003858
Ted Kremenekfe449a22010-03-22 22:32:05 +00003859 // Disable the presentation of standard compiler warnings when
3860 // using --analyze. We only want to show static analyzer diagnostics
3861 // or frontend errors.
3862 CmdArgs.push_back("-w");
3863
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003864 // Add -Xanalyzer arguments when running as analyzer.
3865 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003866 }
3867
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003868 CheckCodeGenerationOptions(D, Args);
3869
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003870 llvm::Reloc::Model RelocationModel;
3871 unsigned PICLevel;
3872 bool IsPIE;
3873 std::tie(RelocationModel, PICLevel, IsPIE) =
3874 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003875
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003876 const char *RMName = RelocationModelName(RelocationModel);
3877 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003878 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003879 CmdArgs.push_back(RMName);
3880 }
3881 if (PICLevel > 0) {
3882 CmdArgs.push_back("-pic-level");
3883 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3884 if (IsPIE) {
3885 CmdArgs.push_back("-pie-level");
3886 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003887 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003888 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003889
Renato Golin4854d802015-11-09 12:40:41 +00003890 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3891 CmdArgs.push_back("-meabi");
3892 CmdArgs.push_back(A->getValue());
3893 }
3894
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003895 CmdArgs.push_back("-mthread-model");
3896 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3897 CmdArgs.push_back(A->getValue());
3898 else
3899 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3900
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003901 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3902
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003903 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3904 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003905 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003906
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003907 // LLVM Code Generator Options.
3908
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003909 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3910 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003911 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3912 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003913 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003914 CmdArgs.push_back(A->getValue());
3915 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003916 }
3917 }
3918
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003919 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3920 StringRef v = A->getValue();
3921 CmdArgs.push_back("-mllvm");
3922 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3923 A->claim();
3924 }
3925
Nirav Daved2f44d82016-04-05 17:50:43 +00003926 if (!Args.hasFlag(options::OPT_fjump_tables, options::OPT_fno_jump_tables,
3927 true))
3928 CmdArgs.push_back("-fno-jump-tables");
3929
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003930 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3931 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003932 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003933 }
3934
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003935 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3936 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003937 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003938 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003940 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3941 CmdArgs.push_back("-fpcc-struct-return");
3942 } else {
3943 assert(A->getOption().matches(options::OPT_freg_struct_return));
3944 CmdArgs.push_back("-freg-struct-return");
3945 }
3946 }
3947
Roman Divacky65b88cd2011-03-01 17:40:53 +00003948 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3949 CmdArgs.push_back("-mrtd");
3950
Rafael Espindola224dd632011-12-14 21:02:23 +00003951 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003952 CmdArgs.push_back("-mdisable-fp-elim");
3953 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3954 options::OPT_fno_zero_initialized_in_bss))
3955 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003956
3957 bool OFastEnabled = isOptimizationLevelFast(Args);
3958 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3959 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003960 OptSpecifier StrictAliasingAliasOption =
3961 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003962 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3963 // doesn't do any TBAA.
3964 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003965 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003966 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003967 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003968 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3969 options::OPT_fno_struct_path_tbaa))
3970 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003971 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3972 false))
3973 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003974 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3975 options::OPT_fno_strict_vtable_pointers,
3976 false))
3977 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003978 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3979 options::OPT_fno_optimize_sibling_calls))
3980 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003981
Eric Christopher006208c2013-04-04 06:29:47 +00003982 // Handle segmented stacks.
3983 if (Args.hasArg(options::OPT_fsplit_stack))
3984 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003985
3986 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3987 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003988 OptSpecifier FastMathAliasOption =
3989 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3990
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003991 // Handle various floating point optimization flags, mapping them to the
3992 // appropriate LLVM code generation flags. The pattern for all of these is to
3993 // default off the codegen optimizations, and if any flag enables them and no
3994 // flag disables them after the flag enabling them, enable the codegen
3995 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003996 if (Arg *A = Args.getLastArg(
3997 options::OPT_ffast_math, FastMathAliasOption,
3998 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3999 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
4000 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004001 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4002 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004003 A->getOption().getID() != options::OPT_fhonor_infinities)
4004 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004005 if (Arg *A = Args.getLastArg(
4006 options::OPT_ffast_math, FastMathAliasOption,
4007 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
4008 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
4009 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004010 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4011 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004012 A->getOption().getID() != options::OPT_fhonor_nans)
4013 CmdArgs.push_back("-menable-no-nans");
4014
Benjamin Kramerc242ef22012-05-02 14:55:48 +00004015 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
4016 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004017 if (Arg *A =
4018 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4019 options::OPT_fno_fast_math, options::OPT_fmath_errno,
4020 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00004021 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
4022 // However, turning *off* -ffast_math merely restores the toolchain default
4023 // (which may be false).
4024 if (A->getOption().getID() == options::OPT_fno_math_errno ||
4025 A->getOption().getID() == options::OPT_ffast_math ||
4026 A->getOption().getID() == options::OPT_Ofast)
4027 MathErrno = false;
4028 else if (A->getOption().getID() == options::OPT_fmath_errno)
4029 MathErrno = true;
4030 }
Chandler Carruth3634c662012-04-26 02:10:51 +00004031 if (MathErrno)
4032 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004033
4034 // There are several flags which require disabling very specific
4035 // optimizations. Any of these being disabled forces us to turn off the
4036 // entire set of LLVM optimizations, so collect them through all the flag
4037 // madness.
4038 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004039 if (Arg *A = Args.getLastArg(
4040 options::OPT_ffast_math, FastMathAliasOption,
4041 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
4042 options::OPT_fno_unsafe_math_optimizations,
4043 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004044 if (A->getOption().getID() != options::OPT_fno_fast_math &&
4045 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004046 A->getOption().getID() != options::OPT_fno_associative_math)
4047 AssociativeMath = true;
4048 bool ReciprocalMath = 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_freciprocal_math, options::OPT_fno_reciprocal_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_reciprocal_math)
4057 ReciprocalMath = true;
4058 bool SignedZeros = true;
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_fsigned_zeros, options::OPT_fno_signed_zeros))
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_fsigned_zeros)
4067 SignedZeros = false;
4068 bool TrappingMath = 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_ftrapping_math, options::OPT_fno_trapping_math))
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_ftrapping_math)
4077 TrappingMath = false;
4078 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
4079 !TrappingMath)
4080 CmdArgs.push_back("-menable-unsafe-fp-math");
4081
Sanjay Patel76c9e092015-01-23 16:40:50 +00004082 if (!SignedZeros)
4083 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00004084
Sanjay Patel359b1052015-04-09 15:03:23 +00004085 if (ReciprocalMath)
4086 CmdArgs.push_back("-freciprocal-math");
4087
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004088 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004089 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004090 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00004091 options::OPT_ffp_contract)) {
4092 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004093 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00004094 if (Val == "fast" || Val == "on" || Val == "off") {
4095 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
4096 } else {
4097 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004098 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00004099 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004100 } else if (A->getOption().matches(options::OPT_ffast_math) ||
4101 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00004102 // If fast-math is set then set the fp-contract mode to fast.
4103 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
4104 }
4105 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004106
Sanjay Patel2987c292015-06-11 14:53:41 +00004107 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00004108
Bob Wilson6a039162012-07-19 03:52:53 +00004109 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
4110 // and if we find them, tell the frontend to provide the appropriate
4111 // preprocessor macros. This is distinct from enabling any optimizations as
4112 // these options induce language changes which must survive serialization
4113 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00004114 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
4115 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004116 if (!A->getOption().matches(options::OPT_fno_fast_math))
4117 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00004118 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
4119 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00004120 if (A->getOption().matches(options::OPT_ffinite_math_only))
4121 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00004122
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004123 // Decide whether to use verbose asm. Verbose assembly is the default on
4124 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004125 bool IsIntegratedAssemblerDefault =
4126 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004127 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004128 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004129 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004130 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00004131
Rafael Espindolab8a12932015-05-22 20:44:03 +00004132 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
4133 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00004134 CmdArgs.push_back("-no-integrated-as");
4135
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004136 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
4137 CmdArgs.push_back("-mdebug-pass");
4138 CmdArgs.push_back("Structure");
4139 }
4140 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
4141 CmdArgs.push_back("-mdebug-pass");
4142 CmdArgs.push_back("Arguments");
4143 }
4144
Justin Lebar710a35f2016-01-25 22:36:35 +00004145 // Enable -mconstructor-aliases except on darwin, where we have to work around
4146 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
4147 // aliases aren't supported.
4148 if (!getToolChain().getTriple().isOSDarwin() &&
4149 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00004150 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004151
John McCall7ef5cb32011-03-18 02:56:14 +00004152 // Darwin's kernel doesn't support guard variables; just die if we
4153 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004154 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004155 CmdArgs.push_back("-fforbid-guard-variables");
4156
Akira Hatanaka02028482015-11-12 17:21:22 +00004157 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4158 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004159 CmdArgs.push_back("-mms-bitfields");
4160 }
John McCall8517abc2010-02-19 02:45:38 +00004161
Daniel Dunbar306945d2009-09-16 06:17:29 +00004162 // This is a coarse approximation of what llvm-gcc actually does, both
4163 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4164 // complicated ways.
4165 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004166 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4167 options::OPT_fno_asynchronous_unwind_tables,
4168 (getToolChain().IsUnwindTablesDefault() ||
4169 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4170 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004171 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4172 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004173 CmdArgs.push_back("-munwind-tables");
4174
Chandler Carruth05fb5852012-11-21 23:40:23 +00004175 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004176
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004177 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4178 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004179 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004180 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004181
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004182 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004183 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004184
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004185 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004186 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004187 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004188 }
4189
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004190 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004191 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004192 if (!CPU.empty()) {
4193 CmdArgs.push_back("-target-cpu");
4194 CmdArgs.push_back(Args.MakeArgString(CPU));
4195 }
4196
Rafael Espindolaeb265472013-08-21 21:59:03 +00004197 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4198 CmdArgs.push_back("-mfpmath");
4199 CmdArgs.push_back(A->getValue());
4200 }
4201
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004202 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004203 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004204
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004205 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004206 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004207 default:
4208 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004209
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004210 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004211 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004212 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004213 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004214 // Use the effective triple, which takes into account the deployment target.
4215 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004216 break;
4217
Tim Northover573cbee2014-05-24 12:52:07 +00004218 case llvm::Triple::aarch64:
4219 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004220 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004221 break;
4222
Eric Christopher0b26a612010-03-02 02:41:08 +00004223 case llvm::Triple::mips:
4224 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004225 case llvm::Triple::mips64:
4226 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004227 AddMIPSTargetArgs(Args, CmdArgs);
4228 break;
4229
Ulrich Weigand8afad612014-07-28 13:17:52 +00004230 case llvm::Triple::ppc:
4231 case llvm::Triple::ppc64:
4232 case llvm::Triple::ppc64le:
4233 AddPPCTargetArgs(Args, CmdArgs);
4234 break;
4235
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004236 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004237 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004238 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004239 AddSparcTargetArgs(Args, CmdArgs);
4240 break;
4241
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004242 case llvm::Triple::x86:
4243 case llvm::Triple::x86_64:
4244 AddX86TargetArgs(Args, CmdArgs);
4245 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004246
Jacques Pienaard964cc22016-03-28 21:02:54 +00004247 case llvm::Triple::lanai:
4248 AddLanaiTargetArgs(Args, CmdArgs);
4249 break;
4250
Tony Linthicum76329bf2011-12-12 21:14:55 +00004251 case llvm::Triple::hexagon:
4252 AddHexagonTargetArgs(Args, CmdArgs);
4253 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004254
4255 case llvm::Triple::wasm32:
4256 case llvm::Triple::wasm64:
4257 AddWebAssemblyTargetArgs(Args, CmdArgs);
4258 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004259 }
4260
Douglas Katzman3459ce22015-10-08 04:24:12 +00004261 // The 'g' groups options involve a somewhat intricate sequence of decisions
4262 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004263 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004264 // * what level of debug info to generate
4265 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004266 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004267 // This avoids having to monkey around further in cc1 other than to disable
4268 // codeview if not running in a Windows environment. Perhaps even that
4269 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004270 unsigned DwarfVersion = 0;
4271 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4272 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004273 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004274 bool EmitCodeView = false;
4275
Hans Wennborg75958c42013-08-08 00:17:41 +00004276 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004277 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004278 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004279 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004280
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004281 // Pass the linker version in use.
4282 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4283 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004284 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004285 }
4286
Eric Christopherb7d97e92013-04-03 01:58:53 +00004287 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004288 CmdArgs.push_back("-momit-leaf-frame-pointer");
4289
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004290 // Explicitly error on some things we know we don't support and can't just
4291 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004292 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4293 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004294 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004295 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004296 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4297 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004298 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004299 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004300 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004301 }
4302
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004303 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004304 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004305 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004306 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004307 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4308 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004309 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004310 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004311 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004312
Chad Rosierbe10f982011-08-02 17:58:04 +00004313 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004314 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004315 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4316 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004317 }
4318
Rafael Espindola08a692a2010-03-07 04:46:18 +00004319 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004320 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004321 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004322 // If the last option explicitly specified a debug-info level, use it.
4323 if (A->getOption().matches(options::OPT_gN_Group)) {
4324 DebugInfoKind = DebugLevelToInfoKind(*A);
4325 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4326 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4327 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004328 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004329 A->getIndex() > SplitDwarfArg->getIndex())
4330 SplitDwarfArg = nullptr;
4331 } else
4332 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004333 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004334 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004335
Paul Robinson0334a042015-12-19 19:41:48 +00004336 // If a debugger tuning argument appeared, remember it.
4337 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4338 options::OPT_ggdbN_Group)) {
4339 if (A->getOption().matches(options::OPT_glldb))
4340 DebuggerTuning = llvm::DebuggerKind::LLDB;
4341 else if (A->getOption().matches(options::OPT_gsce))
4342 DebuggerTuning = llvm::DebuggerKind::SCE;
4343 else
4344 DebuggerTuning = llvm::DebuggerKind::GDB;
4345 }
4346
4347 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004348 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004349 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004350 DwarfVersion = DwarfVersionNum(A->getSpelling());
4351
Reid Kleckner124955a2015-08-05 18:51:13 +00004352 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004353 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4354 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4355 // DwarfVersion remains at 0 if no explicit choice was made.
4356 CmdArgs.push_back("-gcodeview");
4357 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004358 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004359 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4360 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004361
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004362 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4363 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004364
4365 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004366 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004367 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004368 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004369
Eric Christopher138c32b2013-09-13 22:37:55 +00004370 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004371 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004372 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004373 CmdArgs.push_back("-dwarf-ext-refs");
4374 CmdArgs.push_back("-fmodule-format=obj");
4375 }
4376
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004377 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4378 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004379 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004380 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004381 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004382 CmdArgs.push_back("-backend-option");
4383 CmdArgs.push_back("-split-dwarf=Enable");
4384 }
4385
Douglas Katzman3459ce22015-10-08 04:24:12 +00004386 // After we've dealt with all combinations of things that could
4387 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4388 // figure out if we need to "upgrade" it to standalone debug info.
4389 // We parse these two '-f' options whether or not they will be used,
4390 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4391 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4392 options::OPT_fno_standalone_debug,
4393 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004394 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4395 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004396 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4397 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004398
Eric Christopher138c32b2013-09-13 22:37:55 +00004399 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4400 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4401 CmdArgs.push_back("-backend-option");
4402 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4403 }
Eric Christophereec89c22013-06-18 00:03:50 +00004404
Eric Christopher0d403d22014-02-14 01:27:03 +00004405 // -gdwarf-aranges turns on the emission of the aranges section in the
4406 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004407 // Always enabled on the PS4.
4408 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004409 CmdArgs.push_back("-backend-option");
4410 CmdArgs.push_back("-generate-arange-section");
4411 }
4412
David Blaikief36d9ba2014-01-27 18:52:43 +00004413 if (Args.hasFlag(options::OPT_fdebug_types_section,
4414 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004415 CmdArgs.push_back("-backend-option");
4416 CmdArgs.push_back("-generate-type-units");
4417 }
Eric Christophereec89c22013-06-18 00:03:50 +00004418
Dan Gohmana5b804b2016-01-07 00:50:27 +00004419 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4420 // default.
4421 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4422 Triple.getArch() == llvm::Triple::wasm32 ||
4423 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004424
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004425 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004426 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004427 CmdArgs.push_back("-ffunction-sections");
4428 }
4429
Peter Collingbourneceef1452016-02-24 22:03:06 +00004430 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4431 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004432 if (!D.isUsingLTO())
4433 D.Diag(diag::err_drv_argument_only_allowed_with)
4434 << "-fwhole-program-vtables"
4435 << "-flto";
4436 CmdArgs.push_back("-fwhole-program-vtables");
4437
4438 clang::SmallString<64> Path(D.ResourceDir);
4439 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4440 if (llvm::sys::fs::exists(Path)) {
4441 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4442 BlacklistOpt += Path.str();
4443 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4444 }
4445
4446 for (const Arg *A :
4447 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4448 A->claim();
4449 if (!llvm::sys::fs::exists(A->getValue()))
4450 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4451 }
4452
4453 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4454 }
4455
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004456 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4457 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004458 CmdArgs.push_back("-fdata-sections");
4459 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004460
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004461 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004462 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004463 CmdArgs.push_back("-fno-unique-section-names");
4464
Chris Lattner3c77a352010-06-22 00:03:40 +00004465 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4466
Diego Novilloa0545962015-07-10 18:00:07 +00004467 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004468
Paul Robinsond083b9a2015-12-16 17:25:27 +00004469 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4470 if (getToolChain().getTriple().isPS4CPU())
4471 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4472
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004473 // Pass options for controlling the default header search paths.
4474 if (Args.hasArg(options::OPT_nostdinc)) {
4475 CmdArgs.push_back("-nostdsysteminc");
4476 CmdArgs.push_back("-nobuiltininc");
4477 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004478 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004479 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004480 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4481 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4482 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004483
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004484 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004485 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004486 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004487
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004488 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4489
Ted Kremenekf7639e12012-03-06 20:06:33 +00004490 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004491 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004492 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004493 options::OPT_ccc_arcmt_modify,
4494 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004495 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004496 switch (A->getOption().getID()) {
4497 default:
4498 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004499 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004500 CmdArgs.push_back("-arcmt-check");
4501 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004502 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004503 CmdArgs.push_back("-arcmt-modify");
4504 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004505 case options::OPT_ccc_arcmt_migrate:
4506 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004507 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004508 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004509
4510 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4511 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004512 break;
John McCalld70fb982011-06-15 23:25:17 +00004513 }
4514 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004515 } else {
4516 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4517 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4518 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004519 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004520
Ted Kremenekf7639e12012-03-06 20:06:33 +00004521 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4522 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004523 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4524 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004525 }
4526 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004527 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004528
4529 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004530 options::OPT_objcmt_migrate_subscripting,
4531 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004532 // None specified, means enable them all.
4533 CmdArgs.push_back("-objcmt-migrate-literals");
4534 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004535 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004536 } else {
4537 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4538 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004539 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004540 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004541 } else {
4542 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4543 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4544 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4545 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4546 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4547 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004548 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004549 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4550 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4551 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4552 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4553 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4554 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4555 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004556 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004557 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004558 }
4559
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004560 // Add preprocessing options like -I, -D, etc. if we are using the
4561 // preprocessor.
4562 //
4563 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004564 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004565 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4566 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004567
Rafael Espindolaa7431922011-07-21 23:40:37 +00004568 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4569 // that "The compiler can only warn and ignore the option if not recognized".
4570 // When building with ccache, it will pass -D options to clang even on
4571 // preprocessed inputs and configure concludes that -fPIC is not supported.
4572 Args.ClaimAllArgs(options::OPT_D);
4573
Alp Toker7874bdc2013-11-15 20:40:58 +00004574 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004575 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4576 if (A->getOption().matches(options::OPT_O4)) {
4577 CmdArgs.push_back("-O3");
4578 D.Diag(diag::warn_O4_is_O3);
4579 } else {
4580 A->render(Args, CmdArgs);
4581 }
4582 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004583
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004584 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004585 for (const Arg *A :
4586 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4587 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004588 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004589 }
4590
Rafael Espindola577637a2015-01-03 00:06:04 +00004591 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004592
Richard Smith3be1cb22014-08-07 00:24:21 +00004593 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004594 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004595 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4596 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004597 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004598 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004599
4600 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004601 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004602 //
4603 // If a std is supplied, only add -trigraphs if it follows the
4604 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004605 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004606 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4607 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004608 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004609 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004610 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004611 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004612 else
4613 Std->render(Args, CmdArgs);
4614
Nico Weber00721502014-12-23 22:32:37 +00004615 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004616 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004617 options::OPT_ftrigraphs,
4618 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004619 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004620 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004621 } else {
4622 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004623 //
4624 // FIXME: Clang doesn't correctly handle -std= when the input language
4625 // doesn't match. For the time being just ignore this for C++ inputs;
4626 // eventually we want to do all the standard defaulting here instead of
4627 // splitting it between the driver and clang -cc1.
4628 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004629 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4630 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004631 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004632 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004633
Nico Weber00721502014-12-23 22:32:37 +00004634 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4635 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004636 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004637
Richard Smith282b4492013-09-04 22:50:31 +00004638 // GCC's behavior for -Wwrite-strings is a bit strange:
4639 // * In C, this "warning flag" changes the types of string literals from
4640 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4641 // for the discarded qualifier.
4642 // * In C++, this is just a normal warning flag.
4643 //
4644 // Implementing this warning correctly in C is hard, so we follow GCC's
4645 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4646 // a non-const char* in C, rather than using this crude hack.
4647 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004648 // FIXME: This should behave just like a warning flag, and thus should also
4649 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4650 Arg *WriteStrings =
4651 Args.getLastArg(options::OPT_Wwrite_strings,
4652 options::OPT_Wno_write_strings, options::OPT_w);
4653 if (WriteStrings &&
4654 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004655 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004656 }
4657
Chandler Carruth61fbf622011-04-23 09:27:53 +00004658 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004659 // during C++ compilation, which it is by default. GCC keeps this define even
4660 // in the presence of '-w', match this behavior bug-for-bug.
4661 if (types::isCXX(InputType) &&
4662 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4663 true)) {
4664 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004665 }
4666
Chandler Carruthe0391482010-05-22 02:21:53 +00004667 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4668 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4669 if (Asm->getOption().matches(options::OPT_fasm))
4670 CmdArgs.push_back("-fgnu-keywords");
4671 else
4672 CmdArgs.push_back("-fno-gnu-keywords");
4673 }
4674
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004675 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4676 CmdArgs.push_back("-fno-dwarf-directory-asm");
4677
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004678 if (ShouldDisableAutolink(Args, getToolChain()))
4679 CmdArgs.push_back("-fno-autolink");
4680
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004681 // Add in -fdebug-compilation-dir if necessary.
4682 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004683
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004684 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4685 StringRef Map = A->getValue();
4686 if (Map.find('=') == StringRef::npos)
4687 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4688 else
4689 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4690 A->claim();
4691 }
4692
Richard Smith9a568822011-11-21 19:36:32 +00004693 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4694 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004695 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004696 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004697 }
4698
Richard Smith79c927b2013-11-06 19:31:51 +00004699 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4700 CmdArgs.push_back("-foperator-arrow-depth");
4701 CmdArgs.push_back(A->getValue());
4702 }
4703
Richard Smith9a568822011-11-21 19:36:32 +00004704 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4705 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004706 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004707 }
4708
Richard Smitha3d3bd22013-05-08 02:12:03 +00004709 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4710 CmdArgs.push_back("-fconstexpr-steps");
4711 CmdArgs.push_back(A->getValue());
4712 }
4713
Richard Smithb3a14522013-02-22 01:59:51 +00004714 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4715 CmdArgs.push_back("-fbracket-depth");
4716 CmdArgs.push_back(A->getValue());
4717 }
4718
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004719 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4720 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004721 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004722 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004723 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4724 } else
4725 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004726 }
4727
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004728 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004729 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004730
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004731 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4732 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004733 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004734 }
David Chisnall5778fce2009-08-31 16:41:57 +00004735
Chris Lattnere23003d2010-01-09 21:54:33 +00004736 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4737 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004738 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004739 }
4740
Chris Lattnerb35583d2010-04-07 20:49:23 +00004741 CmdArgs.push_back("-ferror-limit");
4742 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004743 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004744 else
4745 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004746
Chandler Carrutha77a7272010-05-06 04:55:18 +00004747 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4748 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004749 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004750 }
4751
4752 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4753 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004754 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004755 }
4756
Richard Smithf6f003a2011-12-16 19:06:07 +00004757 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4758 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004759 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004760 }
4761
Nick Lewycky24653262014-12-16 21:39:02 +00004762 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4763 CmdArgs.push_back("-fspell-checking-limit");
4764 CmdArgs.push_back(A->getValue());
4765 }
4766
Daniel Dunbar2c978472009-11-04 06:24:47 +00004767 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004768 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004769 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004770 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004771 } else {
4772 // If -fmessage-length=N was not specified, determine whether this is a
4773 // terminal and, if so, implicitly define -fmessage-length appropriately.
4774 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004775 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004776 }
4777
John McCallb4a99d32013-02-19 01:57:35 +00004778 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4779 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4780 options::OPT_fvisibility_ms_compat)) {
4781 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4782 CmdArgs.push_back("-fvisibility");
4783 CmdArgs.push_back(A->getValue());
4784 } else {
4785 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4786 CmdArgs.push_back("-fvisibility");
4787 CmdArgs.push_back("hidden");
4788 CmdArgs.push_back("-ftype-visibility");
4789 CmdArgs.push_back("default");
4790 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004791 }
4792
Douglas Gregor08329632010-06-15 17:05:35 +00004793 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004794
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004795 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4796
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004797 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004798 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4799 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004800 CmdArgs.push_back("-ffreestanding");
4801
Daniel Dunbare357d562009-12-03 18:42:11 +00004802 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004803 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004804 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004805 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004806 // Emulated TLS is enabled by default on Android, and can be enabled manually
4807 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004808 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004809 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4810 EmulatedTLSDefault))
4811 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004812 // AltiVec-like language extensions aren't relevant for assembling.
4813 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004814 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004815 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4816 }
Richard Trieu91844232012-06-26 18:18:47 +00004817 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4818 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004819
Alexey Bataevdb390212015-05-20 04:24:19 +00004820 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004821 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4822 options::OPT_fno_openmp, false))
4823 switch (getOpenMPRuntime(getToolChain(), Args)) {
4824 case OMPRT_OMP:
4825 case OMPRT_IOMP5:
4826 // Clang can generate useful OpenMP code for these two runtime libraries.
4827 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004828
4829 // If no option regarding the use of TLS in OpenMP codegeneration is
4830 // given, decide a default based on the target. Otherwise rely on the
4831 // options and pass the right information to the frontend.
4832 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004833 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004834 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004835 break;
4836 default:
4837 // By default, if Clang doesn't know how to generate useful OpenMP code
4838 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4839 // down to the actual compilation.
4840 // FIXME: It would be better to have a mode which *only* omits IR
4841 // generation based on the OpenMP support so that we get consistent
4842 // semantic analysis, etc.
4843 break;
4844 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004845
Peter Collingbourne32701642013-11-01 18:16:25 +00004846 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004847 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004848
Eric Christopher459d2712013-02-19 06:16:53 +00004849 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004850 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4851 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4852 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4853 Arch == llvm::Triple::ppc64le))
4854 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4855 << "ppc/ppc64/ppc64le";
4856 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004857
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004858 // -fzvector is incompatible with -faltivec.
4859 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4860 if (Args.hasArg(options::OPT_faltivec))
4861 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4862 << "-faltivec";
4863
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004864 if (getToolChain().SupportsProfiling())
4865 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004866
4867 // -flax-vector-conversions is default.
4868 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4869 options::OPT_fno_lax_vector_conversions))
4870 CmdArgs.push_back("-fno-lax-vector-conversions");
4871
John Brawna7b4ec02015-08-10 11:11:28 +00004872 if (Args.getLastArg(options::OPT_fapple_kext) ||
4873 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004874 CmdArgs.push_back("-fapple-kext");
4875
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004876 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004877 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004878 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004879 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4880 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004881
4882 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4883 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004884 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004885 }
4886
Bob Wilson14adb362012-02-03 06:27:22 +00004887 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004888
Chandler Carruth6e501032011-03-27 00:04:55 +00004889 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4890 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004891 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004892 if (A->getOption().matches(options::OPT_fwrapv))
4893 CmdArgs.push_back("-fwrapv");
4894 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4895 options::OPT_fno_strict_overflow)) {
4896 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4897 CmdArgs.push_back("-fwrapv");
4898 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004899
4900 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4901 options::OPT_fno_reroll_loops))
4902 if (A->getOption().matches(options::OPT_freroll_loops))
4903 CmdArgs.push_back("-freroll-loops");
4904
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004905 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004906 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4907 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004908
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004909 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4910
Daniel Dunbar4930e332009-11-17 08:07:36 +00004911 // -stack-protector=0 is default.
4912 unsigned StackProtectorLevel = 0;
Evgeniy Stepanov368d3072016-04-11 22:27:55 +00004913 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
4914 options::OPT_fstack_protector_all,
4915 options::OPT_fstack_protector_strong,
4916 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004917 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004918 StackProtectorLevel = std::max<unsigned>(
4919 LangOptions::SSPOn,
4920 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004921 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004922 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004923 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004924 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004925 } else {
4926 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004927 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004928 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004929 if (StackProtectorLevel) {
4930 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004931 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004932 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004933
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004934 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004935 for (const Arg *A : Args.filtered(options::OPT__param)) {
4936 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004937 if (Str.startswith("ssp-buffer-size=")) {
4938 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004939 CmdArgs.push_back("-stack-protector-buffer-size");
4940 // FIXME: Verify the argument is a valid integer.
4941 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004942 }
Sean Silva14facf32015-06-09 01:57:17 +00004943 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004944 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004945 }
4946
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004947 // Translate -mstackrealign
4948 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004949 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004950 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004951
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004952 if (Args.hasArg(options::OPT_mstack_alignment)) {
4953 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4954 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004955 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004956
Hans Wennborg77dc2362015-01-20 19:45:50 +00004957 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4958 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4959
4960 if (!Size.empty())
4961 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4962 else
4963 CmdArgs.push_back("-mstack-probe-size=0");
4964 }
4965
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004966 switch (getToolChain().getArch()) {
4967 case llvm::Triple::aarch64:
4968 case llvm::Triple::aarch64_be:
4969 case llvm::Triple::arm:
4970 case llvm::Triple::armeb:
4971 case llvm::Triple::thumb:
4972 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004973 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004974 break;
4975
4976 default:
4977 break;
4978 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004979
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004980 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4981 options::OPT_mno_restrict_it)) {
4982 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4983 CmdArgs.push_back("-backend-option");
4984 CmdArgs.push_back("-arm-restrict-it");
4985 } else {
4986 CmdArgs.push_back("-backend-option");
4987 CmdArgs.push_back("-arm-no-restrict-it");
4988 }
James Y Knight2db38f32015-08-15 03:45:25 +00004989 } else if (Triple.isOSWindows() &&
4990 (Triple.getArch() == llvm::Triple::arm ||
4991 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004992 // Windows on ARM expects restricted IT blocks
4993 CmdArgs.push_back("-backend-option");
4994 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004995 }
4996
Daniel Dunbard18049a2009-04-07 21:16:11 +00004997 // Forward -f options with positive and negative forms; we translate
4998 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004999 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
5000 StringRef fname = A->getValue();
5001 if (!llvm::sys::fs::exists(fname))
5002 D.Diag(diag::err_drv_no_such_file) << fname;
5003 else
5004 A->render(Args, CmdArgs);
5005 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005006
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005007 // -fbuiltin is default unless -mkernel is used.
5008 bool UseBuiltins =
5009 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
5010 !Args.hasArg(options::OPT_mkernel));
5011 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00005012 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00005013
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00005014 // -ffreestanding implies -fno-builtin.
5015 if (Args.hasArg(options::OPT_ffreestanding))
5016 UseBuiltins = false;
5017
5018 // Process the -fno-builtin-* options.
5019 for (const auto &Arg : Args) {
5020 const Option &O = Arg->getOption();
5021 if (!O.matches(options::OPT_fno_builtin_))
5022 continue;
5023
5024 Arg->claim();
5025 // If -fno-builtin is specified, then there's no need to pass the option to
5026 // the frontend.
5027 if (!UseBuiltins)
5028 continue;
5029
5030 StringRef FuncName = Arg->getValue();
5031 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
5032 }
5033
Nuno Lopes13c88c72009-12-16 16:59:22 +00005034 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5035 options::OPT_fno_assume_sane_operator_new))
5036 CmdArgs.push_back("-fno-assume-sane-operator-new");
5037
Daniel Dunbar4930e332009-11-17 08:07:36 +00005038 // -fblocks=0 is default.
5039 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00005040 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005041 (Args.hasArg(options::OPT_fgnu_runtime) &&
5042 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
5043 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00005044 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00005045
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005046 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00005047 !getToolChain().hasBlocksRuntime())
5048 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00005049 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00005050
Richard Smith47972af2015-06-16 00:08:24 +00005051 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00005052 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00005053 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00005054 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00005055 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005056 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
5057 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00005058 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00005059 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00005060 HaveModules = true;
5061 }
5062 }
5063
Richard Smith47972af2015-06-16 00:08:24 +00005064 // -fmodule-maps enables implicit reading of module map files. By default,
5065 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00005066 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
5067 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00005068 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00005069 }
5070
Daniel Jasperac42b752013-10-21 06:34:34 +00005071 // -fmodules-decluse checks that modules used are declared so (off by
5072 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005073 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00005075 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00005076 }
5077
Daniel Jasper962b38e2014-04-11 11:47:45 +00005078 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
5079 // all #included headers are part of modules.
5080 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005081 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00005082 CmdArgs.push_back("-fmodules-strict-decluse");
5083 }
5084
Manuel Klimekd2e8b042015-02-20 11:44:41 +00005085 // -fno-implicit-modules turns off implicitly compiling modules on demand.
5086 if (!Args.hasFlag(options::OPT_fimplicit_modules,
5087 options::OPT_fno_implicit_modules)) {
5088 CmdArgs.push_back("-fno-implicit-modules");
Richard Smith8d83d6d2016-03-21 19:06:06 +00005089 } else if (HaveModules) {
5090 // -fmodule-cache-path specifies where our implicitly-built module files
5091 // should be written.
5092 SmallString<128> Path;
5093 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
5094 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00005095 if (C.isForDiagnostics()) {
5096 // When generating crash reports, we want to emit the modules along with
5097 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00005098 Path = Output.getFilename();
5099 llvm::sys::path::replace_extension(Path, ".cache");
5100 llvm::sys::path::append(Path, "modules");
5101 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00005102 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00005103 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00005104 llvm::sys::path::append(Path, "org.llvm.clang.");
5105 appendUserToPath(Path);
5106 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00005107 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00005108 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00005109 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
5110 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00005111 }
5112
Richard Smith8d83d6d2016-03-21 19:06:06 +00005113 // -fmodule-name specifies the module that is currently being built (or
5114 // used for header checking by -fmodule-maps).
5115 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
5116
5117 // -fmodule-map-file can be used to specify files containing module
5118 // definitions.
5119 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
5120
5121 // -fmodule-file can be used to specify files containing precompiled modules.
5122 if (HaveModules)
5123 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
5124 else
5125 Args.ClaimAllArgs(options::OPT_fmodule_file);
5126
Justin Bognera88f0122014-06-20 22:59:50 +00005127 // When building modules and generating crashdumps, we need to dump a module
5128 // dependency VFS alongside the output.
5129 if (HaveModules && C.isForDiagnostics()) {
5130 SmallString<128> VFSDir(Output.getFilename());
5131 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00005132 // Add the cache directory as a temp so the crash diagnostics pick it up.
5133 C.addTempFile(Args.MakeArgString(VFSDir));
5134
Justin Bognera88f0122014-06-20 22:59:50 +00005135 llvm::sys::path::append(VFSDir, "vfs");
5136 CmdArgs.push_back("-module-dependency-dir");
5137 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00005138 }
5139
Richard Smith9887d792014-10-17 01:42:53 +00005140 if (HaveModules)
5141 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00005142
Douglas Gregor35b04d62013-02-07 19:01:24 +00005143 // Pass through all -fmodules-ignore-macro arguments.
5144 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00005145 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
5146 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00005147
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005148 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5149
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005150 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5151 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5152 D.Diag(diag::err_drv_argument_not_allowed_with)
5153 << A->getAsString(Args) << "-fbuild-session-timestamp";
5154
5155 llvm::sys::fs::file_status Status;
5156 if (llvm::sys::fs::status(A->getValue(), Status))
5157 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005158 CmdArgs.push_back(Args.MakeArgString(
5159 "-fbuild-session-timestamp=" +
5160 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005161 }
5162
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005163 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005164 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5165 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005166 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5167
5168 Args.AddLastArg(CmdArgs,
5169 options::OPT_fmodules_validate_once_per_build_session);
5170 }
5171
Ben Langmuirdcf73862014-03-12 00:06:17 +00005172 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5173
John McCalldfea9982010-04-09 19:12:06 +00005174 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005175 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005176 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005177 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005178
Anders Carlssond470fef2010-11-21 00:09:52 +00005179 // -felide-constructors is the default.
5180 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005181 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005182 CmdArgs.push_back("-fno-elide-constructors");
5183
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005184 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005185
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005186 if (KernelOrKext || (types::isCXX(InputType) &&
5187 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5188 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005189 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005190
Tony Linthicum76329bf2011-12-12 21:14:55 +00005191 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005192 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5193 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005194 CmdArgs.push_back("-fshort-enums");
5195
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005196 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005197 if (Arg *A = Args.getLastArg(
5198 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5199 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5200 if (A->getOption().matches(options::OPT_funsigned_char) ||
5201 A->getOption().matches(options::OPT_fno_signed_char)) {
5202 CmdArgs.push_back("-fno-signed-char");
5203 }
5204 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005205 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005206 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005207
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005208 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005209 if (!Args.hasFlag(
5210 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5211 !IsWindowsCygnus && !IsWindowsGNU &&
5212 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5213 getToolChain().getArch() != llvm::Triple::hexagon &&
5214 getToolChain().getArch() != llvm::Triple::xcore &&
5215 ((getToolChain().getTriple().getVendor() !=
5216 llvm::Triple::MipsTechnologies) ||
5217 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005218 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005219 CmdArgs.push_back("-fno-use-cxa-atexit");
5220
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005221 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005222 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005223 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005224 CmdArgs.push_back("-fms-extensions");
5225
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005226 // -fno-use-line-directives is default.
5227 if (Args.hasFlag(options::OPT_fuse_line_directives,
5228 options::OPT_fno_use_line_directives, false))
5229 CmdArgs.push_back("-fuse-line-directives");
5230
Francois Pichet1b4f1632011-09-17 04:32:15 +00005231 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005232 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005233 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005234 (IsWindowsMSVC &&
5235 Args.hasFlag(options::OPT_fms_extensions,
5236 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005237 CmdArgs.push_back("-fms-compatibility");
5238
David Majnemerc371ff02015-03-22 08:39:22 +00005239 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005240 VersionTuple MSVT = visualstudio::getMSVCVersion(
5241 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5242 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005243 CmdArgs.push_back(
5244 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005245
David Majnemer8db91762015-05-18 04:49:30 +00005246 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5247 if (ImplyVCPPCXXVer) {
5248 if (IsMSVC2015Compatible)
5249 CmdArgs.push_back("-std=c++14");
5250 else
5251 CmdArgs.push_back("-std=c++11");
5252 }
5253
Eric Christopher5ecce122013-02-18 00:38:31 +00005254 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005255 if (Args.hasFlag(options::OPT_fborland_extensions,
5256 options::OPT_fno_borland_extensions, false))
5257 CmdArgs.push_back("-fborland-extensions");
5258
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005259 // -fno-declspec is default, except for PS4.
5260 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5261 getToolChain().getTriple().isPS4()))
5262 CmdArgs.push_back("-fdeclspec");
5263 else if (Args.hasArg(options::OPT_fno_declspec))
5264 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5265
David Majnemerc371ff02015-03-22 08:39:22 +00005266 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5267 // than 19.
5268 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5269 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005270 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005271 CmdArgs.push_back("-fno-threadsafe-statics");
5272
Francois Pichet02744872011-09-01 16:38:08 +00005273 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5274 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005275 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005276 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005277 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005278
Chandler Carruthe03aa552010-04-17 20:17:31 +00005279 // -fgnu-keywords default varies depending on language; only pass if
5280 // specified.
5281 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005282 options::OPT_fno_gnu_keywords))
5283 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005285 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005286 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005287 CmdArgs.push_back("-fgnu89-inline");
5288
Chad Rosier9c76d242012-03-15 22:31:42 +00005289 if (Args.hasArg(options::OPT_fno_inline))
5290 CmdArgs.push_back("-fno-inline");
5291
Chad Rosier64d6be92012-03-06 21:17:19 +00005292 if (Args.hasArg(options::OPT_fno_inline_functions))
5293 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005294
John McCall5fb5df92012-06-20 06:18:46 +00005295 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005296
John McCall5fb5df92012-06-20 06:18:46 +00005297 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005298 // legacy is the default. Except for deployment taget of 10.5,
5299 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5300 // gets ignored silently.
5301 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005302 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5303 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005304 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005305 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005306 if (getToolChain().UseObjCMixedDispatch())
5307 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5308 else
5309 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5310 }
5311 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005312
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005313 // When ObjectiveC legacy runtime is in effect on MacOSX,
5314 // turn on the option to do Array/Dictionary subscripting
5315 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005316 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005317 getToolChain().getTriple().isMacOSX() &&
5318 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5319 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005320 objcRuntime.isNeXTFamily())
5321 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005322
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005323 // -fencode-extended-block-signature=1 is default.
5324 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5325 CmdArgs.push_back("-fencode-extended-block-signature");
5326 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005327
John McCall24fc0de2011-07-06 00:26:06 +00005328 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5329 // NOTE: This logic is duplicated in ToolChains.cpp.
5330 bool ARC = isObjCAutoRefCount(Args);
5331 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005332 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005333
John McCall24fc0de2011-07-06 00:26:06 +00005334 CmdArgs.push_back("-fobjc-arc");
5335
Chandler Carruth491db322011-11-04 07:34:47 +00005336 // FIXME: It seems like this entire block, and several around it should be
5337 // wrapped in isObjC, but for now we just use it here as this is where it
5338 // was being used previously.
5339 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5340 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5341 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5342 else
5343 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5344 }
5345
John McCall24fc0de2011-07-06 00:26:06 +00005346 // Allow the user to enable full exceptions code emission.
5347 // We define off for Objective-CC, on for Objective-C++.
5348 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5349 options::OPT_fno_objc_arc_exceptions,
5350 /*default*/ types::isCXX(InputType)))
5351 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005352
John McCall24fc0de2011-07-06 00:26:06 +00005353 }
5354
5355 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5356 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005357 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005358 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005359
John McCall24fc0de2011-07-06 00:26:06 +00005360 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5361 // takes precedence.
5362 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5363 if (!GCArg)
5364 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5365 if (GCArg) {
5366 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005367 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005368 } else if (getToolChain().SupportsObjCGC()) {
5369 GCArg->render(Args, CmdArgs);
5370 } else {
5371 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005372 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005373 }
5374 }
5375
John McCallfbe5ed72015-11-05 19:19:56 +00005376 // Pass down -fobjc-weak or -fno-objc-weak if present.
5377 if (types::isObjC(InputType)) {
5378 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5379 options::OPT_fno_objc_weak);
5380 if (!WeakArg) {
5381 // nothing to do
5382 } else if (GCArg) {
5383 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5384 D.Diag(diag::err_objc_weak_with_gc);
5385 } else if (!objcRuntime.allowsWeak()) {
5386 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5387 D.Diag(diag::err_objc_weak_unsupported);
5388 } else {
5389 WeakArg->render(Args, CmdArgs);
5390 }
5391 }
5392
Bob Wilsonb111ec92015-03-02 19:01:14 +00005393 if (Args.hasFlag(options::OPT_fapplication_extension,
5394 options::OPT_fno_application_extension, false))
5395 CmdArgs.push_back("-fapplication-extension");
5396
Reid Klecknerc542d372014-06-27 17:02:02 +00005397 // Handle GCC-style exception args.
5398 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005399 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5400 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005401
Tim Northovere931f9f2015-10-30 16:30:41 +00005402 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005403 CmdArgs.push_back("-fsjlj-exceptions");
5404
5405 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005406 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5407 options::OPT_fno_assume_sane_operator_new))
5408 CmdArgs.push_back("-fno-assume-sane-operator-new");
5409
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005410 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5411 // most platforms.
5412 if (Args.hasFlag(options::OPT_fsized_deallocation,
5413 options::OPT_fno_sized_deallocation, false))
5414 CmdArgs.push_back("-fsized-deallocation");
5415
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005416 // -fconstant-cfstrings is default, and may be subject to argument translation
5417 // on Darwin.
5418 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5419 options::OPT_fno_constant_cfstrings) ||
5420 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5421 options::OPT_mno_constant_cfstrings))
5422 CmdArgs.push_back("-fno-constant-cfstrings");
5423
John Thompsoned4e2952009-11-05 20:14:16 +00005424 // -fshort-wchar default varies depending on platform; only
5425 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005426 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5427 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005428 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005429
Hans Wennborg28c96312013-07-31 23:39:13 +00005430 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005431 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005432 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005433 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005434
Daniel Dunbar096ed292011-10-05 21:04:55 +00005435 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5436 // -fno-pack-struct doesn't apply to -fpack-struct=.
5437 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005438 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005439 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005440 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005441 } else if (Args.hasFlag(options::OPT_fpack_struct,
5442 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005443 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005444 }
5445
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005446 // Handle -fmax-type-align=N and -fno-type-align
5447 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5448 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5449 if (!SkipMaxTypeAlign) {
5450 std::string MaxTypeAlignStr = "-fmax-type-align=";
5451 MaxTypeAlignStr += A->getValue();
5452 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5453 }
5454 } else if (getToolChain().getTriple().isOSDarwin()) {
5455 if (!SkipMaxTypeAlign) {
5456 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5457 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5458 }
5459 }
5460
John Brawna7b4ec02015-08-10 11:11:28 +00005461 // -fcommon is the default unless compiling kernel code or the target says so
5462 bool NoCommonDefault =
5463 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5464 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5465 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005466 CmdArgs.push_back("-fno-common");
5467
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005468 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005469 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005470 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005471 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005472 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005473 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005474
Daniel Dunbar6358d682010-10-15 22:30:42 +00005475 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005476 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005477 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005478 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005479
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005480 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005481 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5482 StringRef value = inputCharset->getValue();
5483 if (value != "UTF-8")
5484 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5485 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005486 }
5487
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005488 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005489 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5490 StringRef value = execCharset->getValue();
5491 if (value != "UTF-8")
5492 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5493 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005494 }
5495
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005496 // -fcaret-diagnostics is default.
5497 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5498 options::OPT_fno_caret_diagnostics, true))
5499 CmdArgs.push_back("-fno-caret-diagnostics");
5500
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005501 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005502 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005503 options::OPT_fno_diagnostics_fixit_info))
5504 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005505
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005506 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005507 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005508 options::OPT_fno_diagnostics_show_option))
5509 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005510
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005511 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005512 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005513 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005514 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005515 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005516
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005517 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005518 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005519 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005520 }
5521
Chandler Carruthb6766f02011-03-27 01:50:55 +00005522 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005523 options::OPT_fdiagnostics_show_note_include_stack,
5524 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005525 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005526 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005527 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5528 else
5529 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5530 }
5531
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005532 // Color diagnostics are the default, unless the terminal doesn't support
5533 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005534 // Support both clang's -f[no-]color-diagnostics and gcc's
5535 // -f[no-]diagnostics-colors[=never|always|auto].
5536 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005537 for (const auto &Arg : Args) {
5538 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005539 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5540 !O.matches(options::OPT_fdiagnostics_color) &&
5541 !O.matches(options::OPT_fno_color_diagnostics) &&
5542 !O.matches(options::OPT_fno_diagnostics_color) &&
5543 !O.matches(options::OPT_fdiagnostics_color_EQ))
5544 continue;
5545
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005546 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005547 if (O.matches(options::OPT_fcolor_diagnostics) ||
5548 O.matches(options::OPT_fdiagnostics_color)) {
5549 ShowColors = Colors_On;
5550 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5551 O.matches(options::OPT_fno_diagnostics_color)) {
5552 ShowColors = Colors_Off;
5553 } else {
5554 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005555 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005556 if (value == "always")
5557 ShowColors = Colors_On;
5558 else if (value == "never")
5559 ShowColors = Colors_Off;
5560 else if (value == "auto")
5561 ShowColors = Colors_Auto;
5562 else
5563 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005564 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005565 }
5566 }
5567 if (ShowColors == Colors_On ||
5568 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005569 CmdArgs.push_back("-fcolor-diagnostics");
5570
Nico Rieck7857d462013-09-11 00:38:02 +00005571 if (Args.hasArg(options::OPT_fansi_escape_codes))
5572 CmdArgs.push_back("-fansi-escape-codes");
5573
Daniel Dunbardb097022009-06-08 21:13:54 +00005574 if (!Args.hasFlag(options::OPT_fshow_source_location,
5575 options::OPT_fno_show_source_location))
5576 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005577
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005578 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005579 true))
5580 CmdArgs.push_back("-fno-show-column");
5581
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005582 if (!Args.hasFlag(options::OPT_fspell_checking,
5583 options::OPT_fno_spell_checking))
5584 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005585
Chad Rosierc8e56e82012-12-05 21:08:21 +00005586 // -fno-asm-blocks is default.
5587 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5588 false))
5589 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005590
Steven Wucb0d13f2015-01-16 23:05:28 +00005591 // -fgnu-inline-asm is default.
5592 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5593 options::OPT_fno_gnu_inline_asm, true))
5594 CmdArgs.push_back("-fno-gnu-inline-asm");
5595
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005596 // Enable vectorization per default according to the optimization level
5597 // selected. For optimization levels that want vectorization we use the alias
5598 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005599 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005600 OptSpecifier VectorizeAliasOption =
5601 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005602 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005603 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005604 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005605
Chad Rosier136d67d2014-04-28 19:30:57 +00005606 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005607 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005608 OptSpecifier SLPVectAliasOption =
5609 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005610 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005611 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005612 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005613
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005614 // -fno-slp-vectorize-aggressive is default.
5615 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005616 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005617 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005618
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005619 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5620 A->render(Args, CmdArgs);
5621
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005622 // -fdollars-in-identifiers default varies depending on platform and
5623 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005624 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005625 options::OPT_fno_dollars_in_identifiers)) {
5626 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005627 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005628 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005629 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005630 }
5631
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005632 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5633 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005634 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005635 options::OPT_fno_unit_at_a_time)) {
5636 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005637 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005638 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005639
Eli Friedman055c9702011-11-02 01:53:16 +00005640 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5641 options::OPT_fno_apple_pragma_pack, false))
5642 CmdArgs.push_back("-fapple-pragma-pack");
5643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005644 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005645 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5646 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005647 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005648 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005649 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005651// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5652//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005653// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005654#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005655 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005656 (getToolChain().getArch() == llvm::Triple::arm ||
5657 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005658 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5659 CmdArgs.push_back("-fno-builtin-strcat");
5660 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5661 CmdArgs.push_back("-fno-builtin-strcpy");
5662 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005663#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005664
Justin Bognera88f0122014-06-20 22:59:50 +00005665 // Enable rewrite includes if the user's asked for it or if we're generating
5666 // diagnostics.
5667 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5668 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005669 if (Args.hasFlag(options::OPT_frewrite_includes,
5670 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005671 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005672 CmdArgs.push_back("-frewrite-includes");
5673
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005674 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005675 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005676 options::OPT_traditional_cpp)) {
5677 if (isa<PreprocessJobAction>(JA))
5678 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005679 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005680 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005681 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005682
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005683 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005684 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005685
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005686 // Handle serialized diagnostics.
5687 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5688 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005689 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005690 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005691
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005692 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5693 CmdArgs.push_back("-fretain-comments-from-system-headers");
5694
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005695 // Forward -fcomment-block-commands to -cc1.
5696 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005697 // Forward -fparse-all-comments to -cc1.
5698 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005699
John Brawnad31ace2015-09-23 13:55:40 +00005700 // Turn -fplugin=name.so into -load name.so
5701 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5702 CmdArgs.push_back("-load");
5703 CmdArgs.push_back(A->getValue());
5704 A->claim();
5705 }
5706
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005707 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5708 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005709 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005710 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5711 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005712
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005713 // We translate this by hand to the -cc1 argument, since nightly test uses
5714 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005715 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005716 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005717 } else
Sean Silva14facf32015-06-09 01:57:17 +00005718 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005719 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005720
Bob Wilson23a55f12014-12-21 07:00:00 +00005721 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005722 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5723 // by the frontend.
5724 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5725 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005726
Daniel Dunbard67a3222009-03-30 06:36:42 +00005727 if (Output.getType() == types::TY_Dependencies) {
5728 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005729 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005730 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005731 CmdArgs.push_back(Output.getFilename());
5732 } else {
5733 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005734 }
5735
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005736 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005737
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005738 if (Input.isFilename())
5739 CmdArgs.push_back(Input.getFilename());
5740 else
5741 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005742
Chris Lattnere9d7d782009-11-03 19:50:27 +00005743 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5744
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005745 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005746
5747 // Optionally embed the -cc1 level arguments into the debug info, for build
5748 // analysis.
5749 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005750 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005751 for (const auto &Arg : Args)
5752 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005753
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005754 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005755 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005756 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005757 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005758 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005759 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005760 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005761 }
5762 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005763 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005764 }
5765
Eric Christopherd3804002013-02-22 20:12:52 +00005766 // Add the split debug info name to the command lines here so we
5767 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005768 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005769 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5770 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005771 const char *SplitDwarfOut;
5772 if (SplitDwarf) {
5773 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005774 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005775 CmdArgs.push_back(SplitDwarfOut);
5776 }
5777
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005778 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5779 // Include them with -fcuda-include-gpubinary.
5780 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005781 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005782 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005783 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005784 }
5785
Eric Christopherd3804002013-02-22 20:12:52 +00005786 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005787 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005788 Output.getType() == types::TY_Object &&
5789 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005790 auto CLCommand =
5791 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005792 C.addCommand(llvm::make_unique<FallbackCommand>(
5793 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Nico Weber2ca4be92016-03-01 23:16:44 +00005794 } else if (Args.hasArg(options::OPT__SLASH_fallback) &&
5795 isa<PrecompileJobAction>(JA)) {
5796 // In /fallback builds, run the main compilation even if the pch generation
5797 // fails, so that the main compilation's fallback to cl.exe runs.
5798 C.addCommand(llvm::make_unique<ForceSuccessCommand>(JA, *this, Exec,
5799 CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005800 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005801 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005802 }
5803
Eric Christopherf1545832013-02-22 23:50:16 +00005804 // Handle the debug info splitting at object creation time if we're
5805 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005806 // TODO: Currently only works on linux with newer objcopy.
Eric Christopher0945a642016-03-24 00:34:02 +00005807 if (SplitDwarf && Output.getType() == types::TY_Object)
Eric Christopherd3804002013-02-22 20:12:52 +00005808 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005809
Roman Divacky178e01602011-02-10 16:52:03 +00005810 if (Arg *A = Args.getLastArg(options::OPT_pg))
5811 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005812 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5813 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005814
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005815 // Claim some arguments which clang supports automatically.
5816
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005817 // -fpch-preprocess is used with gcc to add a special marker in the output to
5818 // include the PCH file. Clang's PTH solution is completely transparent, so we
5819 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005820 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005821
Daniel Dunbar17731772009-03-23 19:03:36 +00005822 // Claim some arguments which clang doesn't support, but we don't
5823 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005824 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5825 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005826
Rafael Espindolab0092d72013-09-04 19:37:35 +00005827 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005828 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005829}
5830
John McCall5fb5df92012-06-20 06:18:46 +00005831/// Add options related to the Objective-C runtime/ABI.
5832///
5833/// Returns true if the runtime is non-fragile.
5834ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5835 ArgStringList &cmdArgs,
5836 RewriteKind rewriteKind) const {
5837 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005838 Arg *runtimeArg =
5839 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5840 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005841
5842 // Just forward -fobjc-runtime= to the frontend. This supercedes
5843 // options about fragility.
5844 if (runtimeArg &&
5845 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5846 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005847 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005848 if (runtime.tryParse(value)) {
5849 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005850 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005851 }
5852
5853 runtimeArg->render(args, cmdArgs);
5854 return runtime;
5855 }
5856
5857 // Otherwise, we'll need the ABI "version". Version numbers are
5858 // slightly confusing for historical reasons:
5859 // 1 - Traditional "fragile" ABI
5860 // 2 - Non-fragile ABI, version 1
5861 // 3 - Non-fragile ABI, version 2
5862 unsigned objcABIVersion = 1;
5863 // If -fobjc-abi-version= is present, use that to set the version.
5864 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005865 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005866 if (value == "1")
5867 objcABIVersion = 1;
5868 else if (value == "2")
5869 objcABIVersion = 2;
5870 else if (value == "3")
5871 objcABIVersion = 3;
5872 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005873 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005874 } else {
5875 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005876 bool nonFragileABIIsDefault =
5877 (rewriteKind == RK_NonFragile ||
5878 (rewriteKind == RK_None &&
5879 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005880 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5881 options::OPT_fno_objc_nonfragile_abi,
5882 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005883// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005884#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5885 unsigned nonFragileABIVersion = 1;
5886#else
5887 unsigned nonFragileABIVersion = 2;
5888#endif
5889
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005890 if (Arg *abiArg =
5891 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005892 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005893 if (value == "1")
5894 nonFragileABIVersion = 1;
5895 else if (value == "2")
5896 nonFragileABIVersion = 2;
5897 else
5898 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005899 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005900 }
5901
5902 objcABIVersion = 1 + nonFragileABIVersion;
5903 } else {
5904 objcABIVersion = 1;
5905 }
5906 }
5907
5908 // We don't actually care about the ABI version other than whether
5909 // it's non-fragile.
5910 bool isNonFragile = objcABIVersion != 1;
5911
5912 // If we have no runtime argument, ask the toolchain for its default runtime.
5913 // However, the rewriter only really supports the Mac runtime, so assume that.
5914 ObjCRuntime runtime;
5915 if (!runtimeArg) {
5916 switch (rewriteKind) {
5917 case RK_None:
5918 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5919 break;
5920 case RK_Fragile:
5921 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5922 break;
5923 case RK_NonFragile:
5924 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5925 break;
5926 }
5927
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005928 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005929 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5930 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005931 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005932 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5933
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005934 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005935 } else {
5936 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5937 }
5938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005939 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005940 } else {
5941 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005942 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005943 // non-fragile mode or the GCC runtime in fragile mode.
5944 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005945 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005946 else
5947 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005948 }
5949
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005950 cmdArgs.push_back(
5951 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005952 return runtime;
5953}
5954
Reid Klecknerc542d372014-06-27 17:02:02 +00005955static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5956 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5957 I += HaveDash;
5958 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005959}
Reid Klecknerc542d372014-06-27 17:02:02 +00005960
Benjamin Kramere003ca22015-10-28 13:54:16 +00005961namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005962struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005963 bool Synch = false;
5964 bool Asynch = false;
5965 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005966};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005967} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005968
5969/// /EH controls whether to run destructor cleanups when exceptions are
5970/// thrown. There are three modifiers:
5971/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5972/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5973/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005974/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005975/// The default is /EHs-c-, meaning cleanups are disabled.
5976static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5977 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005978
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005979 std::vector<std::string> EHArgs =
5980 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005981 for (auto EHVal : EHArgs) {
5982 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5983 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005984 case 'a':
5985 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005986 if (EH.Asynch)
5987 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005988 continue;
5989 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005990 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005991 continue;
5992 case 's':
5993 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005994 if (EH.Synch)
5995 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005996 continue;
5997 default:
5998 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005999 }
6000 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
6001 break;
6002 }
6003 }
David Majnemerb8809092016-02-20 09:23:44 +00006004 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00006005 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00006006 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00006007 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
6008 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00006009 EH.Synch = true;
6010 EH.NoUnwindC = true;
6011 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00006012
Reid Klecknerc542d372014-06-27 17:02:02 +00006013 return EH;
6014}
6015
David Majnemercd5855e2016-02-29 01:40:36 +00006016void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
6017 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006018 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00006019 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00006020 unsigned RTOptionID = options::OPT__SLASH_MT;
6021
Hans Wennborgf1a74252013-09-10 20:18:04 +00006022 if (Args.hasArg(options::OPT__SLASH_LDd))
6023 // The /LDd option implies /MTd. The dependent lib part can be overridden,
6024 // but defining _DEBUG is sticky.
6025 RTOptionID = options::OPT__SLASH_MTd;
6026
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00006027 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00006028 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00006029
David Majnemere2afb472015-07-24 06:49:13 +00006030 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006031 switch (RTOptionID) {
6032 case options::OPT__SLASH_MD:
6033 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006034 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006035 CmdArgs.push_back("-D_MT");
6036 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006037 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006038 break;
6039 case options::OPT__SLASH_MDd:
6040 CmdArgs.push_back("-D_DEBUG");
6041 CmdArgs.push_back("-D_MT");
6042 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00006043 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006044 break;
6045 case options::OPT__SLASH_MT:
6046 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00006047 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006048 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006049 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006050 break;
6051 case options::OPT__SLASH_MTd:
6052 CmdArgs.push_back("-D_DEBUG");
6053 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00006054 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006055 break;
6056 default:
6057 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00006058 }
6059
David Majnemere2afb472015-07-24 06:49:13 +00006060 if (Args.hasArg(options::OPT__SLASH_Zl)) {
6061 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
6062 } else {
6063 CmdArgs.push_back(FlagForCRT.data());
6064
6065 // This provides POSIX compatibility (maps 'open' to '_open'), which most
6066 // users want. The /Za flag to cl.exe turns this off, but it's not
6067 // implemented in clang.
6068 CmdArgs.push_back("--dependent-lib=oldnames");
6069 }
Hans Wennborg614f7072013-08-08 19:54:30 +00006070
Hans Wennborg8858a032014-07-21 23:42:07 +00006071 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
6072 // would produce interleaved output, so ignore /showIncludes in such cases.
6073 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
6074 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
6075 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00006076
David Majnemerf6072342014-07-01 22:24:56 +00006077 // This controls whether or not we emit RTTI data for polymorphic types.
6078 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
6079 /*default=*/false))
6080 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00006081
Reid Kleckner124955a2015-08-05 18:51:13 +00006082 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00006083 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00006084 if (*EmitCodeView)
6085 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00006086 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00006087 CmdArgs.push_back("-gcodeview");
6088
Reid Klecknerc542d372014-06-27 17:02:02 +00006089 const Driver &D = getToolChain().getDriver();
6090 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006091 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00006092 if (types::isCXX(InputType))
6093 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00006094 CmdArgs.push_back("-fexceptions");
6095 }
David Majnemercd5855e2016-02-29 01:40:36 +00006096 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
6097 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00006098
Hans Wennborge50cec32014-06-13 20:59:54 +00006099 // /EP should expand to -E -P.
6100 if (Args.hasArg(options::OPT__SLASH_EP)) {
6101 CmdArgs.push_back("-E");
6102 CmdArgs.push_back("-P");
6103 }
6104
David Majnemera5b195a2015-02-14 01:35:12 +00006105 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006106 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
6107 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00006108 VolatileOptionID = options::OPT__SLASH_volatile_ms;
6109 else
6110 VolatileOptionID = options::OPT__SLASH_volatile_iso;
6111
6112 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
6113 VolatileOptionID = A->getOption().getID();
6114
6115 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
6116 CmdArgs.push_back("-fms-volatile");
6117
David Majnemer86c318f2014-02-11 21:05:00 +00006118 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
6119 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
6120 if (MostGeneralArg && BestCaseArg)
6121 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6122 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
6123
6124 if (MostGeneralArg) {
6125 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
6126 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
6127 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
6128
6129 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
6130 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
6131 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
6132 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
6133 << FirstConflict->getAsString(Args)
6134 << SecondConflict->getAsString(Args);
6135
6136 if (SingleArg)
6137 CmdArgs.push_back("-fms-memptr-rep=single");
6138 else if (MultipleArg)
6139 CmdArgs.push_back("-fms-memptr-rep=multiple");
6140 else
6141 CmdArgs.push_back("-fms-memptr-rep=virtual");
6142 }
6143
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00006144 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
6145 A->render(Args, CmdArgs);
6146
Hans Wennborg81f74482013-09-10 01:07:07 +00006147 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
6148 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00006149 if (Args.hasArg(options::OPT__SLASH_fallback))
6150 CmdArgs.push_back("msvc-fallback");
6151 else
6152 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00006153 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006154}
6155
Douglas Katzman95354292015-06-23 20:42:09 +00006156visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006157 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006158 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006159 return CLFallback.get();
6160}
6161
Daniel Sanders7f933f42015-01-30 17:35:23 +00006162void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6163 ArgStringList &CmdArgs) const {
6164 StringRef CPUName;
6165 StringRef ABIName;
6166 const llvm::Triple &Triple = getToolChain().getTriple();
6167 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6168
6169 CmdArgs.push_back("-target-abi");
6170 CmdArgs.push_back(ABIName.data());
6171}
6172
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006173void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006174 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006175 const ArgList &Args,
6176 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006177 ArgStringList CmdArgs;
6178
6179 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6180 const InputInfo &Input = Inputs[0];
6181
James Y Knight2db38f32015-08-15 03:45:25 +00006182 std::string TripleStr =
6183 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6184 const llvm::Triple Triple(TripleStr);
6185
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006186 // Don't warn about "clang -w -c foo.s"
6187 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006188 // and "clang -emit-llvm -c foo.s"
6189 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006190
Rafael Espindola577637a2015-01-03 00:06:04 +00006191 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006192
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006193 // Invoke ourselves in -cc1as mode.
6194 //
6195 // FIXME: Implement custom jobs for internal actions.
6196 CmdArgs.push_back("-cc1as");
6197
6198 // Add the "effective" target triple.
6199 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006200 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6201
6202 // Set the output mode, we currently only expect to be used as a real
6203 // assembler.
6204 CmdArgs.push_back("-filetype");
6205 CmdArgs.push_back("obj");
6206
Eric Christopher45f2e712012-12-18 00:31:10 +00006207 // Set the main file name, so that debug info works even with
6208 // -save-temps or preprocessed assembly.
6209 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006210 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006211
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006212 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006213 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006214 if (!CPU.empty()) {
6215 CmdArgs.push_back("-target-cpu");
6216 CmdArgs.push_back(Args.MakeArgString(CPU));
6217 }
6218
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006219 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006220 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006221
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006222 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006223 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006224
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006225 // Pass along any -I options so we get proper .include search paths.
6226 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6227
Eric Christopherfc3ee562012-01-10 00:38:01 +00006228 // Determine the original source input.
6229 const Action *SourceAction = &JA;
6230 while (SourceAction->getKind() != Action::InputClass) {
6231 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6232 SourceAction = SourceAction->getInputs()[0];
6233 }
6234
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006235 // Forward -g and handle debug info related flags, assuming we are dealing
6236 // with an actual assembly file.
Douglas Katzman3103f252016-04-19 18:55:53 +00006237 bool WantDebug = false;
6238 unsigned DwarfVersion = 0;
6239 Args.ClaimAllArgs(options::OPT_g_Group);
6240 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
6241 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6242 !A->getOption().matches(options::OPT_ggdb0);
6243 if (WantDebug)
6244 DwarfVersion = DwarfVersionNum(A->getSpelling());
6245 }
6246 if (DwarfVersion == 0)
6247 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
6248
6249 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
6250
Eric Christopherfc3ee562012-01-10 00:38:01 +00006251 if (SourceAction->getType() == types::TY_Asm ||
6252 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3103f252016-04-19 18:55:53 +00006253 // You might think that it would be ok to set DebugInfoKind outside of
6254 // the guard for source type, however there is a test which asserts
6255 // that some assembler invocation receives no -debug-info-kind,
6256 // and it's not clear whether that test is just overly restrictive.
6257 DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo
6258 : codegenoptions::NoDebugInfo);
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006259 // Add the -fdebug-compilation-dir flag if needed.
6260 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006261
6262 // Set the AT_producer to the clang version when using the integrated
6263 // assembler on assembly source files.
6264 CmdArgs.push_back("-dwarf-debug-producer");
Bruno Cardoso Lopesb741e102016-03-30 00:25:57 +00006265 std::string QuotedClangVersion("'" + getClangFullVersion() + "'");
6266 CmdArgs.push_back(Args.MakeArgString(QuotedClangVersion));
Renato Golina74bbc72015-07-22 15:32:36 +00006267
6268 // And pass along -I options
6269 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006270 }
Douglas Katzman3103f252016-04-19 18:55:53 +00006271 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
6272 llvm::DebuggerKind::Default);
Kevin Enderby292dc082011-12-22 19:31:58 +00006273
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006274 // Handle -fPIC et al -- the relocation-model affects the assembler
6275 // for some targets.
6276 llvm::Reloc::Model RelocationModel;
6277 unsigned PICLevel;
6278 bool IsPIE;
6279 std::tie(RelocationModel, PICLevel, IsPIE) =
6280 ParsePICArgs(getToolChain(), Triple, Args);
6281
6282 const char *RMName = RelocationModelName(RelocationModel);
6283 if (RMName) {
6284 CmdArgs.push_back("-mrelocation-model");
6285 CmdArgs.push_back(RMName);
6286 }
6287
Kevin Enderby292dc082011-12-22 19:31:58 +00006288 // Optionally embed the -cc1as level arguments into the debug info, for build
6289 // analysis.
6290 if (getToolChain().UseDwarfDebugFlags()) {
6291 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006292 for (const auto &Arg : Args)
6293 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006294
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006295 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006296 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6297 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006298 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006299 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006300 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006301 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006302 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006303 }
6304 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006305 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006306 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006307
6308 // FIXME: Add -static support, once we have it.
6309
Daniel Sanders7f933f42015-01-30 17:35:23 +00006310 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006311 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006312 default:
6313 break;
6314
6315 case llvm::Triple::mips:
6316 case llvm::Triple::mipsel:
6317 case llvm::Triple::mips64:
6318 case llvm::Triple::mips64el:
6319 AddMIPSTargetArgs(Args, CmdArgs);
6320 break;
6321 }
6322
David Blaikie372d9502014-01-17 03:17:40 +00006323 // Consume all the warning flags. Usually this would be handled more
6324 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6325 // doesn't handle that so rather than warning about unused flags that are
6326 // actually used, we'll lie by omission instead.
6327 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006328 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006329
David Blaikie9260ed62013-07-25 21:19:01 +00006330 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6331 getToolChain().getDriver());
6332
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006333 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006334
6335 assert(Output.isFilename() && "Unexpected lipo output.");
6336 CmdArgs.push_back("-o");
6337 CmdArgs.push_back(Output.getFilename());
6338
Daniel Dunbarb440f562010-08-02 02:38:21 +00006339 assert(Input.isFilename() && "Invalid input.");
6340 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006341
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006342 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006343 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006344
6345 // Handle the debug info splitting at object creation time if we're
6346 // creating an object.
6347 // TODO: Currently only works on linux with newer objcopy.
6348 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006349 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006350 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006351 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006352}
6353
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006354void GnuTool::anchor() {}
6355
Daniel Dunbara3246a02009-03-18 08:07:30 +00006356void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006357 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006358 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006359 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006360 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006361 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006362
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006363 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006364 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006365 // It is unfortunate that we have to claim here, as this means
6366 // we will basically never report anything interesting for
6367 // platforms using a generic gcc, even if we are just using gcc
6368 // to get to the assembler.
6369 A->claim();
6370
Daniel Dunbar939c1212010-08-03 16:14:14 +00006371 // Don't forward any -g arguments to assembly steps.
6372 if (isa<AssembleJobAction>(JA) &&
6373 A->getOption().matches(options::OPT_g_Group))
6374 continue;
6375
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006376 // Don't forward any -W arguments to assembly and link steps.
6377 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6378 A->getOption().matches(options::OPT_W_Group))
6379 continue;
6380
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006381 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006382 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006383 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006384
Daniel Dunbar4e295052010-01-25 22:35:08 +00006385 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006386
6387 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006388 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006389 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006390 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006391 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006392 }
6393
Daniel Dunbar5716d872009-05-02 21:41:52 +00006394 // Try to force gcc to match the tool chain we want, if we recognize
6395 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006396 //
6397 // FIXME: The triple class should directly provide the information we want
6398 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006399 switch (getToolChain().getArch()) {
6400 default:
6401 break;
6402 case llvm::Triple::x86:
6403 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006404 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006405 break;
6406 case llvm::Triple::x86_64:
6407 case llvm::Triple::ppc64:
6408 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006409 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006410 break;
6411 case llvm::Triple::sparcel:
6412 CmdArgs.push_back("-EL");
6413 break;
6414 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006415
Daniel Dunbarb440f562010-08-02 02:38:21 +00006416 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006417 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006418 CmdArgs.push_back(Output.getFilename());
6419 } else {
6420 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006421 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006422 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006423
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006424 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006425
6426 // Only pass -x if gcc will understand it; otherwise hope gcc
6427 // understands the suffix correctly. The main use case this would go
6428 // wrong in is for linker inputs if they happened to have an odd
6429 // suffix; really the only way to get this to happen is a command
6430 // like '-x foobar a.c' which will treat a.c like a linker input.
6431 //
6432 // FIXME: For the linker case specifically, can we safely convert
6433 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006434 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006435 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006436 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006437 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006438 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006439 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006440 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006441 else if (II.getType() == types::TY_ModuleFile)
6442 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006443 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006444
Daniel Dunbara3246a02009-03-18 08:07:30 +00006445 if (types::canTypeBeUserSpecified(II.getType())) {
6446 CmdArgs.push_back("-x");
6447 CmdArgs.push_back(types::getTypeName(II.getType()));
6448 }
6449
Daniel Dunbarb440f562010-08-02 02:38:21 +00006450 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006451 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006452 else {
6453 const Arg &A = II.getInputArg();
6454
6455 // Reverse translate some rewritten options.
6456 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6457 CmdArgs.push_back("-lstdc++");
6458 continue;
6459 }
6460
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006461 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006462 A.render(Args, CmdArgs);
6463 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006464 }
6465
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006466 const std::string customGCCName = D.getCCCGenericGCCName();
6467 const char *GCCName;
6468 if (!customGCCName.empty())
6469 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006470 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006471 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006472 } else
6473 GCCName = "gcc";
6474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006475 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006476 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006477}
6478
Douglas Katzman95354292015-06-23 20:42:09 +00006479void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6480 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006481 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006482}
6483
Douglas Katzman95354292015-06-23 20:42:09 +00006484void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6485 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006486 const Driver &D = getToolChain().getDriver();
6487
Eric Christophercc7ff502015-01-29 00:56:17 +00006488 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006489 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006490 case types::TY_LLVM_IR:
6491 case types::TY_LTO_IR:
6492 case types::TY_LLVM_BC:
6493 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006494 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006495 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006496 // We assume we've got an "integrated" assembler in that gcc will produce an
6497 // object file itself.
6498 case types::TY_Object:
6499 CmdArgs.push_back("-c");
6500 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006501 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006502 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006503 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006504 case types::TY_Nothing:
6505 CmdArgs.push_back("-fsyntax-only");
6506 break;
6507 default:
6508 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006509 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006510}
6511
Douglas Katzman95354292015-06-23 20:42:09 +00006512void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6513 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006514 // The types are (hopefully) good enough.
6515}
6516
Tony Linthicum76329bf2011-12-12 21:14:55 +00006517// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006518void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006519 ArgStringList &CmdArgs) const {
6520}
6521
Douglas Katzman95354292015-06-23 20:42:09 +00006522void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6523 const InputInfo &Output,
6524 const InputInfoList &Inputs,
6525 const ArgList &Args,
6526 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006527 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006528
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006529 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6530 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006531 ArgStringList CmdArgs;
6532
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533 std::string MArchString = "-march=hexagon";
6534 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006535
6536 RenderExtraToolArgs(JA, CmdArgs);
6537
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006538 std::string AsName = "hexagon-llvm-mc";
6539 std::string MCpuString = "-mcpu=hexagon" +
6540 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6541 CmdArgs.push_back("-filetype=obj");
6542 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6543
Tony Linthicum76329bf2011-12-12 21:14:55 +00006544 if (Output.isFilename()) {
6545 CmdArgs.push_back("-o");
6546 CmdArgs.push_back(Output.getFilename());
6547 } else {
6548 assert(Output.isNothing() && "Unexpected output");
6549 CmdArgs.push_back("-fsyntax-only");
6550 }
6551
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006552 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6553 std::string N = llvm::utostr(G.getValue());
6554 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6555 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006556
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006557 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006558
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559 // Only pass -x if gcc will understand it; otherwise hope gcc
6560 // understands the suffix correctly. The main use case this would go
6561 // wrong in is for linker inputs if they happened to have an odd
6562 // suffix; really the only way to get this to happen is a command
6563 // like '-x foobar a.c' which will treat a.c like a linker input.
6564 //
6565 // FIXME: For the linker case specifically, can we safely convert
6566 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006567 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006568 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006569 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006571 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006572 else if (II.getType() == types::TY_AST)
6573 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006575 else if (II.getType() == types::TY_ModuleFile)
6576 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006578
6579 if (II.isFilename())
6580 CmdArgs.push_back(II.getFilename());
6581 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006582 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006583 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006584 II.getInputArg().render(Args, CmdArgs);
6585 }
6586
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006587 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006588 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006589}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006590
Douglas Katzman95354292015-06-23 20:42:09 +00006591void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6592 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006593}
6594
Douglas Katzman54366072015-07-27 16:53:08 +00006595static void
6596constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006597 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006598 const InputInfo &Output, const InputInfoList &Inputs,
6599 const ArgList &Args, ArgStringList &CmdArgs,
6600 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006601
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006602 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006603
Matthew Curtise689b052012-12-06 15:46:07 +00006604 //----------------------------------------------------------------------------
6605 //
6606 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006607 bool IsStatic = Args.hasArg(options::OPT_static);
6608 bool IsShared = Args.hasArg(options::OPT_shared);
6609 bool IsPIE = Args.hasArg(options::OPT_pie);
6610 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6611 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6612 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6613 bool UseG0 = false;
6614 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006615
Matthew Curtise689b052012-12-06 15:46:07 +00006616 //----------------------------------------------------------------------------
6617 // Silence warnings for various options
6618 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006619 Args.ClaimAllArgs(options::OPT_g_Group);
6620 Args.ClaimAllArgs(options::OPT_emit_llvm);
6621 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6622 // handled somewhere else.
6623 Args.ClaimAllArgs(options::OPT_static_libgcc);
6624
6625 //----------------------------------------------------------------------------
6626 //
6627 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006628 if (Args.hasArg(options::OPT_s))
6629 CmdArgs.push_back("-s");
6630
6631 if (Args.hasArg(options::OPT_r))
6632 CmdArgs.push_back("-r");
6633
6634 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006635 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006636
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006637 CmdArgs.push_back("-march=hexagon");
6638 std::string CpuVer =
6639 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6640 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6641 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006642
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006643 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006644 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006645 // The following should be the default, but doing as hexagon-gcc does.
6646 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006647 }
6648
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006649 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006650 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006651
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006652 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006653 CmdArgs.push_back("-pie");
6654
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006655 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6656 std::string N = llvm::utostr(G.getValue());
6657 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6658 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006659 }
6660
Matthew Curtise689b052012-12-06 15:46:07 +00006661 //----------------------------------------------------------------------------
6662 //
6663 //----------------------------------------------------------------------------
6664 CmdArgs.push_back("-o");
6665 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006666
Matthew Curtise689b052012-12-06 15:46:07 +00006667 //----------------------------------------------------------------------------
6668 // moslib
6669 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006670 std::vector<std::string> OsLibs;
6671 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006672
Sean Silva14facf32015-06-09 01:57:17 +00006673 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6674 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006675 OsLibs.emplace_back(A->getValue());
6676 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006677 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006678 if (OsLibs.empty()) {
6679 OsLibs.push_back("standalone");
6680 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006681 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006682
Matthew Curtise689b052012-12-06 15:46:07 +00006683 //----------------------------------------------------------------------------
6684 // Start Files
6685 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006686 const std::string MCpuSuffix = "/" + CpuVer;
6687 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6688 const std::string RootDir =
6689 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6690 const std::string StartSubDir =
6691 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006692
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006693 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6694 const char *Name) -> std::string {
6695 std::string RelName = SubDir + Name;
6696 std::string P = HTC.GetFilePath(RelName.c_str());
6697 if (llvm::sys::fs::exists(P))
6698 return P;
6699 return RootDir + RelName;
6700 };
6701
6702 if (IncStdLib && IncStartFiles) {
6703 if (!IsShared) {
6704 if (HasStandalone) {
6705 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6706 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006707 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006708 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6709 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006710 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006711 std::string Init = UseShared
6712 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6713 : Find(RootDir, StartSubDir, "/init.o");
6714 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006715 }
6716
6717 //----------------------------------------------------------------------------
6718 // Library Search Paths
6719 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006720 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6721 for (const auto &LibPath : LibPaths)
6722 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006723
6724 //----------------------------------------------------------------------------
6725 //
6726 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006727 Args.AddAllArgs(CmdArgs,
6728 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6729 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006730
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006731 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006732
6733 //----------------------------------------------------------------------------
6734 // Libraries
6735 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006736 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006737 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006738 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006739 CmdArgs.push_back("-lm");
6740 }
6741
6742 CmdArgs.push_back("--start-group");
6743
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006744 if (!IsShared) {
6745 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006746 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006747 CmdArgs.push_back("-lc");
6748 }
6749 CmdArgs.push_back("-lgcc");
6750
6751 CmdArgs.push_back("--end-group");
6752 }
6753
6754 //----------------------------------------------------------------------------
6755 // End files
6756 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006757 if (IncStdLib && IncStartFiles) {
6758 std::string Fini = UseShared
6759 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6760 : Find(RootDir, StartSubDir, "/fini.o");
6761 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006762 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006763}
6764
Douglas Katzman95354292015-06-23 20:42:09 +00006765void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6766 const InputInfo &Output,
6767 const InputInfoList &Inputs,
6768 const ArgList &Args,
6769 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006770 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006771
6772 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006773 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006774 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006775
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006776 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006777 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006778 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006779}
6780// Hexagon tools end.
6781
Tom Stellard8fa33092015-07-18 01:49:05 +00006782void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6783 const InputInfo &Output,
6784 const InputInfoList &Inputs,
6785 const ArgList &Args,
6786 const char *LinkingOutput) const {
6787
6788 std::string Linker = getToolChain().GetProgramPath(getShortName());
6789 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006790 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Tom Stellard8fa33092015-07-18 01:49:05 +00006791 CmdArgs.push_back(Output.getFilename());
6792 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6793 CmdArgs, Inputs));
6794}
6795// AMDGPU tools end.
6796
Dan Gohman52816862015-12-16 23:30:41 +00006797wasm::Linker::Linker(const ToolChain &TC)
6798 : GnuTool("wasm::Linker", "lld", TC) {}
6799
6800bool wasm::Linker::isLinkJob() const {
6801 return true;
6802}
6803
6804bool wasm::Linker::hasIntegratedCPP() const {
6805 return false;
6806}
6807
6808void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6809 const InputInfo &Output,
6810 const InputInfoList &Inputs,
6811 const ArgList &Args,
6812 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006813
6814 const ToolChain &ToolChain = getToolChain();
6815 const Driver &D = ToolChain.getDriver();
6816 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006817 ArgStringList CmdArgs;
6818 CmdArgs.push_back("-flavor");
6819 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006820
6821 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006822 // size is of particular importance. This is significantly facilitated by
6823 // the enabling of -ffunction-sections and -fdata-sections in
6824 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006825 if (areOptimizationsEnabled(Args))
6826 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006827
Dan Gohman57b62c52016-02-22 19:26:15 +00006828 if (Args.hasArg(options::OPT_rdynamic))
6829 CmdArgs.push_back("-export-dynamic");
6830 if (Args.hasArg(options::OPT_s))
6831 CmdArgs.push_back("--strip-all");
6832 if (Args.hasArg(options::OPT_shared))
6833 CmdArgs.push_back("-shared");
6834 if (Args.hasArg(options::OPT_static))
6835 CmdArgs.push_back("-Bstatic");
6836
6837 Args.AddAllArgs(CmdArgs, options::OPT_L);
6838 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6839
6840 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6841 if (Args.hasArg(options::OPT_shared))
6842 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6843 else if (Args.hasArg(options::OPT_pie))
6844 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6845 else
6846 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6847
6848 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6849 }
6850
6851 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6852
6853 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6854 if (D.CCCIsCXX())
6855 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6856
6857 if (Args.hasArg(options::OPT_pthread))
6858 CmdArgs.push_back("-lpthread");
6859
6860 CmdArgs.push_back("-lc");
6861 CmdArgs.push_back("-lcompiler_rt");
6862 }
6863
6864 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6865 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6866
Dan Gohman52816862015-12-16 23:30:41 +00006867 CmdArgs.push_back("-o");
6868 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006869
Dan Gohman52816862015-12-16 23:30:41 +00006870 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6871}
6872
Renato Golin7c542b42015-07-27 23:44:45 +00006873const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006874 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006875 if (!Arch.empty())
6876 MArch = Arch;
6877 else
Bernard Ogden31561762013-12-12 13:27:11 +00006878 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006879 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006880
6881 // Handle -march=native.
6882 if (MArch == "native") {
6883 std::string CPU = llvm::sys::getHostCPUName();
6884 if (CPU != "generic") {
6885 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006886 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006887 // If there is no valid architecture suffix for this CPU we don't know how
6888 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006889 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006890 MArch = "";
6891 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006892 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006893 }
6894 }
6895
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006896 return MArch;
6897}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006898
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006899/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006900StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006901 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006902 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6903 // here means an -march=native that we can't handle, so instead return no CPU.
6904 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006905 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006906
John Brawna95c1a82015-05-08 12:52:18 +00006907 // We need to return an empty string here on invalid MArch values as the
6908 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006909 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006910}
6911
6912/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006913std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006914 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006915 // FIXME: Warn on inconsistent use of -mcpu and -march.
6916 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006917 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006918 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006919 // Handle -mcpu=native.
6920 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006921 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006922 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006923 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006924 }
6925
Renato Goline17c5802015-07-27 23:44:42 +00006926 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006927}
6928
6929/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006930/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006931// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006932StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6933 const llvm::Triple &Triple) {
6934 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006935 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006936 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006937 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006938 if (ArchKind == llvm::ARM::AK_INVALID)
6939 // In case of generic Arch, i.e. "arm",
6940 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006941 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006942 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006943 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6944 // armv7k triple if it's actually been specified via "-arch armv7k".
6945 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006946 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006947 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006948 }
Renato Golin3c007252015-05-28 15:05:53 +00006949 if (ArchKind == llvm::ARM::AK_INVALID)
6950 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006951 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006952}
6953
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006954void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006955 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006956 if (Args.hasArg(options::OPT_r))
6957 return;
6958
John Brawn94fd9632015-05-21 12:19:49 +00006959 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6960 // to generate BE-8 executables.
6961 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6962 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006963}
6964
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006965mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006966 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6967 // was first introduced in Release 3. However, other compilers have
6968 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006969 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6970 .Case("mips1", NanLegacy)
6971 .Case("mips2", NanLegacy)
6972 .Case("mips3", NanLegacy)
6973 .Case("mips4", NanLegacy)
6974 .Case("mips5", NanLegacy)
6975 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006976 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006977 .Case("mips32r3", NanLegacy | Nan2008)
6978 .Case("mips32r5", NanLegacy | Nan2008)
6979 .Case("mips32r6", Nan2008)
6980 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006981 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006982 .Case("mips64r3", NanLegacy | Nan2008)
6983 .Case("mips64r5", NanLegacy | Nan2008)
6984 .Case("mips64r6", Nan2008)
6985 .Default(NanLegacy);
6986}
6987
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006988bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6989 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6990 return A && (A->getValue() == StringRef(Value));
6991}
6992
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006993bool mips::isUCLibc(const ArgList &Args) {
6994 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006995 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006996}
6997
Daniel Sanders2bf13662014-07-10 14:40:57 +00006998bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006999 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
7000 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007001 .Case("2008", true)
7002 .Case("legacy", false)
7003 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007004
7005 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00007006 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007007 .Cases("mips32r6", "mips64r6", true)
7008 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00007009
7010 return false;
7011}
7012
Daniel Sanders379d44b2014-07-16 11:52:23 +00007013bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007014 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00007015 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00007016 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00007017 return false;
7018
7019 if (ABIName != "32")
7020 return false;
7021
Toma Tabacu94ea6862015-06-16 13:54:13 +00007022 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
7023 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007024 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00007025 return false;
7026
Daniel Sanders379d44b2014-07-16 11:52:23 +00007027 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007028 .Cases("mips2", "mips3", "mips4", "mips5", true)
7029 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
7030 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
7031 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00007032}
7033
Toma Tabacu94ea6862015-06-16 13:54:13 +00007034bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
7035 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00007036 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00007037 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
7038
7039 // FPXX shouldn't be used if -msingle-float is present.
7040 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
7041 options::OPT_mdouble_float))
7042 if (A->getOption().matches(options::OPT_msingle_float))
7043 UseFPXX = false;
7044
7045 return UseFPXX;
7046}
7047
Tim Northover157d9112014-01-16 08:48:16 +00007048llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007049 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
7050 // archs which Darwin doesn't use.
7051
7052 // The matching this routine does is fairly pointless, since it is neither the
7053 // complete architecture list, nor a reasonable subset. The problem is that
7054 // historically the driver driver accepts this and also ties its -march=
7055 // handling to the architecture name, so we need to be careful before removing
7056 // support for it.
7057
7058 // This code must be kept in sync with Clang's Darwin specific argument
7059 // translation.
7060
7061 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007062 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
7063 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
7064 .Case("ppc64", llvm::Triple::ppc64)
7065 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
7066 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
7067 llvm::Triple::x86)
7068 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
7069 // This is derived from the driver driver.
7070 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
7071 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
7072 .Cases("armv7s", "xscale", llvm::Triple::arm)
7073 .Case("arm64", llvm::Triple::aarch64)
7074 .Case("r600", llvm::Triple::r600)
7075 .Case("amdgcn", llvm::Triple::amdgcn)
7076 .Case("nvptx", llvm::Triple::nvptx)
7077 .Case("nvptx64", llvm::Triple::nvptx64)
7078 .Case("amdil", llvm::Triple::amdil)
7079 .Case("spir", llvm::Triple::spir)
7080 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00007081}
Tony Linthicum76329bf2011-12-12 21:14:55 +00007082
Tim Northover157d9112014-01-16 08:48:16 +00007083void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007084 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00007085 T.setArch(Arch);
7086
7087 if (Str == "x86_64h")
7088 T.setArchName(Str);
7089 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
7090 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00007091 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00007092 }
7093}
7094
Bob Wilsondecc03e2012-11-23 06:14:39 +00007095const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00007096 const InputInfo &Input) {
7097 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007098}
7099
Bob Wilsondecc03e2012-11-23 06:14:39 +00007100const char *Clang::getBaseInputStem(const ArgList &Args,
7101 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00007102 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007103
Chris Lattner906bb902011-01-16 08:14:11 +00007104 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007105 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007106
7107 return Str;
7108}
7109
Bob Wilsondecc03e2012-11-23 06:14:39 +00007110const char *Clang::getDependencyFileName(const ArgList &Args,
7111 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007112 // FIXME: Think about this more.
7113 std::string Res;
7114
7115 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00007116 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007117 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007118 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00007119 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00007120 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00007121 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00007122}
7123
Douglas Katzman95354292015-06-23 20:42:09 +00007124void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7125 const InputInfo &Output,
7126 const InputInfoList &Inputs,
7127 const ArgList &Args,
7128 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007129 const ToolChain &ToolChain = getToolChain();
7130 const Driver &D = ToolChain.getDriver();
7131 ArgStringList CmdArgs;
7132
7133 // Silence warning for "clang -g foo.o -o foo"
7134 Args.ClaimAllArgs(options::OPT_g_Group);
7135 // and "clang -emit-llvm foo.o -o foo"
7136 Args.ClaimAllArgs(options::OPT_emit_llvm);
7137 // and for "clang -w foo.o -o foo". Other warning options are already
7138 // handled somewhere else.
7139 Args.ClaimAllArgs(options::OPT_w);
7140
7141 if (!D.SysRoot.empty())
7142 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7143
7144 // CloudABI only supports static linkage.
7145 CmdArgs.push_back("-Bstatic");
Ed Schouten506f2952016-04-06 15:37:06 +00007146
7147 // CloudABI uses Position Independent Executables exclusively.
7148 CmdArgs.push_back("-pie");
7149 CmdArgs.push_back("--no-dynamic-linker");
7150 CmdArgs.push_back("-zrelro");
7151
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007152 CmdArgs.push_back("--eh-frame-hdr");
7153 CmdArgs.push_back("--gc-sections");
7154
7155 if (Output.isFilename()) {
7156 CmdArgs.push_back("-o");
7157 CmdArgs.push_back(Output.getFilename());
7158 } else {
7159 assert(Output.isNothing() && "Invalid output.");
7160 }
7161
Douglas Katzman78b37b02015-11-17 20:28:07 +00007162 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007163 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
7164 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
7165 }
7166
7167 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007168 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007169 Args.AddAllArgs(CmdArgs,
7170 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7171 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007172
Teresa Johnson945bc502015-10-15 20:35:53 +00007173 if (D.isUsingLTO())
7174 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007175
7176 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7177
Douglas Katzman78b37b02015-11-17 20:28:07 +00007178 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007179 if (D.CCCIsCXX())
7180 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7181 CmdArgs.push_back("-lc");
7182 CmdArgs.push_back("-lcompiler_rt");
7183 }
7184
Douglas Katzman78b37b02015-11-17 20:28:07 +00007185 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007186 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7187
7188 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007189 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007190}
7191
Douglas Katzman95354292015-06-23 20:42:09 +00007192void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7193 const InputInfo &Output,
7194 const InputInfoList &Inputs,
7195 const ArgList &Args,
7196 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007197 ArgStringList CmdArgs;
7198
7199 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7200 const InputInfo &Input = Inputs[0];
7201
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007202 // Determine the original source input.
7203 const Action *SourceAction = &JA;
7204 while (SourceAction->getKind() != Action::InputClass) {
7205 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7206 SourceAction = SourceAction->getInputs()[0];
7207 }
7208
Eric Christopherf5a8f492015-12-08 00:10:10 +00007209 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007210 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007211 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7212 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007213 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007214 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007215 const llvm::Triple &T(getToolChain().getTriple());
7216 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007217 CmdArgs.push_back("-Q");
7218 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007219
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007220 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007221 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007222 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007223 if (Args.hasArg(options::OPT_gstabs))
7224 CmdArgs.push_back("--gstabs");
7225 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007226 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007227 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007228
Daniel Dunbarbe220842009-03-20 16:06:39 +00007229 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007230 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007231
Daniel Dunbar6d484762010-07-22 01:47:22 +00007232 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007233 if (getToolChain().getArch() == llvm::Triple::x86 ||
7234 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007235 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7236 CmdArgs.push_back("-force_cpusubtype_ALL");
7237
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007238 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007239 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007240 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007241 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007242 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007243 CmdArgs.push_back("-static");
7244
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007245 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007246
7247 assert(Output.isFilename() && "Unexpected lipo output.");
7248 CmdArgs.push_back("-o");
7249 CmdArgs.push_back(Output.getFilename());
7250
Daniel Dunbarb440f562010-08-02 02:38:21 +00007251 assert(Input.isFilename() && "Invalid input.");
7252 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007253
7254 // asm_final spec is empty.
7255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007256 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007257 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007258}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007259
Tim Northover157d9112014-01-16 08:48:16 +00007260void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007261
Tim Northover157d9112014-01-16 08:48:16 +00007262void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7263 ArgStringList &CmdArgs) const {
7264 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007265
Daniel Dunbarc1964212009-03-26 16:23:12 +00007266 // Derived from darwin_arch spec.
7267 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007268 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007269
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007270 // FIXME: Is this needed anymore?
7271 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007272 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007273}
7274
Douglas Katzman95354292015-06-23 20:42:09 +00007275bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007276 // We only need to generate a temp path for LTO if we aren't compiling object
7277 // files. When compiling source files, we run 'dsymutil' after linking. We
7278 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007279 for (const auto &Input : Inputs)
7280 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007281 return true;
7282
7283 return false;
7284}
7285
Douglas Katzman95354292015-06-23 20:42:09 +00007286void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7287 ArgStringList &CmdArgs,
7288 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007289 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007290 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007291
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007292 unsigned Version[5] = {0, 0, 0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007293 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
Bruno Cardoso Lopes8ed5cac2016-03-31 02:45:46 +00007294 if (!Driver::GetReleaseVersion(A->getValue(), Version))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007295 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007296 }
7297
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007298 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007299 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007300 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7301 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007302
Bob Wilson3d27dad2013-08-02 22:25:34 +00007303 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7304 CmdArgs.push_back("-export_dynamic");
7305
Bob Wilsonb111ec92015-03-02 19:01:14 +00007306 // If we are using App Extension restrictions, pass a flag to the linker
7307 // telling it that the compiled code has been audited.
7308 if (Args.hasFlag(options::OPT_fapplication_extension,
7309 options::OPT_fno_application_extension, false))
7310 CmdArgs.push_back("-application_extension");
7311
Teresa Johnson945bc502015-10-15 20:35:53 +00007312 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007313 // If we are using LTO, then automatically create a temporary file path for
7314 // the linker to use, so that it's lifetime will extend past a possible
7315 // dsymutil step.
7316 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7317 const char *TmpPath = C.getArgs().MakeArgString(
7318 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7319 C.addTempFile(TmpPath);
7320 CmdArgs.push_back("-object_path_lto");
7321 CmdArgs.push_back(TmpPath);
7322 }
7323
7324 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7325 // it in clang installed libraries. If not found, the option is not used
7326 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7327 if (Version[0] >= 133) {
7328 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7329 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7330 SmallString<128> LibLTOPath(P);
7331 llvm::sys::path::append(LibLTOPath, "lib");
7332 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7333 if (llvm::sys::fs::exists(LibLTOPath)) {
7334 CmdArgs.push_back("-lto_library");
7335 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7336 } else {
7337 D.Diag(diag::warn_drv_lto_libpath);
7338 }
7339 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007340 }
7341
Daniel Dunbarc1964212009-03-26 16:23:12 +00007342 // Derived from the "link" spec.
7343 Args.AddAllArgs(CmdArgs, options::OPT_static);
7344 if (!Args.hasArg(options::OPT_static))
7345 CmdArgs.push_back("-dynamic");
7346 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7347 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7348 // here. How do we wish to handle such things?
7349 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007350
Daniel Dunbarc1964212009-03-26 16:23:12 +00007351 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007352 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007353 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007354 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007355
7356 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7357 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7358 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7359
7360 Arg *A;
7361 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7362 (A = Args.getLastArg(options::OPT_current__version)) ||
7363 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007364 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7365 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007366
7367 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7368 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7369 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7370 } else {
7371 CmdArgs.push_back("-dylib");
7372
7373 Arg *A;
7374 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7375 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7376 (A = Args.getLastArg(options::OPT_client__name)) ||
7377 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7378 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7379 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007380 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7381 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007382
Daniel Dunbarc1964212009-03-26 16:23:12 +00007383 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7384 "-dylib_compatibility_version");
7385 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7386 "-dylib_current_version");
7387
Tim Northover157d9112014-01-16 08:48:16 +00007388 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007389
7390 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7391 "-dylib_install_name");
7392 }
7393
7394 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7395 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7396 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007397 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007398 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007399 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7400 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7401 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7402 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7403 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7404 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007405 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007406 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7407 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7408 Args.AddAllArgs(CmdArgs, options::OPT_init);
7409
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007410 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007411 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007412
Daniel Dunbarc1964212009-03-26 16:23:12 +00007413 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7414 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7415 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7416 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7417 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007418
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007419 if (const Arg *A =
7420 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7421 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007422 if (A->getOption().matches(options::OPT_fpie) ||
7423 A->getOption().matches(options::OPT_fPIE))
7424 CmdArgs.push_back("-pie");
7425 else
7426 CmdArgs.push_back("-no_pie");
7427 }
Steven Wu574b0f22016-03-01 01:07:58 +00007428 // for embed-bitcode, use -bitcode_bundle in linker command
7429 if (C.getDriver().embedBitcodeEnabled() ||
7430 C.getDriver().embedBitcodeMarkerOnly()) {
7431 // Check if the toolchain supports bitcode build flow.
7432 if (MachOTC.SupportsEmbeddedBitcode())
7433 CmdArgs.push_back("-bitcode_bundle");
7434 else
7435 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
7436 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007437
7438 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7439 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7440 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7441 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7442 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7443 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7444 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7445 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7446 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7447 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7448 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7449 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7450 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7451 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7452 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7453 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007454
Daniel Dunbar84384642011-05-02 21:03:47 +00007455 // Give --sysroot= preference, over the Apple specific behavior to also use
7456 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007457 StringRef sysroot = C.getSysRoot();
7458 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007459 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007460 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007461 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7462 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007463 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007464 }
7465
Daniel Dunbarc1964212009-03-26 16:23:12 +00007466 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7467 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7468 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7469 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7470 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007471 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007472 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7473 Args.AddAllArgs(CmdArgs, options::OPT_y);
7474 Args.AddLastArg(CmdArgs, options::OPT_w);
7475 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7476 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7477 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7478 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7479 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7480 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7481 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7482 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7483 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7484 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7485 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7486 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7487}
7488
Douglas Katzman95354292015-06-23 20:42:09 +00007489void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7490 const InputInfo &Output,
7491 const InputInfoList &Inputs,
7492 const ArgList &Args,
7493 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007494 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007495
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007496 // If the number of arguments surpasses the system limits, we will encode the
7497 // input files in a separate file, shortening the command line. To this end,
7498 // build a list of input file names that can be passed via a file with the
7499 // -filelist linker option.
7500 llvm::opt::ArgStringList InputFileList;
7501
Daniel Dunbarc1964212009-03-26 16:23:12 +00007502 // The logic here is derived from gcc's behavior; most of which
7503 // comes from specs (starting with link_command). Consult gcc for
7504 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007505 ArgStringList CmdArgs;
7506
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007507 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7508 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7509 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007510 for (const auto &Arg : Args)
7511 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007512 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007513 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007514 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007515 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007516 return;
7517 }
7518
Daniel Dunbarc1964212009-03-26 16:23:12 +00007519 // I'm not sure why this particular decomposition exists in gcc, but
7520 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007521 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007522
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007523 // It seems that the 'e' option is completely ignored for dynamic executables
7524 // (the default), and with static executables, the last one wins, as expected.
7525 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7526 options::OPT_Z_Flag, options::OPT_u_Group,
7527 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007528
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007529 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7530 // members of static archive libraries which implement Objective-C classes or
7531 // categories.
7532 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7533 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007534
Daniel Dunbarc1964212009-03-26 16:23:12 +00007535 CmdArgs.push_back("-o");
7536 CmdArgs.push_back(Output.getFilename());
7537
Douglas Katzman78b37b02015-11-17 20:28:07 +00007538 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007539 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007540
Peter Collingbournec4122c12015-06-15 21:08:13 +00007541 // SafeStack requires its own runtime libraries
7542 // These libraries should be linked first, to make sure the
7543 // __safestack_init constructor executes before everything else
7544 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7545 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7546 "libclang_rt.safestack_osx.a",
7547 /*AlwaysLink=*/true);
7548 }
7549
Daniel Dunbarc1964212009-03-26 16:23:12 +00007550 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007551
Douglas Gregor9295df02012-05-15 21:00:27 +00007552 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007553 // Build the input file for -filelist (list of linker input files) in case we
7554 // need it later
7555 for (const auto &II : Inputs) {
7556 if (!II.isFilename()) {
7557 // This is a linker input argument.
7558 // We cannot mix input arguments and file names in a -filelist input, thus
7559 // we prematurely stop our list (remaining files shall be passed as
7560 // arguments).
7561 if (InputFileList.size() > 0)
7562 break;
7563
7564 continue;
7565 }
7566
7567 InputFileList.push_back(II.getFilename());
7568 }
7569
Douglas Katzman78b37b02015-11-17 20:28:07 +00007570 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007571 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7572
Douglas Katzman78b37b02015-11-17 20:28:07 +00007573 if (isObjCRuntimeLinked(Args) &&
7574 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007575 // We use arclite library for both ARC and subscripting support.
7576 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7577
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007578 CmdArgs.push_back("-framework");
7579 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007580 // Link libobj.
7581 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007582 }
John McCall31168b02011-06-15 23:02:42 +00007583
Daniel Dunbarc1964212009-03-26 16:23:12 +00007584 if (LinkingOutput) {
7585 CmdArgs.push_back("-arch_multiple");
7586 CmdArgs.push_back("-final_output");
7587 CmdArgs.push_back(LinkingOutput);
7588 }
7589
Daniel Dunbarc1964212009-03-26 16:23:12 +00007590 if (Args.hasArg(options::OPT_fnested_functions))
7591 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007592
Justin Bognerc7701242015-05-12 05:44:36 +00007593 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7594
Douglas Katzman78b37b02015-11-17 20:28:07 +00007595 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007596 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007597 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007598
Daniel Dunbarc1964212009-03-26 16:23:12 +00007599 // link_ssp spec is empty.
7600
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007601 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007602 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007603 }
7604
Douglas Katzman78b37b02015-11-17 20:28:07 +00007605 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007606 // endfile_spec is empty.
7607 }
7608
7609 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7610 Args.AddAllArgs(CmdArgs, options::OPT_F);
7611
Steven Wu3ffb61b2015-02-06 18:08:29 +00007612 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007613 for (const Arg *A : Args.filtered(options::OPT_iframework))
7614 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007615
Douglas Katzman78b37b02015-11-17 20:28:07 +00007616 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007617 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7618 if (A->getValue() == StringRef("Accelerate")) {
7619 CmdArgs.push_back("-framework");
7620 CmdArgs.push_back("Accelerate");
7621 }
7622 }
7623 }
7624
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007625 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007626 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007627 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007628 Cmd->setInputFileList(std::move(InputFileList));
7629 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007630}
7631
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007632void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007633 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007634 const InputInfoList &Inputs,
7635 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007636 const char *LinkingOutput) const {
7637 ArgStringList CmdArgs;
7638
7639 CmdArgs.push_back("-create");
7640 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007641
7642 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007643 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007644
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007645 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007646 assert(II.isFilename() && "Unexpected lipo input.");
7647 CmdArgs.push_back(II.getFilename());
7648 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007649
7650 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007651 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007652}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007653
Daniel Dunbar88299622010-06-04 18:28:36 +00007654void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007655 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007656 const InputInfoList &Inputs,
7657 const ArgList &Args,
7658 const char *LinkingOutput) const {
7659 ArgStringList CmdArgs;
7660
Daniel Dunbareb86b042011-05-09 17:23:16 +00007661 CmdArgs.push_back("-o");
7662 CmdArgs.push_back(Output.getFilename());
7663
Daniel Dunbar88299622010-06-04 18:28:36 +00007664 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7665 const InputInfo &Input = Inputs[0];
7666 assert(Input.isFilename() && "Unexpected dsymutil input.");
7667 CmdArgs.push_back(Input.getFilename());
7668
Daniel Dunbar88299622010-06-04 18:28:36 +00007669 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007670 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007671 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007672}
7673
Eric Christopher551ef452011-08-23 17:56:55 +00007674void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007675 const InputInfo &Output,
7676 const InputInfoList &Inputs,
7677 const ArgList &Args,
7678 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007679 ArgStringList CmdArgs;
7680 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007681 CmdArgs.push_back("--debug-info");
7682 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007683 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007684
7685 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7686 const InputInfo &Input = Inputs[0];
7687 assert(Input.isFilename() && "Unexpected verify input");
7688
7689 // Grabbing the output of the earlier dsymutil run.
7690 CmdArgs.push_back(Input.getFilename());
7691
7692 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007693 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007694 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007695}
7696
Douglas Katzman95354292015-06-23 20:42:09 +00007697void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007698 const InputInfo &Output,
7699 const InputInfoList &Inputs,
7700 const ArgList &Args,
7701 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007702 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007703 ArgStringList CmdArgs;
7704
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007705 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007706
7707 CmdArgs.push_back("-o");
7708 CmdArgs.push_back(Output.getFilename());
7709
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007710 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007711 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007712
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007713 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007714 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007715}
7716
Douglas Katzman95354292015-06-23 20:42:09 +00007717void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7718 const InputInfo &Output,
7719 const InputInfoList &Inputs,
7720 const ArgList &Args,
7721 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007722 ArgStringList CmdArgs;
7723
David Chisnall272a0712012-02-29 15:06:12 +00007724 // Demangle C++ names in errors
7725 CmdArgs.push_back("-C");
7726
Douglas Katzman78b37b02015-11-17 20:28:07 +00007727 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007728 CmdArgs.push_back("-e");
7729 CmdArgs.push_back("_start");
7730 }
7731
7732 if (Args.hasArg(options::OPT_static)) {
7733 CmdArgs.push_back("-Bstatic");
7734 CmdArgs.push_back("-dn");
7735 } else {
7736 CmdArgs.push_back("-Bdynamic");
7737 if (Args.hasArg(options::OPT_shared)) {
7738 CmdArgs.push_back("-shared");
7739 } else {
7740 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007741 CmdArgs.push_back(
7742 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007743 }
7744 }
7745
7746 if (Output.isFilename()) {
7747 CmdArgs.push_back("-o");
7748 CmdArgs.push_back(Output.getFilename());
7749 } else {
7750 assert(Output.isNothing() && "Invalid output.");
7751 }
7752
Douglas Katzman78b37b02015-11-17 20:28:07 +00007753 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007754 if (!Args.hasArg(options::OPT_shared))
7755 CmdArgs.push_back(
7756 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7757
7758 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7759 CmdArgs.push_back(
7760 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7761 CmdArgs.push_back(
7762 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007763 }
7764
Douglas Katzman6059ef92015-11-17 17:41:23 +00007765 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007766
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007767 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7768 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007769
7770 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7771
Douglas Katzman78b37b02015-11-17 20:28:07 +00007772 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007773 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007774 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007775 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007776 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007777 if (!Args.hasArg(options::OPT_shared)) {
7778 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007779 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007780 }
David Chisnallf571cde2012-02-15 13:39:01 +00007781 }
7782
Douglas Katzman78b37b02015-11-17 20:28:07 +00007783 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007784 CmdArgs.push_back(
7785 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007786 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007787 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007788
Xinliang David Li69306c02015-10-22 06:15:31 +00007789 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007790
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007791 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007792 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007793}
7794
Douglas Katzman95354292015-06-23 20:42:09 +00007795void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7796 const InputInfo &Output,
7797 const InputInfoList &Inputs,
7798 const ArgList &Args,
7799 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007800 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007801 ArgStringList CmdArgs;
7802
Rafael Espindolacc126272014-02-28 01:55:21 +00007803 switch (getToolChain().getArch()) {
7804 case llvm::Triple::x86:
7805 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7806 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007807 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007808 break;
7809
7810 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007811 CmdArgs.push_back("-mppc");
7812 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007813 break;
7814
7815 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007816 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007817 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007818 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7819 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7820 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007821 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007822 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007823
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007824 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007825 CmdArgs.push_back("-64");
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
7832 case llvm::Triple::mips64:
7833 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007834 StringRef CPUName;
7835 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007836 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007837
7838 CmdArgs.push_back("-mabi");
7839 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7840
7841 if (getToolChain().getArch() == llvm::Triple::mips64)
7842 CmdArgs.push_back("-EB");
7843 else
7844 CmdArgs.push_back("-EL");
7845
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007846 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007847 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007848 }
7849
Rafael Espindolacc126272014-02-28 01:55:21 +00007850 default:
7851 break;
7852 }
7853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007854 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007855
7856 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007857 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007858
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007859 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007860 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007861
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007862 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007863 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007864}
7865
Douglas Katzman95354292015-06-23 20:42:09 +00007866void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7867 const InputInfo &Output,
7868 const InputInfoList &Inputs,
7869 const ArgList &Args,
7870 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007871 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007872 ArgStringList CmdArgs;
7873
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007874 // Silence warning for "clang -g foo.o -o foo"
7875 Args.ClaimAllArgs(options::OPT_g_Group);
7876 // and "clang -emit-llvm foo.o -o foo"
7877 Args.ClaimAllArgs(options::OPT_emit_llvm);
7878 // and for "clang -w foo.o -o foo". Other warning options are already
7879 // handled somewhere else.
7880 Args.ClaimAllArgs(options::OPT_w);
7881
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007882 if (getToolChain().getArch() == llvm::Triple::mips64)
7883 CmdArgs.push_back("-EB");
7884 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7885 CmdArgs.push_back("-EL");
7886
Douglas Katzman78b37b02015-11-17 20:28:07 +00007887 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007888 CmdArgs.push_back("-e");
7889 CmdArgs.push_back("__start");
7890 }
7891
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007892 if (Args.hasArg(options::OPT_static)) {
7893 CmdArgs.push_back("-Bstatic");
7894 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007895 if (Args.hasArg(options::OPT_rdynamic))
7896 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007897 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007898 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007899 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007900 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007901 } else {
7902 CmdArgs.push_back("-dynamic-linker");
7903 CmdArgs.push_back("/usr/libexec/ld.so");
7904 }
7905 }
7906
Rafael Espindola044f7832013-06-05 04:28:55 +00007907 if (Args.hasArg(options::OPT_nopie))
7908 CmdArgs.push_back("-nopie");
7909
Daniel Dunbarb440f562010-08-02 02:38:21 +00007910 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007911 CmdArgs.push_back("-o");
7912 CmdArgs.push_back(Output.getFilename());
7913 } else {
7914 assert(Output.isNothing() && "Invalid output.");
7915 }
7916
Douglas Katzman78b37b02015-11-17 20:28:07 +00007917 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007918 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007919 if (Args.hasArg(options::OPT_pg))
7920 CmdArgs.push_back(
7921 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007922 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007923 CmdArgs.push_back(
7924 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7925 CmdArgs.push_back(
7926 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007927 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007928 CmdArgs.push_back(
7929 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007930 }
7931 }
7932
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007933 std::string Triple = getToolChain().getTripleString();
7934 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007935 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007936 CmdArgs.push_back(
7937 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007938
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007939 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7940 options::OPT_e, options::OPT_s, options::OPT_t,
7941 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007942
Daniel Dunbar54423b22010-09-17 00:24:54 +00007943 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007944
Douglas Katzman78b37b02015-11-17 20:28:07 +00007945 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007946 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007947 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007948 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007949 CmdArgs.push_back("-lm_p");
7950 else
7951 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007952 }
7953
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007954 // FIXME: For some reason GCC passes -lgcc before adding
7955 // the default system libraries. Just mimic this for now.
7956 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007957
Eric Christopher17674ec2012-09-13 06:32:34 +00007958 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007959 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7960 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007961 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007962 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007963 }
7964
Chandler Carruth45661652011-12-17 22:32:42 +00007965 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007966 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007967 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007968 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007969 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007970 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007971
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007972 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007973 }
7974
Douglas Katzman78b37b02015-11-17 20:28:07 +00007975 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007976 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007977 CmdArgs.push_back(
7978 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007979 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007980 CmdArgs.push_back(
7981 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007982 }
7983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007984 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007985 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007986}
Ed Schoutene33194b2009-04-02 19:13:12 +00007987
Douglas Katzman95354292015-06-23 20:42:09 +00007988void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7989 const InputInfo &Output,
7990 const InputInfoList &Inputs,
7991 const ArgList &Args,
7992 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007993 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007994 ArgStringList CmdArgs;
7995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007996 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007997
7998 CmdArgs.push_back("-o");
7999 CmdArgs.push_back(Output.getFilename());
8000
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008001 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00008002 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00008003
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008004 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008005 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008006}
8007
Douglas Katzman95354292015-06-23 20:42:09 +00008008void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8009 const InputInfo &Output,
8010 const InputInfoList &Inputs,
8011 const ArgList &Args,
8012 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00008013 const Driver &D = getToolChain().getDriver();
8014 ArgStringList CmdArgs;
8015
Douglas Katzman78b37b02015-11-17 20:28:07 +00008016 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008017 CmdArgs.push_back("-e");
8018 CmdArgs.push_back("__start");
8019 }
8020
8021 if (Args.hasArg(options::OPT_static)) {
8022 CmdArgs.push_back("-Bstatic");
8023 } else {
8024 if (Args.hasArg(options::OPT_rdynamic))
8025 CmdArgs.push_back("-export-dynamic");
8026 CmdArgs.push_back("--eh-frame-hdr");
8027 CmdArgs.push_back("-Bdynamic");
8028 if (Args.hasArg(options::OPT_shared)) {
8029 CmdArgs.push_back("-shared");
8030 } else {
8031 CmdArgs.push_back("-dynamic-linker");
8032 CmdArgs.push_back("/usr/libexec/ld.so");
8033 }
8034 }
8035
8036 if (Output.isFilename()) {
8037 CmdArgs.push_back("-o");
8038 CmdArgs.push_back(Output.getFilename());
8039 } else {
8040 assert(Output.isNothing() && "Invalid output.");
8041 }
8042
Douglas Katzman78b37b02015-11-17 20:28:07 +00008043 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008044 if (!Args.hasArg(options::OPT_shared)) {
8045 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008046 CmdArgs.push_back(
8047 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008048 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008049 CmdArgs.push_back(
8050 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8051 CmdArgs.push_back(
8052 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008053 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008054 CmdArgs.push_back(
8055 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008056 }
8057 }
8058
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008059 Args.AddAllArgs(CmdArgs,
8060 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00008061
8062 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8063
Douglas Katzman78b37b02015-11-17 20:28:07 +00008064 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008065 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008066 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8067 if (Args.hasArg(options::OPT_pg))
8068 CmdArgs.push_back("-lm_p");
8069 else
8070 CmdArgs.push_back("-lm");
8071 }
8072
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008073 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008074 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00008075 CmdArgs.push_back("-lpthread_p");
8076 else
8077 CmdArgs.push_back("-lpthread");
8078 }
8079
Eli Friedman9fa28852012-08-08 23:57:20 +00008080 if (!Args.hasArg(options::OPT_shared)) {
8081 if (Args.hasArg(options::OPT_pg))
8082 CmdArgs.push_back("-lc_p");
8083 else
8084 CmdArgs.push_back("-lc");
8085 }
8086
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008087 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008088 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00008089 case llvm::Triple::arm:
8090 MyArch = "arm";
8091 break;
8092 case llvm::Triple::x86:
8093 MyArch = "i386";
8094 break;
8095 case llvm::Triple::x86_64:
8096 MyArch = "amd64";
8097 break;
8098 default:
8099 llvm_unreachable("Unsupported architecture");
8100 }
8101 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00008102 }
8103
Douglas Katzman78b37b02015-11-17 20:28:07 +00008104 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00008105 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008106 CmdArgs.push_back(
8107 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008108 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008109 CmdArgs.push_back(
8110 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00008111 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00008112
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008113 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008114 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00008115}
8116
Douglas Katzman95354292015-06-23 20:42:09 +00008117void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8118 const InputInfo &Output,
8119 const InputInfoList &Inputs,
8120 const ArgList &Args,
8121 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008122 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008123 ArgStringList CmdArgs;
8124
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008125 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8126 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008127 switch (getToolChain().getArch()) {
8128 default:
8129 break;
8130 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008131 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008132 break;
8133 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00008134 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008135 break;
8136 case llvm::Triple::mips:
8137 case llvm::Triple::mipsel:
8138 case llvm::Triple::mips64:
8139 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008140 StringRef CPUName;
8141 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008142 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00008143
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008144 CmdArgs.push_back("-march");
8145 CmdArgs.push_back(CPUName.data());
8146
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008147 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00008148 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008149
8150 if (getToolChain().getArch() == llvm::Triple::mips ||
8151 getToolChain().getArch() == llvm::Triple::mips64)
8152 CmdArgs.push_back("-EB");
8153 else
8154 CmdArgs.push_back("-EL");
8155
Dimitry Andric46f338c2015-12-27 10:36:44 +00008156 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8157 StringRef v = A->getValue();
8158 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8159 A->claim();
8160 }
8161
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008162 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008163 break;
8164 }
8165 case llvm::Triple::arm:
8166 case llvm::Triple::armeb:
8167 case llvm::Triple::thumb:
8168 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008169 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00008170
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008171 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008172 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008173 else
Renato Golinf4421f72014-02-19 10:44:07 +00008174 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008176 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008177 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008178 case llvm::Triple::GNUEABI:
8179 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008180 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008181 break;
8182
8183 default:
8184 CmdArgs.push_back("-matpcs");
8185 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008186 break;
8187 }
8188 case llvm::Triple::sparc:
8189 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008190 case llvm::Triple::sparcv9: {
8191 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8192 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008193 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008194 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008195 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008196 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008198 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008199
8200 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008201 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008202
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008203 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008204 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008205
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008206 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008207 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008208}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008209
Douglas Katzman95354292015-06-23 20:42:09 +00008210void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8211 const InputInfo &Output,
8212 const InputInfoList &Inputs,
8213 const ArgList &Args,
8214 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008215 const toolchains::FreeBSD &ToolChain =
8216 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008217 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008218 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008219 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008220 !Args.hasArg(options::OPT_shared) &&
8221 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008222 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008223
8224 // Silence warning for "clang -g foo.o -o foo"
8225 Args.ClaimAllArgs(options::OPT_g_Group);
8226 // and "clang -emit-llvm foo.o -o foo"
8227 Args.ClaimAllArgs(options::OPT_emit_llvm);
8228 // and for "clang -w foo.o -o foo". Other warning options are already
8229 // handled somewhere else.
8230 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008231
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008232 if (!D.SysRoot.empty())
8233 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8234
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008235 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008236 CmdArgs.push_back("-pie");
8237
Ed Maste1bc232d2016-04-12 21:11:46 +00008238 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008239 if (Args.hasArg(options::OPT_static)) {
8240 CmdArgs.push_back("-Bstatic");
8241 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008242 if (Args.hasArg(options::OPT_rdynamic))
8243 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008244 if (Args.hasArg(options::OPT_shared)) {
8245 CmdArgs.push_back("-Bshareable");
8246 } else {
8247 CmdArgs.push_back("-dynamic-linker");
8248 CmdArgs.push_back("/libexec/ld-elf.so.1");
8249 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008250 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008251 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8252 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8253 CmdArgs.push_back("--hash-style=both");
8254 }
8255 }
8256 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008257 }
8258
8259 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8260 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008261 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008262 CmdArgs.push_back("-m");
8263 CmdArgs.push_back("elf_i386_fbsd");
8264 }
8265
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008266 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008267 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008268 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008269 }
8270
Dimitry Andric904895f2015-12-27 06:47:09 +00008271 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8272 if (ToolChain.getArch() == llvm::Triple::mips ||
8273 ToolChain.getArch() == llvm::Triple::mipsel ||
8274 ToolChain.getArch() == llvm::Triple::mips64 ||
8275 ToolChain.getArch() == llvm::Triple::mips64el) {
8276 StringRef v = A->getValue();
8277 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8278 A->claim();
8279 }
8280 }
8281
Daniel Dunbarb440f562010-08-02 02:38:21 +00008282 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008283 CmdArgs.push_back("-o");
8284 CmdArgs.push_back(Output.getFilename());
8285 } else {
8286 assert(Output.isNothing() && "Invalid output.");
8287 }
8288
Douglas Katzman78b37b02015-11-17 20:28:07 +00008289 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008290 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008291 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008292 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008293 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008294 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008295 crt1 = "Scrt1.o";
8296 else
8297 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008298 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008299 if (crt1)
8300 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8301
8302 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8303
Craig Topper92fc2df2014-05-17 16:56:41 +00008304 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008305 if (Args.hasArg(options::OPT_static))
8306 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008307 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008308 crtbegin = "crtbeginS.o";
8309 else
8310 crtbegin = "crtbegin.o";
8311
8312 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008313 }
8314
8315 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008316 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008317 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8318 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008319 Args.AddAllArgs(CmdArgs, options::OPT_s);
8320 Args.AddAllArgs(CmdArgs, options::OPT_t);
8321 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8322 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008323
Teresa Johnson945bc502015-10-15 20:35:53 +00008324 if (D.isUsingLTO())
8325 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008326
Alexey Samsonov52550342014-09-15 19:58:40 +00008327 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008328 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008329
Douglas Katzman78b37b02015-11-17 20:28:07 +00008330 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008331 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008332 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008333 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008334 if (Args.hasArg(options::OPT_pg))
8335 CmdArgs.push_back("-lm_p");
8336 else
8337 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008338 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008339 if (NeedsSanitizerDeps)
8340 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008341 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8342 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008343 if (Args.hasArg(options::OPT_pg))
8344 CmdArgs.push_back("-lgcc_p");
8345 else
8346 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008347 if (Args.hasArg(options::OPT_static)) {
8348 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008349 } else if (Args.hasArg(options::OPT_pg)) {
8350 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008351 } else {
8352 CmdArgs.push_back("--as-needed");
8353 CmdArgs.push_back("-lgcc_s");
8354 CmdArgs.push_back("--no-as-needed");
8355 }
8356
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008357 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008358 if (Args.hasArg(options::OPT_pg))
8359 CmdArgs.push_back("-lpthread_p");
8360 else
8361 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008362 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008363
Roman Divacky66f22762011-02-10 16:59:40 +00008364 if (Args.hasArg(options::OPT_pg)) {
8365 if (Args.hasArg(options::OPT_shared))
8366 CmdArgs.push_back("-lc");
8367 else
8368 CmdArgs.push_back("-lc_p");
8369 CmdArgs.push_back("-lgcc_p");
8370 } else {
8371 CmdArgs.push_back("-lc");
8372 CmdArgs.push_back("-lgcc");
8373 }
8374
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008375 if (Args.hasArg(options::OPT_static)) {
8376 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008377 } else if (Args.hasArg(options::OPT_pg)) {
8378 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008379 } else {
8380 CmdArgs.push_back("--as-needed");
8381 CmdArgs.push_back("-lgcc_s");
8382 CmdArgs.push_back("--no-as-needed");
8383 }
8384 }
8385
Douglas Katzman78b37b02015-11-17 20:28:07 +00008386 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008387 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008388 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008389 else
8390 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008391 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008392 }
8393
Xinliang David Li69306c02015-10-22 06:15:31 +00008394 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008395
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008396 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008397 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008398}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008399
Douglas Katzman95354292015-06-23 20:42:09 +00008400void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008401 const InputInfo &Output,
8402 const InputInfoList &Inputs,
8403 const ArgList &Args,
8404 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008405 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008406 ArgStringList CmdArgs;
8407
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008408 // GNU as needs different flags for creating the correct output format
8409 // on architectures with different ABIs or optional feature sets.
8410 switch (getToolChain().getArch()) {
8411 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008412 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008413 break;
8414 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008415 case llvm::Triple::armeb:
8416 case llvm::Triple::thumb:
8417 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008418 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008419 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8420 std::string Arch =
8421 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008422 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008423 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008424 }
8425
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008426 case llvm::Triple::mips:
8427 case llvm::Triple::mipsel:
8428 case llvm::Triple::mips64:
8429 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008430 StringRef CPUName;
8431 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008432 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008433
8434 CmdArgs.push_back("-march");
8435 CmdArgs.push_back(CPUName.data());
8436
8437 CmdArgs.push_back("-mabi");
8438 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8439
8440 if (getToolChain().getArch() == llvm::Triple::mips ||
8441 getToolChain().getArch() == llvm::Triple::mips64)
8442 CmdArgs.push_back("-EB");
8443 else
8444 CmdArgs.push_back("-EL");
8445
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008446 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008447 break;
8448 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008449
8450 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008451 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008452 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008453 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8454 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008455 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008456 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008457 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008458
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008459 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008460 CmdArgs.push_back("-64");
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 Sonnenberger25e18172014-02-19 22:16:19 +00008467 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008468 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008469 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008470
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008471 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008472
8473 CmdArgs.push_back("-o");
8474 CmdArgs.push_back(Output.getFilename());
8475
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008476 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008477 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008478
David Chisnallddbd68f2011-09-27 22:03:18 +00008479 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008480 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008481}
8482
Douglas Katzman95354292015-06-23 20:42:09 +00008483void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8484 const InputInfo &Output,
8485 const InputInfoList &Inputs,
8486 const ArgList &Args,
8487 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008488 const Driver &D = getToolChain().getDriver();
8489 ArgStringList CmdArgs;
8490
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008491 if (!D.SysRoot.empty())
8492 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8493
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008494 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008495 if (Args.hasArg(options::OPT_static)) {
8496 CmdArgs.push_back("-Bstatic");
8497 } else {
8498 if (Args.hasArg(options::OPT_rdynamic))
8499 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008500 if (Args.hasArg(options::OPT_shared)) {
8501 CmdArgs.push_back("-Bshareable");
8502 } else {
8503 CmdArgs.push_back("-dynamic-linker");
8504 CmdArgs.push_back("/libexec/ld.elf_so");
8505 }
8506 }
8507
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008508 // Many NetBSD architectures support more than one ABI.
8509 // Determine the correct emulation for ld.
8510 switch (getToolChain().getArch()) {
8511 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008512 CmdArgs.push_back("-m");
8513 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008514 break;
8515 case llvm::Triple::arm:
8516 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008517 CmdArgs.push_back("-m");
8518 switch (getToolChain().getTriple().getEnvironment()) {
8519 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008520 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008521 CmdArgs.push_back("armelf_nbsd_eabi");
8522 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008523 case llvm::Triple::EABIHF:
8524 case llvm::Triple::GNUEABIHF:
8525 CmdArgs.push_back("armelf_nbsd_eabihf");
8526 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008527 default:
8528 CmdArgs.push_back("armelf_nbsd");
8529 break;
8530 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008531 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008532 case llvm::Triple::armeb:
8533 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008534 arm::appendEBLinkFlags(
8535 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008536 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008537 CmdArgs.push_back("-m");
8538 switch (getToolChain().getTriple().getEnvironment()) {
8539 case llvm::Triple::EABI:
8540 case llvm::Triple::GNUEABI:
8541 CmdArgs.push_back("armelfb_nbsd_eabi");
8542 break;
8543 case llvm::Triple::EABIHF:
8544 case llvm::Triple::GNUEABIHF:
8545 CmdArgs.push_back("armelfb_nbsd_eabihf");
8546 break;
8547 default:
8548 CmdArgs.push_back("armelfb_nbsd");
8549 break;
8550 }
8551 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008552 case llvm::Triple::mips64:
8553 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008554 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008555 CmdArgs.push_back("-m");
8556 if (getToolChain().getArch() == llvm::Triple::mips64)
8557 CmdArgs.push_back("elf32btsmip");
8558 else
8559 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008560 } else if (mips::hasMipsAbiArg(Args, "64")) {
8561 CmdArgs.push_back("-m");
8562 if (getToolChain().getArch() == llvm::Triple::mips64)
8563 CmdArgs.push_back("elf64btsmip");
8564 else
8565 CmdArgs.push_back("elf64ltsmip");
8566 }
8567 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008568 case llvm::Triple::ppc:
8569 CmdArgs.push_back("-m");
8570 CmdArgs.push_back("elf32ppc_nbsd");
8571 break;
8572
8573 case llvm::Triple::ppc64:
8574 case llvm::Triple::ppc64le:
8575 CmdArgs.push_back("-m");
8576 CmdArgs.push_back("elf64ppc");
8577 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008578
8579 case llvm::Triple::sparc:
8580 CmdArgs.push_back("-m");
8581 CmdArgs.push_back("elf32_sparc");
8582 break;
8583
8584 case llvm::Triple::sparcv9:
8585 CmdArgs.push_back("-m");
8586 CmdArgs.push_back("elf64_sparc");
8587 break;
8588
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008589 default:
8590 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008591 }
8592
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008593 if (Output.isFilename()) {
8594 CmdArgs.push_back("-o");
8595 CmdArgs.push_back(Output.getFilename());
8596 } else {
8597 assert(Output.isNothing() && "Invalid output.");
8598 }
8599
Douglas Katzman78b37b02015-11-17 20:28:07 +00008600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008601 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008602 CmdArgs.push_back(
8603 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8604 CmdArgs.push_back(
8605 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8606 CmdArgs.push_back(
8607 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008608 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008609 CmdArgs.push_back(
8610 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8611 CmdArgs.push_back(
8612 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008613 }
8614 }
8615
8616 Args.AddAllArgs(CmdArgs, options::OPT_L);
8617 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8618 Args.AddAllArgs(CmdArgs, options::OPT_e);
8619 Args.AddAllArgs(CmdArgs, options::OPT_s);
8620 Args.AddAllArgs(CmdArgs, options::OPT_t);
8621 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8622 Args.AddAllArgs(CmdArgs, options::OPT_r);
8623
8624 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8625
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008626 unsigned Major, Minor, Micro;
8627 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8628 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008629 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008630 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008631 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008632 case llvm::Triple::arm:
8633 case llvm::Triple::armeb:
8634 case llvm::Triple::thumb:
8635 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008636 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008637 case llvm::Triple::ppc64:
8638 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008639 case llvm::Triple::sparc:
8640 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008641 case llvm::Triple::x86:
8642 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008643 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008644 break;
8645 default:
8646 break;
8647 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008648 }
8649
Douglas Katzman78b37b02015-11-17 20:28:07 +00008650 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008651 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008652 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008653 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8654 CmdArgs.push_back("-lm");
8655 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008656 if (Args.hasArg(options::OPT_pthread))
8657 CmdArgs.push_back("-lpthread");
8658 CmdArgs.push_back("-lc");
8659
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008660 if (useLibgcc) {
8661 if (Args.hasArg(options::OPT_static)) {
8662 // libgcc_eh depends on libc, so resolve as much as possible,
8663 // pull in any new requirements from libc and then get the rest
8664 // of libgcc.
8665 CmdArgs.push_back("-lgcc_eh");
8666 CmdArgs.push_back("-lc");
8667 CmdArgs.push_back("-lgcc");
8668 } else {
8669 CmdArgs.push_back("-lgcc");
8670 CmdArgs.push_back("--as-needed");
8671 CmdArgs.push_back("-lgcc_s");
8672 CmdArgs.push_back("--no-as-needed");
8673 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008674 }
8675 }
8676
Douglas Katzman78b37b02015-11-17 20:28:07 +00008677 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008678 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008679 CmdArgs.push_back(
8680 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008681 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008682 CmdArgs.push_back(
8683 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8684 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008685 }
8686
Xinliang David Li69306c02015-10-22 06:15:31 +00008687 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008688
Logan Chieneb9162f2014-06-26 14:23:45 +00008689 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008691}
8692
Douglas Katzman95354292015-06-23 20:42:09 +00008693void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8694 const InputInfo &Output,
8695 const InputInfoList &Inputs,
8696 const ArgList &Args,
8697 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008698 claimNoWarnArgs(Args);
8699
James Y Knight2db38f32015-08-15 03:45:25 +00008700 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8701 llvm::Triple Triple = llvm::Triple(TripleStr);
8702
Rafael Espindola92b00932010-08-10 00:25:48 +00008703 ArgStringList CmdArgs;
8704
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008705 llvm::Reloc::Model RelocationModel;
8706 unsigned PICLevel;
8707 bool IsPIE;
8708 std::tie(RelocationModel, PICLevel, IsPIE) =
8709 ParsePICArgs(getToolChain(), Triple, Args);
8710
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008711 switch (getToolChain().getArch()) {
8712 default:
8713 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008714 // Add --32/--64 to make sure we get the format we want.
8715 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008716 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008717 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008718 break;
8719 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008720 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8721 CmdArgs.push_back("--x32");
8722 else
8723 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008724 break;
8725 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008726 CmdArgs.push_back("-a32");
8727 CmdArgs.push_back("-mppc");
8728 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008729 break;
8730 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008731 CmdArgs.push_back("-a64");
8732 CmdArgs.push_back("-mppc64");
8733 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008734 break;
8735 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008736 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008737 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008738 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008739 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008740 break;
8741 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008742 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008743 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008744 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8745 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8746 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008747 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008748 }
8749 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008750 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008751 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8752 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8753 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008754 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008755 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008756 case llvm::Triple::arm:
8757 case llvm::Triple::armeb:
8758 case llvm::Triple::thumb:
8759 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008760 const llvm::Triple &Triple2 = getToolChain().getTriple();
8761 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008762 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008763 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008764 break;
8765 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008766 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008767 break;
8768 default:
8769 break;
8770 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008771
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008772 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008773 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8774 case arm::FloatABI::Soft:
8775 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8776 break;
8777 case arm::FloatABI::SoftFP:
8778 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8779 break;
8780 case arm::FloatABI::Hard:
8781 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8782 break;
8783 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008784
8785 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008786
8787 // FIXME: remove krait check when GNU tools support krait cpu
Stephen Hinese3f91e32016-03-04 20:57:22 +00008788 // for now replace it with -mcpu=cortex-a15 to avoid a lower
Ana Pazosdd6068d2013-12-06 22:43:17 +00008789 // march from being picked in the absence of a cpu flag.
8790 Arg *A;
8791 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008792 StringRef(A->getValue()).lower() == "krait")
Stephen Hinese3f91e32016-03-04 20:57:22 +00008793 CmdArgs.push_back("-mcpu=cortex-a15");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008794 else
8795 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008796 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008797 break;
8798 }
8799 case llvm::Triple::mips:
8800 case llvm::Triple::mipsel:
8801 case llvm::Triple::mips64:
8802 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008803 StringRef CPUName;
8804 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008805 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008806 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008807
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008808 CmdArgs.push_back("-march");
8809 CmdArgs.push_back(CPUName.data());
8810
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008811 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008812 CmdArgs.push_back(ABIName.data());
8813
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008814 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8815 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008816 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008817 CmdArgs.push_back("-mno-shared");
8818
Daniel Sanders379d44b2014-07-16 11:52:23 +00008819 // LLVM doesn't support -mplt yet and acts as if it is always given.
8820 // However, -mplt has no effect with the N64 ABI.
8821 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008822
8823 if (getToolChain().getArch() == llvm::Triple::mips ||
8824 getToolChain().getArch() == llvm::Triple::mips64)
8825 CmdArgs.push_back("-EB");
8826 else
8827 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008828
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008829 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8830 if (StringRef(A->getValue()) == "2008")
8831 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8832 }
8833
Daniel Sanders379d44b2014-07-16 11:52:23 +00008834 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8835 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8836 options::OPT_mfp64)) {
8837 A->claim();
8838 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008839 } else if (mips::shouldUseFPXX(
8840 Args, getToolChain().getTriple(), CPUName, ABIName,
8841 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008842 CmdArgs.push_back("-mfpxx");
8843
8844 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8845 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008846 if (Arg *A =
8847 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008848 if (A->getOption().matches(options::OPT_mips16)) {
8849 A->claim();
8850 A->render(Args, CmdArgs);
8851 } else {
8852 A->claim();
8853 CmdArgs.push_back("-no-mips16");
8854 }
8855 }
8856
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008857 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8858 options::OPT_mno_micromips);
8859 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8860 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8861
Simon Atanasyanbd986632013-11-26 11:58:04 +00008862 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8863 // Do not use AddLastArg because not all versions of MIPS assembler
8864 // support -mmsa / -mno-msa options.
8865 if (A->getOption().matches(options::OPT_mmsa))
8866 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8867 }
8868
Daniel Sanders379d44b2014-07-16 11:52:23 +00008869 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8870 options::OPT_msoft_float);
8871
Toma Tabacub36d6102015-06-11 12:13:18 +00008872 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8873 options::OPT_msingle_float);
8874
Daniel Sanders379d44b2014-07-16 11:52:23 +00008875 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8876 options::OPT_mno_odd_spreg);
8877
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008878 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008879 break;
8880 }
8881 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008882 // Always pass an -march option, since our default of z10 is later
8883 // than the GNU assembler's default.
8884 StringRef CPUName = getSystemZTargetCPU(Args);
8885 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008886 break;
8887 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008888 }
8889
Renato Golina74bbc72015-07-22 15:32:36 +00008890 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008891 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008892
8893 CmdArgs.push_back("-o");
8894 CmdArgs.push_back(Output.getFilename());
8895
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008896 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008897 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008898
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008899 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008900 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008901
8902 // Handle the debug info splitting at object creation time if we're
8903 // creating an object.
8904 // TODO: Currently only works on linux with newer objcopy.
8905 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008906 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008907 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008908 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008909}
8910
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008911static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008912 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008913 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008914 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008915 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8916 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008917 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008918 CmdArgs.push_back("-lgcc");
8919
Logan Chien3d3373c2012-11-19 12:04:11 +00008920 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008921 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008922 CmdArgs.push_back("-lgcc");
8923 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008924 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008925 CmdArgs.push_back("--as-needed");
8926 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008927 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008928 CmdArgs.push_back("--no-as-needed");
8929 }
8930
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008931 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008932 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008933 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008934 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008935
8936 // According to Android ABI, we have to link with libdl if we are
8937 // linking with non-static libgcc.
8938 //
8939 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8940 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8941 if (isAndroid && !StaticLibgcc)
8942 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008943}
8944
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008945static std::string getLinuxDynamicLinker(const ArgList &Args,
8946 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008947 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8948
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008949 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008950 if (ToolChain.getTriple().isArch64Bit())
8951 return "/system/bin/linker64";
8952 else
8953 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008954 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8955 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008956 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008957 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008958 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008959 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008960 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008961 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008962 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008963 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008964 return "/lib/ld-linux-armhf.so.3";
8965 else
8966 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008967 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8968 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008969 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008970 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008971 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008972 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008973 return "/lib/ld-linux.so.3";
8974 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8975 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008976 std::string LibDir =
8977 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008978 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008979 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008980 if (mips::isUCLibc(Args))
8981 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008982 else if (!ToolChain.getTriple().hasEnvironment()) {
8983 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8984 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8985 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8986 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008987 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008988
8989 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008990 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008991 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008992 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008993 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8994 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008995 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008996 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008997 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8998 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008999 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009000 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00009001 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009002 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00009003 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009004 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00009005 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
9006 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00009007 else
9008 return "/lib64/ld-linux-x86-64.so.2";
9009}
9010
Renato Golinc4b49242014-02-13 10:01:16 +00009011static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00009012 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00009013 // Make use of compiler-rt if --rtlib option is used
9014 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
9015
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009016 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00009017 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009018 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009019 default:
9020 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009021 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009022 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00009023 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009024 break;
9025 }
Renato Golinc4b49242014-02-13 10:01:16 +00009026 break;
9027 case ToolChain::RLT_Libgcc:
Andrey Turetskiya4868572016-03-14 11:19:43 +00009028 // Make sure libgcc is not used under MSVC environment by default
9029 if (TC.getTriple().isKnownWindowsMSVCEnvironment()) {
9030 // Issue error diagnostic if libgcc is explicitly specified
9031 // through command line as --rtlib option argument.
9032 if (Args.hasArg(options::OPT_rtlib_EQ)) {
9033 TC.getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
9034 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC";
9035 }
9036 } else
9037 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
Renato Golinc4b49242014-02-13 10:01:16 +00009038 break;
Renato Golinc4b49242014-02-13 10:01:16 +00009039 }
9040}
9041
Rafael Espindola1e085772014-08-15 17:14:35 +00009042static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
9043 switch (T.getArch()) {
9044 case llvm::Triple::x86:
9045 return "elf_i386";
9046 case llvm::Triple::aarch64:
9047 return "aarch64linux";
9048 case llvm::Triple::aarch64_be:
9049 return "aarch64_be_linux";
9050 case llvm::Triple::arm:
9051 case llvm::Triple::thumb:
9052 return "armelf_linux_eabi";
9053 case llvm::Triple::armeb:
9054 case llvm::Triple::thumbeb:
9055 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
9056 case llvm::Triple::ppc:
9057 return "elf32ppclinux";
9058 case llvm::Triple::ppc64:
9059 return "elf64ppc";
9060 case llvm::Triple::ppc64le:
9061 return "elf64lppc";
9062 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009063 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00009064 return "elf32_sparc";
9065 case llvm::Triple::sparcv9:
9066 return "elf64_sparc";
9067 case llvm::Triple::mips:
9068 return "elf32btsmip";
9069 case llvm::Triple::mipsel:
9070 return "elf32ltsmip";
9071 case llvm::Triple::mips64:
9072 if (mips::hasMipsAbiArg(Args, "n32"))
9073 return "elf32btsmipn32";
9074 return "elf64btsmip";
9075 case llvm::Triple::mips64el:
9076 if (mips::hasMipsAbiArg(Args, "n32"))
9077 return "elf32ltsmipn32";
9078 return "elf64ltsmip";
9079 case llvm::Triple::systemz:
9080 return "elf64_s390";
9081 case llvm::Triple::x86_64:
9082 if (T.getEnvironment() == llvm::Triple::GNUX32)
9083 return "elf32_x86_64";
9084 return "elf_x86_64";
9085 default:
9086 llvm_unreachable("Unexpected arch");
9087 }
9088}
9089
Douglas Katzman95354292015-06-23 20:42:09 +00009090void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9091 const InputInfo &Output,
9092 const InputInfoList &Inputs,
9093 const ArgList &Args,
9094 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009095 const toolchains::Linux &ToolChain =
9096 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009097 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00009098
9099 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
9100 llvm::Triple Triple = llvm::Triple(TripleStr);
9101
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009102 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00009103 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009104 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009105 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
9106 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009107 const bool HasCRTBeginEndFiles =
9108 ToolChain.getTriple().hasEnvironment() ||
9109 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009110
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009111 ArgStringList CmdArgs;
9112
Rafael Espindolad1002f62010-11-15 18:28:16 +00009113 // Silence warning for "clang -g foo.o -o foo"
9114 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00009115 // and "clang -emit-llvm foo.o -o foo"
9116 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00009117 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00009118 // handled somewhere else.
9119 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00009120
Peter Collingbourne39719a72015-11-20 20:49:39 +00009121 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9122 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009123 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00009124 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009125 CmdArgs.push_back("-target");
9126 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
9127 }
9128
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009129 if (!D.SysRoot.empty())
9130 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009131
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009132 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00009133 CmdArgs.push_back("-pie");
9134
Rafael Espindola1c76c592010-11-07 22:57:16 +00009135 if (Args.hasArg(options::OPT_rdynamic))
9136 CmdArgs.push_back("-export-dynamic");
9137
Rafael Espindola34d77dc2010-11-11 19:34:42 +00009138 if (Args.hasArg(options::OPT_s))
9139 CmdArgs.push_back("-s");
9140
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009141 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00009142 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00009143
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009144 for (const auto &Opt : ToolChain.ExtraOpts)
9145 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009146
9147 if (!Args.hasArg(options::OPT_static)) {
9148 CmdArgs.push_back("--eh-frame-hdr");
9149 }
9150
9151 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00009152 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009153
9154 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009155 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
9156 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009157 CmdArgs.push_back("-Bstatic");
9158 else
9159 CmdArgs.push_back("-static");
9160 } else if (Args.hasArg(options::OPT_shared)) {
9161 CmdArgs.push_back("-shared");
9162 }
9163
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00009164 if (!Args.hasArg(options::OPT_static)) {
9165 if (Args.hasArg(options::OPT_rdynamic))
9166 CmdArgs.push_back("-export-dynamic");
9167
9168 if (!Args.hasArg(options::OPT_shared)) {
9169 const std::string Loader =
9170 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
9171 CmdArgs.push_back("-dynamic-linker");
9172 CmdArgs.push_back(Args.MakeArgString(Loader));
9173 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00009174 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009175
9176 CmdArgs.push_back("-o");
9177 CmdArgs.push_back(Output.getFilename());
9178
Douglas Katzman78b37b02015-11-17 20:28:07 +00009179 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009180 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009181 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009182 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009183 if (Args.hasArg(options::OPT_pg))
9184 crt1 = "gcrt1.o";
9185 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009186 crt1 = "Scrt1.o";
9187 else
9188 crt1 = "crt1.o";
9189 }
9190 if (crt1)
9191 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009192
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009193 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9194 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009195
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009196 const char *crtbegin;
9197 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009198 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009199 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009200 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009201 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009202 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009203 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009204 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009205
9206 if (HasCRTBeginEndFiles)
9207 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009208
9209 // Add crtfastmath.o if available and fast math is enabled.
9210 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009211 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009212
9213 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009214 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009215
Douglas Katzman6059ef92015-11-17 17:41:23 +00009216 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009217
Teresa Johnson945bc502015-10-15 20:35:53 +00009218 if (D.isUsingLTO())
9219 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009220
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009221 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9222 CmdArgs.push_back("--no-demangle");
9223
Alexey Samsonov52550342014-09-15 19:58:40 +00009224 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009225 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009226 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009227 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009228
Douglas Katzman78b37b02015-11-17 20:28:07 +00009229 if (D.CCCIsCXX() &&
9230 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009231 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009232 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009233 if (OnlyLibstdcxxStatic)
9234 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009235 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009236 if (OnlyLibstdcxxStatic)
9237 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009238 CmdArgs.push_back("-lm");
9239 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009240 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9241 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009242
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009243 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009244 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9245 if (Args.hasArg(options::OPT_static))
9246 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009247
Alexey Samsonov52550342014-09-15 19:58:40 +00009248 if (NeedsSanitizerDeps)
9249 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9250
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009251 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9252 Args.hasArg(options::OPT_pthreads);
9253
9254 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9255 options::OPT_fno_openmp, false)) {
9256 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9257 // FIXME: Does this really make sense for all GNU toolchains?
9258 WantPthread = true;
9259
9260 // Also link the particular OpenMP runtimes.
9261 switch (getOpenMPRuntime(ToolChain, Args)) {
9262 case OMPRT_OMP:
9263 CmdArgs.push_back("-lomp");
9264 break;
9265 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009266 CmdArgs.push_back("-lgomp");
9267
9268 // FIXME: Exclude this for platforms with libgomp that don't require
9269 // librt. Most modern Linux platforms require it, but some may not.
9270 CmdArgs.push_back("-lrt");
9271 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009272 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009273 CmdArgs.push_back("-liomp5");
9274 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009275 case OMPRT_Unknown:
9276 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009277 break;
9278 }
Chandler Carruth01538002013-01-17 13:19:29 +00009279 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009280
Renato Golinc4b49242014-02-13 10:01:16 +00009281 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009282
Richard Smith31d1de22015-05-20 22:48:44 +00009283 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009284 CmdArgs.push_back("-lpthread");
9285
Rafael Espindolab17bc532016-01-25 18:29:16 +00009286 if (Args.hasArg(options::OPT_fsplit_stack))
9287 CmdArgs.push_back("--wrap=pthread_create");
9288
Chandler Carruth94a32012012-05-14 18:31:18 +00009289 CmdArgs.push_back("-lc");
9290
9291 if (Args.hasArg(options::OPT_static))
9292 CmdArgs.push_back("--end-group");
9293 else
Renato Golinc4b49242014-02-13 10:01:16 +00009294 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009295 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009296
Rafael Espindola81937ec2010-12-01 01:52:43 +00009297 if (!Args.hasArg(options::OPT_nostartfiles)) {
9298 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009299 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009300 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009301 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009302 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009303 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009304 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009305
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009306 if (HasCRTBeginEndFiles)
9307 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009308 if (!isAndroid)
9309 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009310 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009311 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009312
Peter Collingbourne39719a72015-11-20 20:49:39 +00009313 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009314}
9315
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009316// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9317// for the various SFI requirements like register masking. The assembly tool
9318// inserts the file containing the macros as an input into all the assembly
9319// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009320void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9321 const InputInfo &Output,
9322 const InputInfoList &Inputs,
9323 const ArgList &Args,
9324 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009325 const toolchains::NaClToolChain &ToolChain =
9326 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009327 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009328 "nacl-arm-macros.s");
9329 InputInfoList NewInputs;
9330 NewInputs.push_back(NaClMacros);
9331 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009332 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9333 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009334}
9335
Douglas Katzman750cfc52015-06-29 18:42:16 +00009336// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009337// we use static by default, do not yet support sanitizers or LTO, and a few
9338// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009339// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009340void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9341 const InputInfo &Output,
9342 const InputInfoList &Inputs,
9343 const ArgList &Args,
9344 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009345
Douglas Katzman54366072015-07-27 16:53:08 +00009346 const toolchains::NaClToolChain &ToolChain =
9347 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009348 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009349 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009350 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009351 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009352
9353 ArgStringList CmdArgs;
9354
9355 // Silence warning for "clang -g foo.o -o foo"
9356 Args.ClaimAllArgs(options::OPT_g_Group);
9357 // and "clang -emit-llvm foo.o -o foo"
9358 Args.ClaimAllArgs(options::OPT_emit_llvm);
9359 // and for "clang -w foo.o -o foo". Other warning options are already
9360 // handled somewhere else.
9361 Args.ClaimAllArgs(options::OPT_w);
9362
9363 if (!D.SysRoot.empty())
9364 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9365
9366 if (Args.hasArg(options::OPT_rdynamic))
9367 CmdArgs.push_back("-export-dynamic");
9368
9369 if (Args.hasArg(options::OPT_s))
9370 CmdArgs.push_back("-s");
9371
Douglas Katzman54366072015-07-27 16:53:08 +00009372 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9373 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009374 CmdArgs.push_back("--build-id");
9375
9376 if (!IsStatic)
9377 CmdArgs.push_back("--eh-frame-hdr");
9378
9379 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009380 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009381 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009382 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009383 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009384 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009385 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009386 else if (Arch == llvm::Triple::mipsel)
9387 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009388 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009389 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9390 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009391
9392 if (IsStatic)
9393 CmdArgs.push_back("-static");
9394 else if (Args.hasArg(options::OPT_shared))
9395 CmdArgs.push_back("-shared");
9396
9397 CmdArgs.push_back("-o");
9398 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009399 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009400 if (!Args.hasArg(options::OPT_shared))
9401 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9402 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9403
9404 const char *crtbegin;
9405 if (IsStatic)
9406 crtbegin = "crtbeginT.o";
9407 else if (Args.hasArg(options::OPT_shared))
9408 crtbegin = "crtbeginS.o";
9409 else
9410 crtbegin = "crtbegin.o";
9411 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9412 }
9413
9414 Args.AddAllArgs(CmdArgs, options::OPT_L);
9415 Args.AddAllArgs(CmdArgs, options::OPT_u);
9416
Douglas Katzman6059ef92015-11-17 17:41:23 +00009417 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009418
9419 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9420 CmdArgs.push_back("--no-demangle");
9421
9422 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9423
Douglas Katzman78b37b02015-11-17 20:28:07 +00009424 if (D.CCCIsCXX() &&
9425 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009426 bool OnlyLibstdcxxStatic =
9427 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009428 if (OnlyLibstdcxxStatic)
9429 CmdArgs.push_back("-Bstatic");
9430 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9431 if (OnlyLibstdcxxStatic)
9432 CmdArgs.push_back("-Bdynamic");
9433 CmdArgs.push_back("-lm");
9434 }
9435
9436 if (!Args.hasArg(options::OPT_nostdlib)) {
9437 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9438 // Always use groups, since it has no effect on dynamic libraries.
9439 CmdArgs.push_back("--start-group");
9440 CmdArgs.push_back("-lc");
9441 // NaCl's libc++ currently requires libpthread, so just always include it
9442 // in the group for C++.
9443 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009444 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009445 // Gold, used by Mips, handles nested groups differently than ld, and
9446 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9447 // which is not a desired behaviour here.
9448 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9449 if (getToolChain().getArch() == llvm::Triple::mipsel)
9450 CmdArgs.push_back("-lnacl");
9451
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009452 CmdArgs.push_back("-lpthread");
9453 }
9454
9455 CmdArgs.push_back("-lgcc");
9456 CmdArgs.push_back("--as-needed");
9457 if (IsStatic)
9458 CmdArgs.push_back("-lgcc_eh");
9459 else
9460 CmdArgs.push_back("-lgcc_s");
9461 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009462
9463 // Mips needs to create and use pnacl_legacy library that contains
9464 // definitions from bitcode/pnaclmm.c and definitions for
9465 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9466 if (getToolChain().getArch() == llvm::Triple::mipsel)
9467 CmdArgs.push_back("-lpnacl_legacy");
9468
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009469 CmdArgs.push_back("--end-group");
9470 }
9471
9472 if (!Args.hasArg(options::OPT_nostartfiles)) {
9473 const char *crtend;
9474 if (Args.hasArg(options::OPT_shared))
9475 crtend = "crtendS.o";
9476 else
9477 crtend = "crtend.o";
9478
9479 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9480 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9481 }
9482 }
9483
Peter Collingbourne39719a72015-11-20 20:49:39 +00009484 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9485 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009486}
9487
Douglas Katzman95354292015-06-23 20:42:09 +00009488void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9489 const InputInfo &Output,
9490 const InputInfoList &Inputs,
9491 const ArgList &Args,
9492 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009493 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009494 ArgStringList CmdArgs;
9495
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009496 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009497
9498 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009499 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009500
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009501 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009502 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009503
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009504 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009505 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009506}
9507
Douglas Katzman95354292015-06-23 20:42:09 +00009508void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9509 const InputInfo &Output,
9510 const InputInfoList &Inputs,
9511 const ArgList &Args,
9512 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009513 const Driver &D = getToolChain().getDriver();
9514 ArgStringList CmdArgs;
9515
Daniel Dunbarb440f562010-08-02 02:38:21 +00009516 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009517 CmdArgs.push_back("-o");
9518 CmdArgs.push_back(Output.getFilename());
9519 } else {
9520 assert(Output.isNothing() && "Invalid output.");
9521 }
9522
Douglas Katzman78b37b02015-11-17 20:28:07 +00009523 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009524 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9525 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9526 CmdArgs.push_back(
9527 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9528 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009529 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009530
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009531 Args.AddAllArgs(CmdArgs,
9532 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009533
Daniel Dunbar54423b22010-09-17 00:24:54 +00009534 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009535
Xinliang David Li69306c02015-10-22 06:15:31 +00009536 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009537
Douglas Katzman78b37b02015-11-17 20:28:07 +00009538 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009539 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009540 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009541 CmdArgs.push_back("-lm");
9542 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009543 }
9544
Douglas Katzman78b37b02015-11-17 20:28:07 +00009545 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009546 if (Args.hasArg(options::OPT_pthread))
9547 CmdArgs.push_back("-lpthread");
9548 CmdArgs.push_back("-lc");
9549 CmdArgs.push_back("-lCompilerRT-Generic");
9550 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9551 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009552 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009553 }
9554
Logan Chieneb9162f2014-06-26 14:23:45 +00009555 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009556 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009557}
9558
Daniel Dunbarcc912342009-05-02 18:28:39 +00009559/// DragonFly Tools
9560
9561// For now, DragonFly Assemble does just about the same as for
9562// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009563void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9564 const InputInfo &Output,
9565 const InputInfoList &Inputs,
9566 const ArgList &Args,
9567 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009568 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009569 ArgStringList CmdArgs;
9570
9571 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9572 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009573 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009574 CmdArgs.push_back("--32");
9575
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009576 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009577
9578 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009579 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009580
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009581 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009582 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009583
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009584 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009585 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009586}
9587
Douglas Katzman95354292015-06-23 20:42:09 +00009588void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9589 const InputInfo &Output,
9590 const InputInfoList &Inputs,
9591 const ArgList &Args,
9592 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009593 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009594 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009595
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009596 if (!D.SysRoot.empty())
9597 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9598
John McCall65b8da02013-04-11 22:55:55 +00009599 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009600 if (Args.hasArg(options::OPT_static)) {
9601 CmdArgs.push_back("-Bstatic");
9602 } else {
John McCall65b8da02013-04-11 22:55:55 +00009603 if (Args.hasArg(options::OPT_rdynamic))
9604 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009605 if (Args.hasArg(options::OPT_shared))
9606 CmdArgs.push_back("-Bshareable");
9607 else {
9608 CmdArgs.push_back("-dynamic-linker");
9609 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9610 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009611 CmdArgs.push_back("--hash-style=gnu");
9612 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009613 }
9614
9615 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9616 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009617 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009618 CmdArgs.push_back("-m");
9619 CmdArgs.push_back("elf_i386");
9620 }
9621
Daniel Dunbarb440f562010-08-02 02:38:21 +00009622 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009623 CmdArgs.push_back("-o");
9624 CmdArgs.push_back(Output.getFilename());
9625 } else {
9626 assert(Output.isNothing() && "Invalid output.");
9627 }
9628
Douglas Katzman78b37b02015-11-17 20:28:07 +00009629 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009630 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009631 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009632 CmdArgs.push_back(
9633 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009634 else {
9635 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009636 CmdArgs.push_back(
9637 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009638 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009639 CmdArgs.push_back(
9640 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009641 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009642 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009643 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009644 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009645 CmdArgs.push_back(
9646 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009647 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009648 CmdArgs.push_back(
9649 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009650 }
9651
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009652 Args.AddAllArgs(CmdArgs,
9653 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009654
Daniel Dunbar54423b22010-09-17 00:24:54 +00009655 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009656
Douglas Katzman78b37b02015-11-17 20:28:07 +00009657 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009658 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009659
9660 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009661 CmdArgs.push_back("-rpath");
9662 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009663 }
9664
Hans Wennborg70850d82013-07-18 20:29:38 +00009665 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009666 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009667 CmdArgs.push_back("-lm");
9668 }
9669
Daniel Dunbarcc912342009-05-02 18:28:39 +00009670 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009671 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009672
9673 if (!Args.hasArg(options::OPT_nolibc)) {
9674 CmdArgs.push_back("-lc");
9675 }
9676
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009677 if (Args.hasArg(options::OPT_static) ||
9678 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009679 CmdArgs.push_back("-lgcc");
9680 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009681 } else {
9682 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009683 CmdArgs.push_back("-lgcc_pic");
9684 if (!Args.hasArg(options::OPT_shared))
9685 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009686 } else {
John McCall65b8da02013-04-11 22:55:55 +00009687 CmdArgs.push_back("-lgcc");
9688 CmdArgs.push_back("--as-needed");
9689 CmdArgs.push_back("-lgcc_pic");
9690 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009691 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009692 }
9693 }
9694
Douglas Katzman78b37b02015-11-17 20:28:07 +00009695 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009696 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009697 CmdArgs.push_back(
9698 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009699 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009700 CmdArgs.push_back(
9701 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9702 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009703 }
9704
Xinliang David Li69306c02015-10-22 06:15:31 +00009705 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009706
Logan Chieneb9162f2014-06-26 14:23:45 +00009707 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009708 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009709}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009710
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009711// Try to find Exe from a Visual Studio distribution. This first tries to find
9712// an installed copy of Visual Studio and, failing that, looks in the PATH,
9713// making sure that whatever executable that's found is not a same-named exe
9714// from clang itself to prevent clang from falling back to itself.
9715static std::string FindVisualStudioExecutable(const ToolChain &TC,
9716 const char *Exe,
9717 const char *ClangProgramPath) {
9718 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9719 std::string visualStudioBinDir;
9720 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9721 visualStudioBinDir)) {
9722 SmallString<128> FilePath(visualStudioBinDir);
9723 llvm::sys::path::append(FilePath, Exe);
9724 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9725 return FilePath.str();
9726 }
9727
9728 return Exe;
9729}
9730
Douglas Katzman95354292015-06-23 20:42:09 +00009731void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9732 const InputInfo &Output,
9733 const InputInfoList &Inputs,
9734 const ArgList &Args,
9735 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009736 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009737 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009738
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009739 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9740 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009741 CmdArgs.push_back(
9742 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009743
Douglas Katzman78b37b02015-11-17 20:28:07 +00009744 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9745 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009746 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009747
Zachary Turner10d75b22014-10-22 20:40:43 +00009748 if (!llvm::sys::Process::GetEnv("LIB")) {
9749 // If the VC environment hasn't been configured (perhaps because the user
9750 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009751 // the environment variable is set however, assume the user knows what
9752 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009753 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009754 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009755 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9756 SmallString<128> LibDir(VisualStudioDir);
9757 llvm::sys::path::append(LibDir, "VC", "lib");
9758 switch (MSVC.getArch()) {
9759 case llvm::Triple::x86:
9760 // x86 just puts the libraries directly in lib
9761 break;
9762 case llvm::Triple::x86_64:
9763 llvm::sys::path::append(LibDir, "amd64");
9764 break;
9765 case llvm::Triple::arm:
9766 llvm::sys::path::append(LibDir, "arm");
9767 break;
9768 default:
9769 break;
9770 }
9771 CmdArgs.push_back(
9772 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009773
9774 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9775 std::string UniversalCRTLibPath;
9776 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9777 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9778 UniversalCRTLibPath.c_str()));
9779 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009780 }
9781
9782 std::string WindowsSdkLibPath;
9783 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9784 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9785 WindowsSdkLibPath.c_str()));
9786 }
9787
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009788 CmdArgs.push_back("-nologo");
9789
Reid Kleckner124955a2015-08-05 18:51:13 +00009790 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009791 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009793 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009794 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009795 if (DLL) {
9796 CmdArgs.push_back(Args.MakeArgString("-dll"));
9797
9798 SmallString<128> ImplibName(Output.getFilename());
9799 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009800 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009801 }
9802
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009803 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009804 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009805 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009806 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009807 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9808 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009809 // Make sure the dynamic runtime thunk is not optimized out at link time
9810 // to ensure proper SEH handling.
9811 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009812 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009813 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009814 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009815 for (const auto &Lib : {"asan", "asan_cxx"})
9816 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009817 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009818 }
9819
Hans Wennborg2e274592013-08-13 23:38:57 +00009820 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009821
Alexey Bataevc7e84352015-08-19 04:49:01 +00009822 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9823 options::OPT_fno_openmp, false)) {
9824 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9825 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9826 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9827 TC.getDriver().Dir + "/../lib"));
9828 switch (getOpenMPRuntime(getToolChain(), Args)) {
9829 case OMPRT_OMP:
9830 CmdArgs.push_back("-defaultlib:libomp.lib");
9831 break;
9832 case OMPRT_IOMP5:
9833 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9834 break;
9835 case OMPRT_GOMP:
9836 break;
9837 case OMPRT_Unknown:
9838 // Already diagnosed.
9839 break;
9840 }
9841 }
9842
Andrey Turetskiya4868572016-03-14 11:19:43 +00009843 // Add compiler-rt lib in case if it was explicitly
9844 // specified as an argument for --rtlib option.
9845 if (!Args.hasArg(options::OPT_nostdlib)) {
9846 AddRunTimeLibs(TC, TC.getDriver(), CmdArgs, Args);
9847 }
9848
Reid Kleckner337188f2014-09-16 19:22:00 +00009849 // Add filenames, libraries, and other linker inputs.
9850 for (const auto &Input : Inputs) {
9851 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009852 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009853 continue;
9854 }
9855
9856 const Arg &A = Input.getInputArg();
9857
9858 // Render -l options differently for the MSVC linker.
9859 if (A.getOption().matches(options::OPT_l)) {
9860 StringRef Lib = A.getValue();
9861 const char *LinkLibArg;
9862 if (Lib.endswith(".lib"))
9863 LinkLibArg = Args.MakeArgString(Lib);
9864 else
9865 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9866 CmdArgs.push_back(LinkLibArg);
9867 continue;
9868 }
9869
9870 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9871 // or -L. Render it, even if MSVC doesn't understand it.
9872 A.renderAsInput(Args, CmdArgs);
9873 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009874
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009875 TC.addProfileRTLibs(Args, CmdArgs);
9876
Zachary Turner719f58c2014-12-01 23:06:47 +00009877 // We need to special case some linker paths. In the case of lld, we need to
9878 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9879 // linker, we need to use a special search algorithm.
9880 llvm::SmallString<128> linkPath;
9881 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9882 if (Linker.equals_lower("lld"))
9883 Linker = "lld-link";
9884
9885 if (Linker.equals_lower("link")) {
9886 // If we're using the MSVC linker, it's not sufficient to just use link
9887 // from the program PATH, because other environments like GnuWin32 install
9888 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009889 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009890 C.getDriver().getClangProgramPath());
9891 } else {
9892 linkPath = Linker;
9893 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009894 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009895 }
9896
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009897 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009898 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009899}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009900
Douglas Katzman95354292015-06-23 20:42:09 +00009901void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9902 const InputInfo &Output,
9903 const InputInfoList &Inputs,
9904 const ArgList &Args,
9905 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009906 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9907}
9908
Douglas Katzman95354292015-06-23 20:42:09 +00009909std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009910 Compilation &C, const JobAction &JA, const InputInfo &Output,
9911 const InputInfoList &Inputs, const ArgList &Args,
9912 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009913 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009914 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009915 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009916 CmdArgs.push_back("/W0"); // No warnings.
9917
9918 // The goal is to be able to invoke this tool correctly based on
9919 // any flag accepted by clang-cl.
9920
9921 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009922 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009923
9924 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009925 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9926 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9927 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009928 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9929 if (A->getOption().getID() == options::OPT_O0) {
9930 CmdArgs.push_back("/Od");
9931 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009932 CmdArgs.push_back("/Og");
9933
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009934 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009935 if (OptLevel == "s" || OptLevel == "z")
9936 CmdArgs.push_back("/Os");
9937 else
9938 CmdArgs.push_back("/Ot");
9939
9940 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009941 }
9942 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009943 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9944 options::OPT_fno_omit_frame_pointer))
9945 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9946 ? "/Oy"
9947 : "/Oy-");
9948 if (!Args.hasArg(options::OPT_fwritable_strings))
9949 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009950
Nico Weber3f8dafb2015-03-12 19:37:10 +00009951 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009952 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9953
David Majnemerf6072342014-07-01 22:24:56 +00009954 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9955 /*default=*/false))
9956 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009957 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9958 options::OPT_fno_function_sections))
9959 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9960 ? "/Gy"
9961 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009962 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9963 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009964 CmdArgs.push_back(
9965 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009966 if (Args.hasArg(options::OPT_fsyntax_only))
9967 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009968 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9969 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009970 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009971
Nico Weber3f8dafb2015-03-12 19:37:10 +00009972 std::vector<std::string> Includes =
9973 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009974 for (const auto &Include : Includes)
9975 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009976
Hans Wennborg87cfa712013-09-19 20:32:16 +00009977 // Flags that can simply be passed through.
9978 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9979 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009980 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9981 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009982 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009983 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009984
9985 // The order of these flags is relevant, so pick the last one.
9986 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9987 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9988 A->render(Args, CmdArgs);
9989
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009990 // Pass through all unknown arguments so that the fallback command can see
9991 // them too.
9992 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9993
Hans Wennborg87cfa712013-09-19 20:32:16 +00009994 // Input filename.
9995 assert(Inputs.size() == 1);
9996 const InputInfo &II = Inputs[0];
9997 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9998 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9999 if (II.isFilename())
10000 CmdArgs.push_back(II.getFilename());
10001 else
10002 II.getInputArg().renderAsInput(Args, CmdArgs);
10003
10004 // Output filename.
10005 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010006 const char *Fo =
10007 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +000010008 CmdArgs.push_back(Fo);
10009
Hans Wennborg188382e2013-09-20 18:16:35 +000010010 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +000010011 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
10012 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +000010013 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +000010014 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +000010015}
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010016
Yaron Keren1c0070c2015-07-02 04:45:27 +000010017/// MinGW Tools
10018void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10019 const InputInfo &Output,
10020 const InputInfoList &Inputs,
10021 const ArgList &Args,
10022 const char *LinkingOutput) const {
10023 claimNoWarnArgs(Args);
10024 ArgStringList CmdArgs;
10025
10026 if (getToolChain().getArch() == llvm::Triple::x86) {
10027 CmdArgs.push_back("--32");
10028 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
10029 CmdArgs.push_back("--64");
10030 }
10031
10032 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10033
10034 CmdArgs.push_back("-o");
10035 CmdArgs.push_back(Output.getFilename());
10036
10037 for (const auto &II : Inputs)
10038 CmdArgs.push_back(II.getFilename());
10039
10040 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010041 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010042
10043 if (Args.hasArg(options::OPT_gsplit_dwarf))
10044 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
10045 SplitDebugName(Args, Inputs[0]));
10046}
10047
10048void MinGW::Linker::AddLibGCC(const ArgList &Args,
10049 ArgStringList &CmdArgs) const {
10050 if (Args.hasArg(options::OPT_mthreads))
10051 CmdArgs.push_back("-lmingwthrd");
10052 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +000010053
Yaron Kerenaa281332015-08-09 00:24:07 +000010054 // Make use of compiler-rt if --rtlib option is used
10055 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
10056 if (RLT == ToolChain::RLT_Libgcc) {
10057 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
10058 Args.hasArg(options::OPT_static);
10059 bool Shared = Args.hasArg(options::OPT_shared);
10060 bool CXX = getToolChain().getDriver().CCCIsCXX();
10061
10062 if (Static || (!CXX && !Shared)) {
10063 CmdArgs.push_back("-lgcc");
10064 CmdArgs.push_back("-lgcc_eh");
10065 } else {
10066 CmdArgs.push_back("-lgcc_s");
10067 CmdArgs.push_back("-lgcc");
10068 }
10069 } else {
10070 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
10071 }
Reid Kleckner0213a472015-07-22 16:01:38 +000010072
Yaron Keren1c0070c2015-07-02 04:45:27 +000010073 CmdArgs.push_back("-lmoldname");
10074 CmdArgs.push_back("-lmingwex");
10075 CmdArgs.push_back("-lmsvcrt");
10076}
10077
10078void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10079 const InputInfo &Output,
10080 const InputInfoList &Inputs,
10081 const ArgList &Args,
10082 const char *LinkingOutput) const {
10083 const ToolChain &TC = getToolChain();
10084 const Driver &D = TC.getDriver();
10085 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
10086
10087 ArgStringList CmdArgs;
10088
10089 // Silence warning for "clang -g foo.o -o foo"
10090 Args.ClaimAllArgs(options::OPT_g_Group);
10091 // and "clang -emit-llvm foo.o -o foo"
10092 Args.ClaimAllArgs(options::OPT_emit_llvm);
10093 // and for "clang -w foo.o -o foo". Other warning options are already
10094 // handled somewhere else.
10095 Args.ClaimAllArgs(options::OPT_w);
10096
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010097 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
10098 if (LinkerName.equals_lower("lld")) {
10099 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +000010100 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +000010101 } else if (!LinkerName.equals_lower("ld")) {
10102 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010103 }
10104
Yaron Keren1c0070c2015-07-02 04:45:27 +000010105 if (!D.SysRoot.empty())
10106 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10107
10108 if (Args.hasArg(options::OPT_s))
10109 CmdArgs.push_back("-s");
10110
10111 CmdArgs.push_back("-m");
10112 if (TC.getArch() == llvm::Triple::x86)
10113 CmdArgs.push_back("i386pe");
10114 if (TC.getArch() == llvm::Triple::x86_64)
10115 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010116 if (TC.getArch() == llvm::Triple::arm)
10117 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010118
10119 if (Args.hasArg(options::OPT_mwindows)) {
10120 CmdArgs.push_back("--subsystem");
10121 CmdArgs.push_back("windows");
10122 } else if (Args.hasArg(options::OPT_mconsole)) {
10123 CmdArgs.push_back("--subsystem");
10124 CmdArgs.push_back("console");
10125 }
10126
10127 if (Args.hasArg(options::OPT_static))
10128 CmdArgs.push_back("-Bstatic");
10129 else {
10130 if (Args.hasArg(options::OPT_mdll))
10131 CmdArgs.push_back("--dll");
10132 else if (Args.hasArg(options::OPT_shared))
10133 CmdArgs.push_back("--shared");
10134 CmdArgs.push_back("-Bdynamic");
10135 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
10136 CmdArgs.push_back("-e");
10137 if (TC.getArch() == llvm::Triple::x86)
10138 CmdArgs.push_back("_DllMainCRTStartup@12");
10139 else
10140 CmdArgs.push_back("DllMainCRTStartup");
10141 CmdArgs.push_back("--enable-auto-image-base");
10142 }
10143 }
10144
10145 CmdArgs.push_back("-o");
10146 CmdArgs.push_back(Output.getFilename());
10147
10148 Args.AddAllArgs(CmdArgs, options::OPT_e);
10149 // FIXME: add -N, -n flags
10150 Args.AddLastArg(CmdArgs, options::OPT_r);
10151 Args.AddLastArg(CmdArgs, options::OPT_s);
10152 Args.AddLastArg(CmdArgs, options::OPT_t);
10153 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
10154 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
10155
Douglas Katzman78b37b02015-11-17 20:28:07 +000010156 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010157 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
10158 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
10159 } else {
10160 if (Args.hasArg(options::OPT_municode))
10161 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
10162 else
10163 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
10164 }
10165 if (Args.hasArg(options::OPT_pg))
10166 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
10167 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
10168 }
10169
10170 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010171 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +000010172 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10173
10174 // TODO: Add ASan stuff here
10175
10176 // TODO: Add profile stuff here
10177
Douglas Katzman78b37b02015-11-17 20:28:07 +000010178 if (D.CCCIsCXX() &&
10179 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +000010180 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
10181 !Args.hasArg(options::OPT_static);
10182 if (OnlyLibstdcxxStatic)
10183 CmdArgs.push_back("-Bstatic");
10184 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10185 if (OnlyLibstdcxxStatic)
10186 CmdArgs.push_back("-Bdynamic");
10187 }
10188
10189 if (!Args.hasArg(options::OPT_nostdlib)) {
10190 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10191 if (Args.hasArg(options::OPT_static))
10192 CmdArgs.push_back("--start-group");
10193
10194 if (Args.hasArg(options::OPT_fstack_protector) ||
10195 Args.hasArg(options::OPT_fstack_protector_strong) ||
10196 Args.hasArg(options::OPT_fstack_protector_all)) {
10197 CmdArgs.push_back("-lssp_nonshared");
10198 CmdArgs.push_back("-lssp");
10199 }
10200 if (Args.hasArg(options::OPT_fopenmp))
10201 CmdArgs.push_back("-lgomp");
10202
10203 AddLibGCC(Args, CmdArgs);
10204
10205 if (Args.hasArg(options::OPT_pg))
10206 CmdArgs.push_back("-lgmon");
10207
Yaron Kerenadce68e2015-07-06 18:52:19 +000010208 if (Args.hasArg(options::OPT_pthread))
10209 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010210
10211 // add system libraries
10212 if (Args.hasArg(options::OPT_mwindows)) {
10213 CmdArgs.push_back("-lgdi32");
10214 CmdArgs.push_back("-lcomdlg32");
10215 }
10216 CmdArgs.push_back("-ladvapi32");
10217 CmdArgs.push_back("-lshell32");
10218 CmdArgs.push_back("-luser32");
10219 CmdArgs.push_back("-lkernel32");
10220
10221 if (Args.hasArg(options::OPT_static))
10222 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010223 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010224 AddLibGCC(Args, CmdArgs);
10225 }
10226
10227 if (!Args.hasArg(options::OPT_nostartfiles)) {
10228 // Add crtfastmath.o if available and fast math is enabled.
10229 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10230
10231 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10232 }
10233 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010234 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010235 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010236}
10237
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010238/// XCore Tools
10239// We pass assemble and link construction to the xcc tool.
10240
Douglas Katzman95354292015-06-23 20:42:09 +000010241void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10242 const InputInfo &Output,
10243 const InputInfoList &Inputs,
10244 const ArgList &Args,
10245 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010246 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010247 ArgStringList CmdArgs;
10248
10249 CmdArgs.push_back("-o");
10250 CmdArgs.push_back(Output.getFilename());
10251
10252 CmdArgs.push_back("-c");
10253
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010254 if (Args.hasArg(options::OPT_v))
10255 CmdArgs.push_back("-v");
10256
Robert Lytton894d25c2014-05-02 09:33:25 +000010257 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10258 if (!A->getOption().matches(options::OPT_g0))
10259 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010260
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010261 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10262 false))
10263 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010264
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010265 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010266
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010267 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010268 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010269
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010270 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010271 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010272}
10273
Douglas Katzman95354292015-06-23 20:42:09 +000010274void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10275 const InputInfo &Output,
10276 const InputInfoList &Inputs,
10277 const ArgList &Args,
10278 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010279 ArgStringList CmdArgs;
10280
10281 if (Output.isFilename()) {
10282 CmdArgs.push_back("-o");
10283 CmdArgs.push_back(Output.getFilename());
10284 } else {
10285 assert(Output.isNothing() && "Invalid output.");
10286 }
10287
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010288 if (Args.hasArg(options::OPT_v))
10289 CmdArgs.push_back("-v");
10290
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010291 // Pass -fexceptions through to the linker if it was present.
10292 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10293 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010294 CmdArgs.push_back("-fexceptions");
10295
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010296 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10297
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010298 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010299 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010300}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010301
Douglas Katzman95354292015-06-23 20:42:09 +000010302void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10303 const InputInfo &Output,
10304 const InputInfoList &Inputs,
10305 const ArgList &Args,
10306 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010307 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010308 const auto &TC =
10309 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10310 ArgStringList CmdArgs;
10311 const char *Exec;
10312
10313 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010314 default:
10315 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010316 case llvm::Triple::arm:
10317 case llvm::Triple::thumb:
10318 break;
10319 case llvm::Triple::x86:
10320 CmdArgs.push_back("--32");
10321 break;
10322 case llvm::Triple::x86_64:
10323 CmdArgs.push_back("--64");
10324 break;
10325 }
10326
10327 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10328
10329 CmdArgs.push_back("-o");
10330 CmdArgs.push_back(Output.getFilename());
10331
10332 for (const auto &Input : Inputs)
10333 CmdArgs.push_back(Input.getFilename());
10334
10335 const std::string Assembler = TC.GetProgramPath("as");
10336 Exec = Args.MakeArgString(Assembler);
10337
Justin Bognerd3371d82015-07-17 03:35:54 +000010338 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010339}
10340
Douglas Katzman95354292015-06-23 20:42:09 +000010341void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10342 const InputInfo &Output,
10343 const InputInfoList &Inputs,
10344 const ArgList &Args,
10345 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010346 const auto &TC =
10347 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10348 const llvm::Triple &T = TC.getTriple();
10349 const Driver &D = TC.getDriver();
10350 SmallString<128> EntryPoint;
10351 ArgStringList CmdArgs;
10352 const char *Exec;
10353
10354 // Silence warning for "clang -g foo.o -o foo"
10355 Args.ClaimAllArgs(options::OPT_g_Group);
10356 // and "clang -emit-llvm foo.o -o foo"
10357 Args.ClaimAllArgs(options::OPT_emit_llvm);
10358 // and for "clang -w foo.o -o foo"
10359 Args.ClaimAllArgs(options::OPT_w);
10360 // Other warning options are already handled somewhere else.
10361
10362 if (!D.SysRoot.empty())
10363 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10364
10365 if (Args.hasArg(options::OPT_pie))
10366 CmdArgs.push_back("-pie");
10367 if (Args.hasArg(options::OPT_rdynamic))
10368 CmdArgs.push_back("-export-dynamic");
10369 if (Args.hasArg(options::OPT_s))
10370 CmdArgs.push_back("--strip-all");
10371
10372 CmdArgs.push_back("-m");
10373 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010374 default:
10375 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010376 case llvm::Triple::arm:
10377 case llvm::Triple::thumb:
10378 // FIXME: this is incorrect for WinCE
10379 CmdArgs.push_back("thumb2pe");
10380 break;
10381 case llvm::Triple::x86:
10382 CmdArgs.push_back("i386pe");
10383 EntryPoint.append("_");
10384 break;
10385 case llvm::Triple::x86_64:
10386 CmdArgs.push_back("i386pep");
10387 break;
10388 }
10389
10390 if (Args.hasArg(options::OPT_shared)) {
10391 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010392 default:
10393 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010394 case llvm::Triple::arm:
10395 case llvm::Triple::thumb:
10396 case llvm::Triple::x86_64:
10397 EntryPoint.append("_DllMainCRTStartup");
10398 break;
10399 case llvm::Triple::x86:
10400 EntryPoint.append("_DllMainCRTStartup@12");
10401 break;
10402 }
10403
10404 CmdArgs.push_back("-shared");
10405 CmdArgs.push_back("-Bdynamic");
10406
10407 CmdArgs.push_back("--enable-auto-image-base");
10408
10409 CmdArgs.push_back("--entry");
10410 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10411 } else {
10412 EntryPoint.append("mainCRTStartup");
10413
10414 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10415 : "-Bdynamic");
10416
Douglas Katzman78b37b02015-11-17 20:28:07 +000010417 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010418 CmdArgs.push_back("--entry");
10419 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10420 }
10421
10422 // FIXME: handle subsystem
10423 }
10424
10425 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010426 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010427
10428 CmdArgs.push_back("-o");
10429 CmdArgs.push_back(Output.getFilename());
10430
10431 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10432 SmallString<261> ImpLib(Output.getFilename());
10433 llvm::sys::path::replace_extension(ImpLib, ".lib");
10434
10435 CmdArgs.push_back("--out-implib");
10436 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10437 }
10438
Douglas Katzman78b37b02015-11-17 20:28:07 +000010439 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010440 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10441 const char *CRTBegin;
10442
10443 CRTBegin =
10444 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10445 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10446 }
10447
10448 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010449 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010450 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10451
10452 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10453 !Args.hasArg(options::OPT_nodefaultlibs)) {
10454 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10455 !Args.hasArg(options::OPT_static);
10456 if (StaticCXX)
10457 CmdArgs.push_back("-Bstatic");
10458 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10459 if (StaticCXX)
10460 CmdArgs.push_back("-Bdynamic");
10461 }
10462
10463 if (!Args.hasArg(options::OPT_nostdlib)) {
10464 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10465 // TODO handle /MT[d] /MD[d]
10466 CmdArgs.push_back("-lmsvcrt");
10467 AddRunTimeLibs(TC, D, CmdArgs, Args);
10468 }
10469 }
10470
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010471 if (TC.getSanitizerArgs().needsAsanRt()) {
10472 // TODO handle /MT[d] /MD[d]
10473 if (Args.hasArg(options::OPT_shared)) {
10474 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10475 } else {
10476 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10477 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10478 // Make sure the dynamic runtime thunk is not optimized out at link time
10479 // to ensure proper SEH handling.
10480 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10481 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10482 ? "___asan_seh_interceptor"
10483 : "__asan_seh_interceptor"));
10484 }
10485 }
10486
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010487 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010488
Justin Bognerd3371d82015-07-17 03:35:54 +000010489 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010490}
Douglas Katzman84a75642015-06-19 14:55:19 +000010491
Douglas Katzman95354292015-06-23 20:42:09 +000010492void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10493 const InputInfo &Output,
10494 const InputInfoList &Inputs,
10495 const ArgList &Args,
10496 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010497 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010498 assert(Inputs.size() == 1);
10499 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010500 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10501 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010502
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010503 if (JA.getKind() == Action::PreprocessJobClass) {
10504 Args.ClaimAllArgs();
10505 CmdArgs.push_back("-E");
10506 } else {
10507 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10508 CmdArgs.push_back("-S");
10509 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10510 }
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010511 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010512
Douglas Katzmanf6071112015-08-03 14:34:22 +000010513 // Append all -I, -iquote, -isystem paths, defines/undefines,
10514 // 'f' flags, optimize flags, and warning options.
10515 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010516 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010517 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010518 options::OPT_f_Group, options::OPT_f_clang_Group,
10519 options::OPT_g_Group, options::OPT_M_Group,
Douglas Katzman4c125082016-03-15 16:41:31 +000010520 options::OPT_O_Group, options::OPT_W_Group,
10521 options::OPT_mcpu_EQ});
Douglas Katzman38dca882015-09-08 19:29:55 +000010522
10523 // If we're producing a dependency file, and assembly is the final action,
10524 // then the name of the target in the dependency file should be the '.o'
10525 // file, not the '.s' file produced by this step. For example, instead of
10526 // /tmp/mumble.s: mumble.c .../someheader.h
10527 // the filename on the lefthand side should be "mumble.o"
10528 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10529 C.getActions().size() == 1 &&
10530 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10531 Arg *A = Args.getLastArg(options::OPT_o);
10532 if (A) {
10533 CmdArgs.push_back("-MT");
10534 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10535 }
10536 }
10537
Douglas Katzman84a75642015-06-19 14:55:19 +000010538 CmdArgs.push_back(II.getFilename());
10539 CmdArgs.push_back("-o");
10540 CmdArgs.push_back(Output.getFilename());
10541
10542 std::string Exec =
10543 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010544 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10545 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010546}
10547
Douglas Katzman95354292015-06-23 20:42:09 +000010548void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10549 const InputInfo &Output,
10550 const InputInfoList &Inputs,
10551 const ArgList &Args,
10552 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010553 ArgStringList CmdArgs;
10554
10555 assert(Inputs.size() == 1);
10556 const InputInfo &II = Inputs[0];
10557 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10558 assert(Output.getType() == types::TY_Object);
10559
10560 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzman4c125082016-03-15 16:41:31 +000010561 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
10562 if (CPUArg)
10563 CmdArgs.push_back(
10564 Args.MakeArgString("-cv:" + StringRef(CPUArg->getValue())));
Douglas Katzman84a75642015-06-19 14:55:19 +000010565 CmdArgs.push_back("-noSPrefixing");
10566 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010567 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10568 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10569 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010570 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010571 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010572 }
10573 CmdArgs.push_back("-elf"); // Output format.
10574 CmdArgs.push_back(II.getFilename());
10575 CmdArgs.push_back(
10576 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10577
10578 std::string Exec =
10579 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010580 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10581 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010582}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010583
10584void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10585 const InputInfo &Output,
10586 const InputInfoList &Inputs,
10587 const ArgList &Args,
10588 const char *LinkingOutput) const {
10589 const auto &TC =
10590 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10591 const llvm::Triple &T = TC.getTriple();
10592 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010593 bool UseStartfiles =
10594 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010595 bool UseDefaultLibs =
10596 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010597
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010598 if (T.getArch() == llvm::Triple::sparc)
10599 CmdArgs.push_back("-EB");
10600 else // SHAVE assumes little-endian, and sparcel is expressly so.
10601 CmdArgs.push_back("-EL");
10602
10603 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10604 // but we never pass through a --sysroot option and various other bits.
10605 // For example, there are no sanitizers (yet) nor gold linker.
10606
10607 // Eat some arguments that may be present but have no effect.
10608 Args.ClaimAllArgs(options::OPT_g_Group);
10609 Args.ClaimAllArgs(options::OPT_w);
10610 Args.ClaimAllArgs(options::OPT_static_libgcc);
10611
10612 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10613 CmdArgs.push_back("-s");
10614
10615 CmdArgs.push_back("-o");
10616 CmdArgs.push_back(Output.getFilename());
10617
10618 if (UseStartfiles) {
10619 // If you want startfiles, it means you want the builtin crti and crtbegin,
10620 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010621 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10622 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010623 }
10624
10625 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10626 options::OPT_e, options::OPT_s, options::OPT_t,
10627 options::OPT_Z_Flag, options::OPT_r});
10628
Douglas Katzman674a3122015-11-18 16:24:46 +000010629 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010630
10631 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10632
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010633 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010634 if (C.getDriver().CCCIsCXX())
10635 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010636 if (T.getOS() == llvm::Triple::RTEMS) {
10637 CmdArgs.push_back("--start-group");
10638 CmdArgs.push_back("-lc");
10639 // You must provide your own "-L" option to enable finding these.
10640 CmdArgs.push_back("-lrtemscpu");
10641 CmdArgs.push_back("-lrtemsbsp");
10642 CmdArgs.push_back("--end-group");
10643 } else {
10644 CmdArgs.push_back("-lc");
10645 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010646 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010647 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010648 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010649 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10650 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010651 }
10652
10653 std::string Exec =
10654 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10655 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10656 CmdArgs, Inputs));
10657}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010658
10659void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10660 const InputInfo &Output,
10661 const InputInfoList &Inputs,
10662 const ArgList &Args,
10663 const char *LinkingOutput) const {
10664 claimNoWarnArgs(Args);
10665 ArgStringList CmdArgs;
10666
10667 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10668
10669 CmdArgs.push_back("-o");
10670 CmdArgs.push_back(Output.getFilename());
10671
10672 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10673 const InputInfo &Input = Inputs[0];
10674 assert(Input.isFilename() && "Invalid input.");
10675 CmdArgs.push_back(Input.getFilename());
10676
10677 const char *Exec =
10678 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10679 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10680}
10681
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010682static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10683 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10684 if (SanArgs.needsUbsanRt()) {
10685 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10686 }
10687 if (SanArgs.needsAsanRt()) {
10688 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10689 }
10690}
10691
10692static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10693 const JobAction &JA, const InputInfo &Output,
10694 const InputInfoList &Inputs,
10695 const ArgList &Args,
10696 const char *LinkingOutput) {
10697 const toolchains::FreeBSD &ToolChain =
10698 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10699 const Driver &D = ToolChain.getDriver();
10700 ArgStringList CmdArgs;
10701
10702 // Silence warning for "clang -g foo.o -o foo"
10703 Args.ClaimAllArgs(options::OPT_g_Group);
10704 // and "clang -emit-llvm foo.o -o foo"
10705 Args.ClaimAllArgs(options::OPT_emit_llvm);
10706 // and for "clang -w foo.o -o foo". Other warning options are already
10707 // handled somewhere else.
10708 Args.ClaimAllArgs(options::OPT_w);
10709
10710 if (!D.SysRoot.empty())
10711 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10712
10713 if (Args.hasArg(options::OPT_pie))
10714 CmdArgs.push_back("-pie");
10715
10716 if (Args.hasArg(options::OPT_rdynamic))
10717 CmdArgs.push_back("-export-dynamic");
10718 if (Args.hasArg(options::OPT_shared))
10719 CmdArgs.push_back("--oformat=so");
10720
10721 if (Output.isFilename()) {
10722 CmdArgs.push_back("-o");
10723 CmdArgs.push_back(Output.getFilename());
10724 } else {
10725 assert(Output.isNothing() && "Invalid output.");
10726 }
10727
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010728 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10729
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010730 Args.AddAllArgs(CmdArgs, options::OPT_L);
10731 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10732 Args.AddAllArgs(CmdArgs, options::OPT_e);
10733 Args.AddAllArgs(CmdArgs, options::OPT_s);
10734 Args.AddAllArgs(CmdArgs, options::OPT_t);
10735 Args.AddAllArgs(CmdArgs, options::OPT_r);
10736
10737 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10738 CmdArgs.push_back("--no-demangle");
10739
10740 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10741
10742 if (Args.hasArg(options::OPT_pthread)) {
10743 CmdArgs.push_back("-lpthread");
10744 }
10745
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010746 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10747
10748 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10749}
10750
10751static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10752 const JobAction &JA, const InputInfo &Output,
10753 const InputInfoList &Inputs,
10754 const ArgList &Args,
10755 const char *LinkingOutput) {
10756 const toolchains::FreeBSD &ToolChain =
10757 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10758 const Driver &D = ToolChain.getDriver();
10759 ArgStringList CmdArgs;
10760
10761 // Silence warning for "clang -g foo.o -o foo"
10762 Args.ClaimAllArgs(options::OPT_g_Group);
10763 // and "clang -emit-llvm foo.o -o foo"
10764 Args.ClaimAllArgs(options::OPT_emit_llvm);
10765 // and for "clang -w foo.o -o foo". Other warning options are already
10766 // handled somewhere else.
10767 Args.ClaimAllArgs(options::OPT_w);
10768
10769 if (!D.SysRoot.empty())
10770 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10771
10772 if (Args.hasArg(options::OPT_pie))
10773 CmdArgs.push_back("-pie");
10774
10775 if (Args.hasArg(options::OPT_static)) {
10776 CmdArgs.push_back("-Bstatic");
10777 } else {
10778 if (Args.hasArg(options::OPT_rdynamic))
10779 CmdArgs.push_back("-export-dynamic");
10780 CmdArgs.push_back("--eh-frame-hdr");
10781 if (Args.hasArg(options::OPT_shared)) {
10782 CmdArgs.push_back("-Bshareable");
10783 } else {
10784 CmdArgs.push_back("-dynamic-linker");
10785 CmdArgs.push_back("/libexec/ld-elf.so.1");
10786 }
10787 CmdArgs.push_back("--enable-new-dtags");
10788 }
10789
10790 if (Output.isFilename()) {
10791 CmdArgs.push_back("-o");
10792 CmdArgs.push_back(Output.getFilename());
10793 } else {
10794 assert(Output.isNothing() && "Invalid output.");
10795 }
10796
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010797 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10798
Douglas Katzman78b37b02015-11-17 20:28:07 +000010799 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010800 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010801 if (!Args.hasArg(options::OPT_shared)) {
10802 if (Args.hasArg(options::OPT_pg))
10803 crt1 = "gcrt1.o";
10804 else if (Args.hasArg(options::OPT_pie))
10805 crt1 = "Scrt1.o";
10806 else
10807 crt1 = "crt1.o";
10808 }
10809 if (crt1)
10810 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10811
10812 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10813
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010814 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010815 if (Args.hasArg(options::OPT_static))
10816 crtbegin = "crtbeginT.o";
10817 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10818 crtbegin = "crtbeginS.o";
10819 else
10820 crtbegin = "crtbegin.o";
10821
10822 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10823 }
10824
10825 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010826 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010827 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10828 Args.AddAllArgs(CmdArgs, options::OPT_e);
10829 Args.AddAllArgs(CmdArgs, options::OPT_s);
10830 Args.AddAllArgs(CmdArgs, options::OPT_t);
10831 Args.AddAllArgs(CmdArgs, options::OPT_r);
10832
10833 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10834 CmdArgs.push_back("--no-demangle");
10835
10836 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10837
Douglas Katzman78b37b02015-11-17 20:28:07 +000010838 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010839 // For PS4, we always want to pass libm, libstdc++ and libkernel
10840 // libraries for both C and C++ compilations.
10841 CmdArgs.push_back("-lkernel");
10842 if (D.CCCIsCXX()) {
10843 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10844 if (Args.hasArg(options::OPT_pg))
10845 CmdArgs.push_back("-lm_p");
10846 else
10847 CmdArgs.push_back("-lm");
10848 }
10849 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10850 // the default system libraries. Just mimic this for now.
10851 if (Args.hasArg(options::OPT_pg))
10852 CmdArgs.push_back("-lgcc_p");
10853 else
10854 CmdArgs.push_back("-lcompiler_rt");
10855 if (Args.hasArg(options::OPT_static)) {
10856 CmdArgs.push_back("-lstdc++");
10857 } else if (Args.hasArg(options::OPT_pg)) {
10858 CmdArgs.push_back("-lgcc_eh_p");
10859 } else {
10860 CmdArgs.push_back("--as-needed");
10861 CmdArgs.push_back("-lstdc++");
10862 CmdArgs.push_back("--no-as-needed");
10863 }
10864
10865 if (Args.hasArg(options::OPT_pthread)) {
10866 if (Args.hasArg(options::OPT_pg))
10867 CmdArgs.push_back("-lpthread_p");
10868 else
10869 CmdArgs.push_back("-lpthread");
10870 }
10871
10872 if (Args.hasArg(options::OPT_pg)) {
10873 if (Args.hasArg(options::OPT_shared))
10874 CmdArgs.push_back("-lc");
10875 else {
10876 if (Args.hasArg(options::OPT_static)) {
10877 CmdArgs.push_back("--start-group");
10878 CmdArgs.push_back("-lc_p");
10879 CmdArgs.push_back("-lpthread_p");
10880 CmdArgs.push_back("--end-group");
10881 } else {
10882 CmdArgs.push_back("-lc_p");
10883 }
10884 }
10885 CmdArgs.push_back("-lgcc_p");
10886 } else {
10887 if (Args.hasArg(options::OPT_static)) {
10888 CmdArgs.push_back("--start-group");
10889 CmdArgs.push_back("-lc");
10890 CmdArgs.push_back("-lpthread");
10891 CmdArgs.push_back("--end-group");
10892 } else {
10893 CmdArgs.push_back("-lc");
10894 }
10895 CmdArgs.push_back("-lcompiler_rt");
10896 }
10897
10898 if (Args.hasArg(options::OPT_static)) {
10899 CmdArgs.push_back("-lstdc++");
10900 } else if (Args.hasArg(options::OPT_pg)) {
10901 CmdArgs.push_back("-lgcc_eh_p");
10902 } else {
10903 CmdArgs.push_back("--as-needed");
10904 CmdArgs.push_back("-lstdc++");
10905 CmdArgs.push_back("--no-as-needed");
10906 }
10907 }
10908
Douglas Katzman78b37b02015-11-17 20:28:07 +000010909 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010910 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10911 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10912 else
10913 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10914 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10915 }
10916
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010917 const char *Exec =
10918#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010919 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010920#else
10921 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10922#endif
10923
10924 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10925}
10926
10927void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10928 const InputInfo &Output,
10929 const InputInfoList &Inputs,
10930 const ArgList &Args,
10931 const char *LinkingOutput) const {
10932 const toolchains::FreeBSD &ToolChain =
10933 static_cast<const toolchains::FreeBSD &>(getToolChain());
10934 const Driver &D = ToolChain.getDriver();
10935 bool PS4Linker;
10936 StringRef LinkerOptName;
10937 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10938 LinkerOptName = A->getValue();
10939 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10940 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10941 }
10942
10943 if (LinkerOptName == "gold")
10944 PS4Linker = false;
10945 else if (LinkerOptName == "ps4")
10946 PS4Linker = true;
10947 else
10948 PS4Linker = !Args.hasArg(options::OPT_shared);
10949
10950 if (PS4Linker)
10951 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10952 else
10953 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10954}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010955
10956void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10957 const InputInfo &Output,
10958 const InputInfoList &Inputs,
10959 const ArgList &Args,
10960 const char *LinkingOutput) const {
10961 const auto &TC =
10962 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010963 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010964
10965 std::vector<std::string> gpu_archs =
10966 Args.getAllArgValues(options::OPT_march_EQ);
10967 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10968 const std::string& gpu_arch = gpu_archs[0];
10969
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010970 ArgStringList CmdArgs;
10971 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Justin Lebarb41f33c2016-04-19 02:27:11 +000010972 if (Args.hasFlag(options::OPT_cuda_noopt_device_debug,
10973 options::OPT_no_cuda_noopt_device_debug, false)) {
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010974 // ptxas does not accept -g option if optimization is enabled, so
10975 // we ignore the compiler's -O* options if we want debug info.
10976 CmdArgs.push_back("-g");
10977 CmdArgs.push_back("--dont-merge-basicblocks");
10978 CmdArgs.push_back("--return-at-end");
10979 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10980 // Map the -O we received to -O{0,1,2,3}.
10981 //
10982 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10983 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010984
Justin Lebar2836dcd2016-01-19 19:52:21 +000010985 // -O3 seems like the least-bad option when -Osomething is specified to
10986 // clang but it isn't handled below.
10987 StringRef OOpt = "3";
10988 if (A->getOption().matches(options::OPT_O4) ||
10989 A->getOption().matches(options::OPT_Ofast))
10990 OOpt = "3";
10991 else if (A->getOption().matches(options::OPT_O0))
10992 OOpt = "0";
10993 else if (A->getOption().matches(options::OPT_O)) {
10994 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10995 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10996 .Case("1", "1")
10997 .Case("2", "2")
10998 .Case("3", "3")
10999 .Case("s", "2")
11000 .Case("z", "2")
11001 .Default("2");
11002 }
11003 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
11004 } else {
11005 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
11006 // to no optimizations, but ptxas's default is -O3.
11007 CmdArgs.push_back("-O0");
11008 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011009
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011010 CmdArgs.push_back("--gpu-name");
11011 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
11012 CmdArgs.push_back("--output-file");
11013 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11014 for (const auto& II : Inputs)
11015 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
11016
11017 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
11018 CmdArgs.push_back(Args.MakeArgString(A));
11019
11020 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
11021 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11022}
11023
11024// All inputs to this linker must be from CudaDeviceActions, as we need to look
11025// at the Inputs' Actions in order to figure out which GPU architecture they
11026// correspond to.
11027void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
11028 const InputInfo &Output,
11029 const InputInfoList &Inputs,
11030 const ArgList &Args,
11031 const char *LinkingOutput) const {
11032 const auto &TC =
11033 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000011034 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000011035
11036 ArgStringList CmdArgs;
11037 CmdArgs.push_back("--cuda");
11038 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
11039 CmdArgs.push_back(Args.MakeArgString("--create"));
11040 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
11041
11042 for (const auto& II : Inputs) {
11043 auto* A = cast<const CudaDeviceAction>(II.getAction());
11044 // We need to pass an Arch of the form "sm_XX" for cubin files and
11045 // "compute_XX" for ptx.
11046 const char *Arch = (II.getType() == types::TY_PP_Asm)
11047 ? A->getComputeArchName()
11048 : A->getGpuArchName();
11049 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
11050 Arch + ",file=" + II.getFilename()));
11051 }
11052
11053 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
11054 CmdArgs.push_back(Args.MakeArgString(A));
11055
11056 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
11057 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
11058}